我正在处理一个存储过程,它根据输入参数的值动态生成查询。sp使用mysql中的CONCAT()函数来构建查询。其中一个参数允许用户输入一个搜索字符串作为varchar数据类型。
mysql中是否有类似于php的mysql_real_escape_string()的功能来防止sql注入攻击?
下面是这个sp正在做什么的一个例子:
//试图张贴代码。继续被拒绝。不告诉我原因。

发布于 2017-11-01 20:26:41
关于你的评论:
我同意你的意见,但是,你如何才能根据输入在准备好的陈述中添加特定的部分。例如,如果参数_A和_B可用,那么连接两个额外的表并包含一个WHERE语句?然后知道运行准备语句的查询的哪个版本,以知道需要绑定哪些参数?
有时您必须使用有条件的代码块:
CREATE PROCEDURE MyProc(IN _A INT, IN _B INT)
BEGIN
IF _A IS NOT NULL AND _B IS NOT NULL
PREPARE stmt1 FROM 'SELECT * FROM MyTable WHERE A = ? AND B = ?';
SET @A = _A, @B = _B;
EXECUTE stmt1 USING @A, @B;
DEALLOCATE PREPARE stmt1;
ELSEIF _A IS NOT NULL
PREPARE stmt1 FROM 'SELECT * FROM MyTable WHERE A = ?';
SET @A = _A;
EXECUTE stmt1 USING @A;
DEALLOCATE PREPARE stmt1;
ELSEIF _B IS NOT NULL
PREPARE stmt1 FROM 'SELECT * FROM MyTable WHERE B = ?';
SET @B = _B;
EXECUTE stmt1 USING @B;
DEALLOCATE PREPARE stmt1;
END
END对于有条件限制和偏移的示例,您可以做得更简单。不存在来自受INT数据类型约束的输入参数的SQL注入风险。然后,您可以通过使用COALESCE()来使用一些合理的值来默认变量。
CREATE PROCEDURE MyProc(INT _quick_search VARCHAR(50),
IN _limit INT, IN _offset INT)
BEGIN
SET @LIMIT = COALESCE(_limit, 1);
SET @OFFSET = COALESCE(_offset, 0);
PREPARE stmt1 FROM 'SELECT ...blah blah... LIMIT ? OFFSET ?';
EXECUTE stmt1 USING @LIMIT, @OFFSET;
DEALLOCATE PREPARE stmt1;
END我同意@YourCommonSense的说法,即存储过程不是最好的解决方案。MySQL的存储过程实现是原始的,很难使用。我在Stack溢出上看到许多问题,询问如何在MySQL中执行存储过程中的一些任务,这让我每次都感到畏缩。
您最好使用几乎任何其他脚本语言,而不是使用MySQL存储过程。
发布于 2017-11-01 20:05:54
不要使用CONCAT()函数来构建查询。
使用。准备好了。语句。
PREPARE stmt1 FROM 'SELECT * FROM whatever WHERE something LIKE ?';
EXECUTE stmt1 USING @search_parameter;
DEALLOCATE PREPARE stmt1;https://stackoverflow.com/questions/47062748
复制相似问题