对存储的MySQL数据库过程的输入进行消毒

时间:2012-12-17 11:54:29

标签: mysql sanitization

我正在使用其他人制作的数据库(我并没有真正授权更改它)。但是,当我查看数据库中的存储过程时,我注意到以下过程:

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 INTuserName VARCHAR(50)userPassword VARCHAR(50)

由于我不是很擅长,有人可以让我知道是否需要对这种功能的输入进行消毒,以便不允许任何SQL注入,如果不是 - 为什么?一般的经验法则非常感谢。

P.S。此函数将从表单提交的JS脚本调用。

2 个答案:

答案 0 :(得分:1)

这里有一些经验法则取决于基础数据类型以及如何将其插入数据库。

首先,参数化查询总是最适合SQL注入保护..但..如果你不能改变它..

字符串类型:

  1. 删除所有单引号 用单引号替换任何单引号两次。

  2. 将以下任何字符替换为其编码替代字符;

    • >
    • <
    • (第34章)
    • 例如......)替换为& #X29;

      - (上面示例中的空格是这样,您将看到代码,将其删除以获取“)”)

  3. 对于除字符串之外的数据类型,检查数据类型是否正确并删除不应该在数据类型中的任何字符。如果它是一个整数,请确保您传入的字符串是整数。这通常可以通过转换为代码中的类型来完成。演员将工作..或导致错误。检查数据类型min和maxes是否未超过也是很好的。例如..如果我正在检查整数,我可能会使用类似于此的代码:

    var myInt = parseInt(param);

    然后我可以检查它的界限,确保它小于最大整数值,然后大于最小整数值。

    这应该足以防止SQL注入攻击......

    并且..因为你没有发布实际与数据库接口的代码...作为一个额外的预防措施..你可能还想删除 - ,`,%,“,”,“”。

    你只想让'理智'的值进入数据库调用..所以像309这样的整数没有意义,你想删除$ ..可能通过使用正则表达式替换任何非数字字符逗号和句点。 [^ [0-9。]]

    要格外小心。

答案 1 :(得分:0)

是的,在尝试运行该过程之前必须对输入进行清理。

您可能希望在此处共享该过程的实际调用点以获得更多帮助,因为在表单提交上无法直接从JS调用该过程。你可能有一个Servlet,PHP页面或一些HTTP友好的中介来以某种方式调用数据库。