消除注入危险SQL查询的可能性



有一个带参数的函数。该函数在内部调用带有该参数的存储过程。客户端可以通过HTTP请求传递字符串给函数。

我试图添加一个方法来消除通过参数注入危险SQL语句的任何可能性。方法名称是IsSQLParameterSafe(),它根据参数返回布尔值。如果该值可以安全执行,则该方法将返回true,否则返回false。

在我的例子中,参数不一定要有空格,所以如果有空格,那么它将返回false。同样,我将把输入的长度限制为64因为这是参数的最大长度。

你认为我的主意会奏效吗?如果没有,你能提出建议吗?

谢谢

您甚至可以对存储过程使用参数化查询。这是处理SQL注入风险的最佳方法。如果不知道您使用的是什么语言,就很难更具体,但是在Java中,例如,您将使用类似于这样的内容:

String callStmt = "CALL PROC(?)";
PreparedStatement prepStmt = con.prepareStatement(callStmt);
prepStmt.setString(1, parameter);
ResultSet rs = prepStmt.executeQuery();

您可能还对OWASP SQL注入预防备忘单感兴趣,其中有更详细的内容。

您不需要担心,除非您手动将SQL拼接在一起,然后使用EXEC命令执行。

例如,这是一个简单的存储过程:
CREATE PROCEDURE DeleteRecord
(
@name VARCHAR(64)
)
AS
BEGIN
DELETE FROM Records WHERE [Name] = @name
END

如果您试图将此字符串传递给过程…

name OR 1=1

…那么程序将删除0条记录,因为没有人有这个确切的名称。

为什么不删除所有内容?

存储过程不会将SQL拼接成一个大字符串(您经常在PHP初学者教程中看到这种事情)。相反,它传递原始SQL语句,然后将每个参数作为不同的实参传递。我不知道这是如何工作的技术细节,但我从经验中知道,添加斜杠、引号和乱码字符不会破坏这个查询。

但是…

如果您正在编写动态SQL,并且如果您的参数表示一个表或列名,那么您需要更加小心。我会使用白名单。

http://www.sommarskog.se/dynamic_sql.html

最新更新