我希望通过SQL注入保护我的WordPress博客。
我有很多PHP自定义页面,其中包含对数据库和自定义非wordpress表的查询。
我知道我可以使用2种方法:
1)MySQLi或PDO用于预处理语句和参数化查询。
2)htaccess规则如下:
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
RewriteRule ^(.*)$ - [F,L]
使用htaccess方法非常简单快捷。使用它有缺点吗?
答案 0 :(得分:0)
正如我所看到的,你将自己认为有害的东西列入黑名单。我不相信,因为可能会有遗忘或其他可能在将来开放的违规行为,您将不记得将其添加到文件中。
更好的方法是将您知道的内容列入白名单,但我不知道是否可以在htaccess中使用。
我认为理想的方法是评论中的建议。使用为PDO准备的语句或mysqli_real_escape_string()
和/或settype()
用于mysqli扩展。
答案 1 :(得分:0)
使用准备好的声明是阻止网站 SQL注入的最佳解决方案,因为正如您所说的那样 您可以使用 htacess 属性,但这不是保护您的网站免受SQL注入的最佳方式。 htacess 仅有助于保护基于URL的注入,但通过使用预备语句,它将帮助您防止所有类型的SQL注入
完成此操作后
您还可以使用pentesterking.com
测试您的网站安全性或漏洞答案 2 :(得分:0)
你htaccess可能会阻止某些可用于sql注入的查询,但是无法判断它是否会在所有情况下都成功 - 而且很可能不会。
对于准备好的陈述,另一方面,您将知道所使用的变量肯定是被转义的。
htaccess规则甚至可能阻止有效输入,例如如果您有一个维护SQL代码的应用程序,并且您希望允许用户搜索查询,那么查询包含您在htaccess中过滤的字符串可能是完全有效的。
为此目的使用htaccess规则很难维护,容易出错,最糟糕的是,如果你查看代码,你永远无法确定传递给查询的变量是否有害。您将始终需要检查所有可能的方法,以便使用变量,并检查它是否以任何方式被修改,可能导致任何恶意。
准备好的语句和任何其他验证方法的想法是尽可能地使用它们。这是保持代码可维护性的唯一方法,因为您只需要查看一小部分代码来检查代码是否有效。