我觉得没有资格明确回答您的问题,因此请谨慎使用我提供的信息,但我在管理您可能正在查看的更改方面确实有一些经验。AFAICS 但是,如果您说的是真的,您的语句应该保护您免受 XSS 和 SQL 注入。
我最近开始了将整个大型应用程序从 mysql_ 迁移到 mysqli_ 的过程,在此过程中,我还设定了所有用户输入都应通过准备好的语句的目标。
针对 YC 的以下公平评论进行编辑:为避免歧义,我总是将用户通过准备好的语句生成的任何内容放入其中,即使它已经存储在数据库中。我尽可能避免使用重新插入用户数据,因为它不可靠,因此系统功能往往依赖于自动生成的索引。
平心而论,页面很短(不超过 1000 行),因此修复每个页面不需要很长时间,并且它们几乎没有查询,因此性能下降并不明显,而且自从我编写原始代码以来,服务器技术的改进肯定会吃掉. 我怀疑您会发现转义等的减少将远远超过对准备语句的任何性能影响,尽管您必须检查它是否至关重要。
在进行这次审查时,我在我的代码中发现了多少漏洞,这让我感到沮丧(我在编写代码时尽可能地包含了安全性,并为自己设置了与你的规则大致相同的规则),最终我发现需要重写大代码块以提高安全性。由于更丰富的经验和代码调整,性能也显着提高。
我要进行更改的方式是将 mysqli 连接添加到我的数据库头文件。所有新代码都使用它。当我找到时间时,我正在更新旧代码并使用没有旧 mysql 连接的头文件测试每个页面。在开发环境中以这种方式找到你错过的部分非常快,这可能是一种很好的利用时间的方法,否则会浪费时间,因为每个页面只需几分钟即可更新,因此可以在大脑衰退期间完成期间。
关于二阶注入 BTW 的注释,因为这是我内置的最常见的漏洞:
大多数 SQL 注入预防都假设注入攻击只会在登录时发生,来自恶意的非注册用户,一旦被挫败将永远不会返回,并且注册用户是可以信任的。不是这样。
可以想象,代码可以通过您的保护注入,然后再使用。这不太可能奏效,因为它严重依赖于笨拙的数据库和应用程序设计,但世界上一些最聪明的人是黑客。为什么要让他们的生活更轻松?
如果您的 sql 很简单并且您的应用程序使用先前从数据库中获得的数据进行任何子查询,则攻击的可能性更大。请记住
' OR 1=1 gets converted to
\' OR 1=1 by mysql_real_escape_string but is stored as
' OR 1=1 in the db
因此,如果检索并放入 PHP 变量中,然后在 sql 查询中未转义使用该变量,则它可能会导致问题,就像它从未被转义一样。如果您只对所有查询使用 prep 语句,则风险会永久消失,但请记住 prep 语句仍将存储恶意代码,因此当您下次需要使用已输入的数据时,您仍然必须再次使用准备好的语句。
这个博客给出了一个体面的讨论和例子,所以我不会进一步扩展,但是如果你确保所有用户输入数据都通过准备好的语句传递,如果它被用作查询的一部分,即使它已经存储在db,你应该是安全的。
冒着重复的风险,对OWASP 站点变得非常友好也是值得的,该站点具有有价值的安全讨论。