我看到这里有很多关于如何清理数据的讨论。是否可以像将这个重写规则添加到 .htaccess 一样简单?
RewriteRule ^([\w\-]+)$ index.php?page=$1
据我了解,这将只允许字母、数字、_ 和 - 在 1 美元中,对吗?
如果您将准备好的语句添加到 SQL 查询的这种用法中,那应该是很好的证明,对吗?
不知何故,感觉太容易让人难以置信,我是否遗漏了什么,有什么方法可以巩固它?
如果您将准备好的语句添加到 SQL 查询的这种用法中,那应该是很好的证明,对吗?
不是真的,因为您的规则对于大多数用例来说太严格了。以字符串输入中的元音变音为例。您需要为某些输入允许一些非 ASCII 字符。此类数据在 URL 中进行了百分比编码,因此您必须开始过滤掉某些字符,即使这样也对安全性毫无用处。除了数据库注入之外,还有很多很多的攻击媒介。
对于所有这些危险,没有“一刀切”的卫生方法。对于每种情况(在文件名中使用;在 HTML 输出中;在 Javascript 输出中;在电子邮件中......),都有一种正确的方法。在 Web 服务器级别过滤掉“无效”字符实际上并不实用——为了获得完美的安全性,您必须在 Apache 语法中重新创建所有这些特定的清理功能,这几乎是不可能的。
如果您想在 Web 服务器级别进行操作,您可能需要使用类似mod_security的东西进行调查。这将有助于减轻一些攻击——但最终级别的防御必须在 PHP 本身内完成。总会有一种攻击被 Web 服务器认为“很好”,但会导致您的应用程序混乱。无论您如何很好地锁定查询参数以防止注入漏洞,您都会错过一些东西。
那么,当您可以mysql_real_escape_string()
在 PHP 中执行一个简单的操作并在其中捕获所有内容时,为什么还要浪费数小时/数天的时间来提出完美的 RewriteRule 呢?