【问题标题】:Should I sanitize EVERY form variable passed along?我应该清理传递的每个表单变量吗?
【发布时间】:2010-06-09 13:22:40
【问题描述】:

我有一个包含许多字段的表单...

动作设置为查询mysql的php页面...

我应该用mysql_real_escape_string 对每个变量进行消毒吗? 或者我可以忽略清理下拉列表和收音机吗?

另外,除了mysql_real_escape_string,我还应该做些什么来防止攻击?

谢谢

【问题讨论】:

    标签: php sql mysql database security


    【解决方案1】:

    您还必须检查选择和单选按钮。任何人都可以创建自己的 HTML 表单并将其发布到您的脚本中。 Firefox 扩展 Web Developer Toolbar 甚至提供将选择转换为文本输入的选项。

    您还可以检查发布的数据是否仅包含正确的值。例如,如果您有一个单选按钮,请确保发布的表单仅包含一个有效值。

    你当然应该只对你要放入 MySQL 的变量运行 mysql_real_escape_string。如果保存到文件,在命令行或其他任何地方使用,还有更合适的功能和解决方案。

    【讨论】:

    • 记住 mysql_real_escape_string 只有在结果 sql 语句中转义值由单引号分隔时才能安全使用。更好的是:忘记字符串转义,只使用绑定的 sql 参数。
    【解决方案2】:

    一般来说,在浏览器之外形成一个 POST 请求并绕过下拉列表(例如)可能对可能值施加的任何限制是微不足道的。

    因此,您应该始终将用户数据视为恶意且容易出错,并在服务器端尽可能多地进行验证和保护。

    【讨论】:

      【解决方案3】:

      又是一堆无知的答案。卡姆兰,你像磁铁一样吸引它。

      您必须了解 mysql_real_escape_string 与表单和收音机无关,与检查和清理无关。
      而且它不能防止攻击。

      它只是一个字符串转义函数。它将要插入到 SQL 查询字符串中的数据作为字符串数据进行转义。

      SQL 查询是一个小程序。使用它自己的语法。您必须遵循该语法,不是因为“攻击”,而是因为它只是一种语法。而且,当然,这些规则不依赖于数据来源!单选按钮、html 表单或浏览器 - 都无关紧要!

      而且它只适用于字符串。不是数字也不是标识符。

      这是我关于如何处理 SQL 查询的答案: In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?

      【讨论】:

        【解决方案4】:

        从客户端发送的任何变量都不能被认为是安全有效的。如果您在查询中使用它们,则应始终对其进行清理。

        【讨论】:

        • 不是从客户端发送的变量怎么办?
        【解决方案5】:

        在 SQL 语句中使用字符串之前,只需使用mysql_real_escape_string 进行转义,以防止 SQL 注入攻击。

        此外,当从数据库中取出数据并以 HTML 格式写出时,您应该考虑使用htmlspecialcharsstrip_tags 来防止跨站点脚本攻击。

        【讨论】:

        • 我认为最好使用 htmlspecialchars()。 strip_tags 并不总是按预期工作。
        • htmlspecialchars 和 mysql_real_escape_string 在任何情况下都不能起到灵丹妙药的作用,请参阅stackoverflow.com/questions/110575/…
        【解决方案6】:

        您只需清理不希望攻击者劫持的字段。数据可以来自任何来源,而不仅仅是您的页面。 mysql_real_escape_string 适用于将连接到查询中的任何值,但我会“清理”所有内容。对我来说,“清理”不仅仅意味着处理注入攻击,它还包括任何字段验证(字符串长度、数字、有效日期、空等)。

        【讨论】:

          猜你喜欢
          • 2012-12-10
          • 2013-12-25
          • 1970-01-01
          • 2010-11-18
          • 2019-04-28
          • 1970-01-01
          • 1970-01-01
          • 2015-12-10
          • 1970-01-01
          相关资源
          最近更新 更多