筛选括号和分号时的SQL注入

筛选括号和分号时的SQL注入,sql,sql-server,sql-injection,Sql,Sql Server,Sql Injection,我有这样一句话: SELECT * FROM TABLE WHERE COLUMN = 123456 CREATE PROCEDURE usp_MyStoredProcedure @MyParam int AS BEGIN SELECT * FROM TABLE WHERE COLUMN = @MyParam END GO 123456由用户提供,因此易受SQLi攻击,但如果我去掉所有分号和括号,黑客是否可以运行除SELECT之外的任何其他语句(如DROP、UPDATE

我有这样一句话:

SELECT * FROM TABLE WHERE COLUMN = 123456
CREATE PROCEDURE usp_MyStoredProcedure
    @MyParam  int
AS

BEGIN
    SELECT * FROM TABLE WHERE COLUMN = @MyParam

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


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

使用sql参数。试图“净化”输入是一个极其糟糕的主意。试着用谷歌搜索一些复杂的sql注入代码片段,你不会相信黑帽黑客的创造力有多大。

一般来说,很难100%确定你通过删除特定的字符来避免这种类型的攻击——绕过代码的方法太多了(通过使用字符编码等)

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

SELECT * FROM TABLE WHERE COLUMN = 123456
CREATE PROCEDURE usp_MyStoredProcedure
    @MyParam  int
AS

BEGIN
    SELECT * FROM TABLE WHERE COLUMN = @MyParam

END
GO
这样,SQL将把传入的值作为一个参数处理,而不管它包含什么,都不会处理其他任何内容。在这种情况下,它只接受int类型的值


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

为什么要担心?只需使用准备好的语句、存储过程或平台提供的任何机制。SQL注入是一个已解决的问题。不要为自己制造工作和压力。MSDN上有一个很好的页面:分号不是必需的语句分隔符。如果他们提供
123456 UPDATE FOO SET Bar=12
,这将起作用。@单击常见问题解答中的“向上投票:
您应该只根据您面临的实际问题提出实际的、可回答的问题”。闲聊的、开放式的问题会降低我们网站的实用性,并将其他问题从头版推下。
。虽然我承认这是一个边缘问题,因为它是可以回答的,但我认为这不是你面临的问题,(b)实际上是非常开放的。因此,投票关闭。黑客可以以任何方式修改数据库吗?即使答案是否定的,你也将自己暴露在信息盗窃的风险之下,这可能同样糟糕。想想创造性的联合查询。你不必使用存储过程,你可以只使用参数化查询。我想这是真的,但如果输入来自用户,那么我假设他正在创建一个动态sql语句,然后将其传递给sql server执行,在这种情况下,存储过程将是(至少对我而言)更好的选择。