-1

我有这样的声明:

SELECT * FROM TABLE WHERE COLUMN = 123456

123456由用户提供,因此它容易受到 SQLi 的攻击,但是如果我去掉所有分号和括号,黑客是否可以运行DROP,UPDATE,INSERT除 之外的任何其他语句(如等)SELECT

我已经在使用准备好的语句,但我很好奇如果输入被去掉了行终止符和括号,黑客可以以任何方式修改数据库吗?

4

2 回答 2

7

使用 sql 参数。试图“清理”输入是一个非常糟糕的主意。尝试用谷歌搜索一些复杂的 sql 注入片段,你不会相信黑帽黑客的创造力有多大。

于 2013-02-25T15:18:03.653 回答
1

一般来说,很难通过尝试去除特定字符来 100% 确定您可以免受此类攻击 - 绕过代码的方法太多(通过使用字符编码等)

更好的选择是将参数传递给存储过程,如下所示:

CREATE PROCEDURE usp_MyStoredProcedure
    @MyParam  int
AS

BEGIN
    SELECT * FROM TABLE WHERE COLUMN = @MyParam

END
GO

这样,SQL 会将传入的值视为参数,而不是其他任何内容,无论它包含什么。在这种情况下,无论如何它只会接受 int 类型的值。

如果您不想或不能使用存储过程,那么我建议您更改代码,以便输入参数只能包含预定义的字符列表 - 在这种情况下为数字字符。这样您就可以确定该值可以安全使用。

于 2013-02-25T15:25:19.527 回答