我正在使用其他人制作的数据库(我并没有真正授权更改它)。但是,当我查看数据库中的存储过程时,我注意到以下过程:
DELIMITER $$
CREATE PROCEDURE `logIn`(userName varChar(50), userPass varChar(50))
BEGIN
declare userID int;
SELECT
u.userID INTO userID
FROM
users u
WHERE
u.userName=userName
AND u.userPassword=MD5(userPass);
IF (IFNULL(uID,-1) > 0) THEN
select 1 as outMsg;
ELSE
select 0 as outMsg;
END IF;
END$$
相应的表格users
有三列:userID INT
,userName VARCHAR(50)
和userPassword VARCHAR(50)
。
由于我不是很擅长,有人可以让我知道是否需要对这种功能的输入进行消毒,以便不允许任何SQL注入,如果不是 - 为什么?一般的经验法则非常感谢。
P.S。此函数将从表单提交的JS脚本调用。
答案 0 :(得分:1)
这里有一些经验法则取决于基础数据类型以及如何将其插入数据库。
首先,参数化查询总是最适合SQL注入保护..但..如果你不能改变它..
字符串类型:
删除所有单引号 或强> 用单引号替换任何单引号两次。
将以下任何字符替换为其编码替代字符;
例如......)替换为& #X29;
- (上面示例中的空格是这样,您将看到代码,将其删除以获取“)”)
对于除字符串之外的数据类型,检查数据类型是否正确并删除不应该在数据类型中的任何字符。如果它是一个整数,请确保您传入的字符串是整数。这通常可以通过转换为代码中的类型来完成。演员将工作..或导致错误。检查数据类型min和maxes是否未超过也是很好的。例如..如果我正在检查整数,我可能会使用类似于此的代码:
var myInt = parseInt(param);
然后我可以检查它的界限,确保它小于最大整数值,然后大于最小整数值。
这应该足以防止SQL注入攻击......
并且..因为你没有发布实际与数据库接口的代码...作为一个额外的预防措施..你可能还想删除 - ,`,%,“,”,“”。
你只想让'理智'的值进入数据库调用..所以像309这样的整数没有意义,你想删除$ ..可能通过使用正则表达式替换任何非数字字符逗号和句点。 [^ [0-9。]]
要格外小心。
答案 1 :(得分:0)
是的,在尝试运行该过程之前必须对输入进行清理。
您可能希望在此处共享该过程的实际调用点以获得更多帮助,因为在表单提交上无法直接从JS调用该过程。你可能有一个Servlet,PHP页面或一些HTTP友好的中介来以某种方式调用数据库。