我们将防火墙规则(REGEX)更改为以下内容:
Name
Type
Context
Severity
Pattern
CS:select_into
signature
http-url
critical
.*\[select\]\s+.*\[into\].*
CS:select_from
signature
http-url
critical
.*\[select\]\s+.*\[from\].*
CS:insert_into
signature
http-url
critical
.*\[insert\]\s+.*\[into\].*
CS:drop_database
signature
http-url
critical
.*\[drop\]\s+.*\[database\].*
CS:drop_table
signature
http-url
critical
.*\[drop\]\s+.*\[table\].*
CS:delete_from
signature
http-url
critical
.*\[delete\]\s+.*\[from\].*
CS:drop_view
signature
http-url
critical
.*\[drop\]\s+.*\[view\].*
CS:exec
signature
http-url
critical
.*\[exec\].*(%28|\().*(%29|\)).*
CS:update_set
signature
http-url
critical
.*\[update\](%20|\+)(%20|\+|.)*\[set\].*
这会阻止所有SQL注入尝试吗?例如,是否可以使用多个空格删除视图?
答案 0 :(得分:21)
黑名单是错误的做法。总会有一些你没想过的东西,攻击者会想到这些东西。
您使用的是哪种编程语言/数据库?它们都有将参数传递给SQL语句的方法。例如:
String userName = .... ; // from your GET or POST parameter
String sql = "SELECT id FROM user where user_name=?";
ResultSet rs = executeSql(sql, userName);
请参阅http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements
答案 1 :(得分:2)
尝试通过过滤掉某些单词来防止sql注入是行不通的 - 总会有一些你错过的东西,并且尝试找到要覆盖的所有内容将非常耗时。
你应该看看你如何查询数据库这样的事情 - 如果你正在构建SQL并将客户端的值直接连接到语句中,那么这将是一个需要关注的重要领域 - 切换到使用参数化的SQL /存储过程。存储过程还将为您提供额外的安全层,因为您可以授予执行权限,而无需对基础表提供直接权限。
答案 2 :(得分:0)
您不应该使用正则表达式进行输入过滤。
在将它们提供给sql server之前,您应该逐个过滤输入。
如果你插入一个字符串(或sql语句中的撇号之间的任何东西),你应该使用你的sql server的转义函数,这将防止那里的任何攻击。
如果你的数据是某种类型的数字(整数或浮点数),那么你应该检查数据是否真的是一个数字(你不能在没有字母的情况下进行sql注入)。执行此操作的最佳方法取决于您使用的编程语言,但主要是类型检查或强制类型转换。
你永远不应该将任何不受信任的(来自用户的任何东西都是不受信任的)类似字符串的数据插入到sql statemen中,在那里你不能在它周围放置撇号,比如表或列名。
答案 3 :(得分:0)
您应确保所有SQL仅通过除应用程序明确需要的权限之外没有权限的有限权限帐户执行,而不是尝试捕获恶意SQL的所有可能的排列。