如何防止SQL注入攻击的文本框
本文关键字:文本 攻击 注入 何防止 SQL | 更新日期: 2023-09-27 18:04:13
我的VB.net页面有一个文本框,它接受SQL语句并使用SQL Helper的ExecuteDataSet命令返回数据集。你认为防止诸如Delete, Truncate, Drop, Insert等语句被执行的最好方法是什么?文本框应该只接受Select语句。我正在考虑通过Javascript或通过服务器验证捕获输入字符串,但我确信有更有效的想法来做到这一点。提前谢谢。
编辑:我的文本框就像一个查询分析器,因此它接受一行SQL语句,然后根据输入的字符串首先,让我声明一下,你的设计是一个非常糟糕的主意;你正在把你的数据库暴露在巨大的风险中。
一个更好的设计是让你的用户从他们可以选择的字段列表中进行选择。这避免了允许用户键入SQL语句。
但是,如果您绝对决定这样做,那么构建一个您想要阻止的关键字数组。然后,在用户输入之后,循环遍历数组,检查是否有任何被阻止的单词。如果找到任何阻塞的单词,则不执行SQL。
这是个坏主意。你不应该这么做。
有很多方法可以做到这一点,但我通常只是使用带参数的sp_executesql编写动态sql代码。以下是来自BOL的示例。
DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
/* Build the SQL string one time.*/
SET @SQLString =
N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID
FROM AdventureWorks2008R2.HumanResources.Employee
WHERE BusinessEntityID = @BusinessEntityID';
SET @ParmDefinition = N'@BusinessEntityID tinyint';
/* Execute the string with the first parameter value. */
SET @IntVariable = 197;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@BusinessEntityID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 109;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
@BusinessEntityID = @IntVariable;
Sp_executesql允许您将参数放入动态代码中,它们就像变量一样被处理。这样,如果有人试图将代码注入到字段中,他们"注入"的代码就会存储在列中。
防止SQL注入的一种方法是避免在代码中使用动态生成的SQL。通过使用参数化查询和存储过程,就不可能对应用程序进行SQL注入。
通过传递参数可以避免许多类型的SQL注入攻击,甚至更好的保护数据库访问的方法是使用存储过程。存储过程可以通过将数据库中的对象限制为特定帐户,并允许帐户只执行存储过程来保护数据库。然后,您的代码使用这个仅具有执行存储过程访问权限的帐户进行所有数据库访问。您没有为该帐户提供任何其他权限,例如写入权限,这会允许攻击者在SQL语句中输入要对您的数据库执行的语句
按照dwwroeland的回答,如果坚持使用用户文本输入构建查询,则需要对输入进行大量筛选。
然而,与建议相反,我建议使用白名单方法:预先确定允许的关键字集合。筛选可接受的内容要比试图阻止所有不可接受的内容容易得多。
只是一个额外的注意事项:
如果您选择下拉列表方法来构造查询,您仍然需要验证这些值,因为用户仍然可以在回发之前篡改这些值,从而对数据库造成严重破坏。