3

在阅读了几篇关于 PDO 和 MySQLi 准备语句的文章之后,也已经阅读了 stackoverflow.com 上关于准备语句和 SQL 注入的数十个问题,人们都说正确使用准备语句,不再需要逃避用户的条目,但是我想我仍然担心有安全问题。

第一个问题: 如果我仍然使用 reg-exp 清理条目并在我准备好的语句中使用它们之前转义,这是否就像我超越了它?

第二个问题: 如果准备好的语句正在做有关 SQL 注入的工作-来自人们的评论和答案-为什么仍然存在受损的数据库以及越来越多的关于信用卡号码和密码的暴露数据,甚至来自“大”和好的被黑帐户- 知名网站?这是否意味着单独的准备好的陈述不是那么免疫,或者它是一个完全不同的话题?

4

3 回答 3

2

如果我仍然使用 reg-exp 清理条目并在我准备好的语句中使用它们之前转义,这是否就像我正在超越它?

  • 如果您在 SQL 中删除具有特殊含义的字符,因为它们在 SQL 中具有特殊含义,那么这是一种浪费(并导致错误地存储 O'Donnell 女士的姓氏)
  • 如果您要转义这些字符,那么您将获得双重编码,这很糟糕,因为您最终会(例如)发送以Dear Ms. O\'Donnell,开头的电子邮件。
  • 如果您确保某个日期是一个合理的日期,那么这只是对数据完整性的合理保护。

如果准备好的语句正在做有关 SQL 注入的工作 - 来自人们的评论和答案 - 为什么仍然存在受损的数据库以及越来越多的关于信用卡号码和密码的暴露数据,甚至来自“大”和知名网站的被黑帐户? 这是否意味着单独的准备好的陈述不是那么免疫,或者它是一个完全不同的话题?

因为:

  • 不是每个人都使用准备好的语句
  • 不是每个使用它们的人都正确使用它们
  • 数据库可以通过其他媒介受到攻击(例如 Web 服务器中的远程代码执行漏洞或对管理员用户的 SSH 帐户的暴力攻击)。
于 2013-05-10T11:35:23.373 回答
2
  1. 双重转义是错误的,您不需要它。您只需要传递变量 PDO 将负责休息。

  2. 攻击站点可以通过多种方式进行。人们并不总是使用准备好的语句。可能有很多攻击,例如 XSS、CSRF,攻击者可能会尝试专注于服务器配置。

    基本上,您需要处理可能放入数据库的每个变量

攻击者很聪明,他们试图找到进入数据库的原始方法。例如,他们可以将 xss 放在请求的浏览器标头中,如果您在管理面板中使用显示浏览器 xss 可能有效的统计信息!这就是为什么处理输入如此重要的原因。PDO 很好地完成了这项工作。

为确保一切正常,您应该问自己一个问题:

  1. 数据是不是我得到了我想要的数据?(使用 preg_match)为此。
  2. 它是否逃脱了 xss、csrf、sql 注入?
  3. 看看服务器的 php 和 mysql 配置,有时脚本被其他东西保护,忘记保护了。
  4. PDOStatement::bindValue()有一个名为data_type的参数使用它。如果您想要字符串,请使用PDO::PARAM_STR if int PDO::PARAM_INT等。

来自php手册的报价:

调用 PDO::prepare() 和 PDOStatement::execute() 为将使用不同参数值多次发出的语句通过允许驱动程序协商查询计划的客户端和/或服务器端缓存来优化应用程序的性能和元信息,并通过消除手动引用参数的需要来帮助防止 SQL 注入攻击。

于 2013-05-10T11:40:32.727 回答
2
  1. 如果您这样做只是针对 sql 安全性-是的,它明显且无用的矫枉过正。
  2. 是的当然。事实上,本机准备好的语句只涵盖了一小部分情况,对其他人没有安全感。

尽管如此,一般来说,准备好的声明的想法是一个绝妙的想法 - 因此,开发人员必须自己处理其他情况。

这是我的解决方案-为所有内容提供占位符的库,而不仅仅是两种标量数据类型

于 2013-05-10T11:41:39.863 回答