我有这样的陈述:
SELECT * FROM TABLE WHERE COLUMN = 123456
123456
由用户提供,因此它容易受到SQLi的攻击,但如果我删除所有分号和括号,黑客是否可以运行任何其他语句(如DROP,UPDATE,INSERT
等),除了{ {1}}?
我已经在使用预处理语句,但我很好奇,如果输入被删除了行终止符和括号,黑客能否以任何方式修改数据库?
答案 0 :(得分:7)
使用sql参数。试图“消毒”输入是一个非常坏主意。尝试谷歌搜索一些复杂的SQL注入片段,你不会相信黑帽子的黑客是多么有创意。
答案 1 :(得分:1)
一般来说,通过尝试删除特定字符来100%确定您是否可以避免此类攻击是非常困难的 - 有太多方法可以绕过您的代码(通过使用字符编码等)< / p>
更好的选择是将参数传递给存储过程,如下所示:
CREATE PROCEDURE usp_MyStoredProcedure
@MyParam int
AS
BEGIN
SELECT * FROM TABLE WHERE COLUMN = @MyParam
END
GO
这样,SQL会将传入的值视为参数,而不管其包含的内容。在这种情况下,它只会接受int类型的值。
如果您不想或不能使用存储过程,那么我建议您更改代码,以便输入参数只能包含预定义的字符列表 - 在本例中为数字字符。这样你可以确定该值是安全的。