1

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

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 注入,如果不是 - 为什么?一般的经验法则将不胜感激。

PS 此函数将在表单提交时从 JS 脚本调用。

4

2 回答 2

1

这里有一些经验法则,它们取决于底层数据类型以及它是如何插入到数据库中的。

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

字符串类型:

  1. 删除任何单引号 将任何单引号替换为单引号两次。

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

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

      -(上面示例中的空格是为了让您看到代码,删除它以获得“)”)

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

var myInt = parseInt(param);

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

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

而且..由于您尚未发布实际与数据库交互的代码...作为额外的预防措施..您可能还想删除--,`,%,",", ""。

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

要格外小心。

于 2012-12-17T12:25:42.833 回答
0

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

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

于 2012-12-17T11:56:34.800 回答