【问题标题】:PHP function to sanitise data and prevents SQL injection [duplicate]用于清理数据并防止 SQL 注入的 PHP 函数
【发布时间】:2019-03-24 03:16:55
【问题描述】:

我通常使用以下函数来清理我的表单输入并获取值。但这突然停止工作,并且了解 get_magic_quotes_gpc() 功能已从 PHP 5.4 版本中删除。并且无法再启用或配置它,它被永久设置为“关闭”。现在我正在使用 PHP 5.6,有人可以建议我使用这样的函数来清理数据并防止 SQL 注入。

function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

【问题讨论】:

  • 我强烈建议在 PDO 上下文中使用准备好的语句,并从 mysql_* 函数继续。此外,mysql_* 在 PHP 7 中也被删除,只留下 PDO 和 mysqli_*。
  • get_magic_quotes_gpc 这是一个倒退,我记得那些日子。最好避免魔术引号。 5.4.0 Always returns FALSE because the magic quotes feature was removed from PHP. - php.net/manual/en/function.get-magic-quotes-gpc.php
  • 由于魔术引号被删除,你可以摆脱if,基本上剩下mysql_real_escape_string()。但这个 API 在 PHP 7 中也已被弃用和删除。由于对 PHP 5 的支持将在今年年底结束,这将是迁移到 PHP 7 和 PDO 的好时机。
  • 我真的无法抗拒这种冲动。这让我想起了 gieco 的广告“你住在岩石下吗”,并想象当那个人从岩石下跳出来看着广告牌时。还有广告牌上写着“还在使用魔术引号?”

标签: php function sql-injection sanitization


【解决方案1】:

mysql_real_escape_string 选项仅适用于旧版本 PHP 上的遗留代码,并且如果您不考虑升级 MySQL 版本。

function clean($str) {
    $str = @trim($str);
    return mysql_real_escape_string($str);
}

推荐: 将 MySQL 版本升级到最新版本。 使用参数化查询/准备语句。 Here 你会发现有用的讨论。

【讨论】:

    【解决方案2】:

    如果你不使用 PDO(强烈推荐使用),你应该使用mysqli_* 函数。在其中你有mysqli_real_escape_string() 功能来清理用户输入。您还可以使用utilize filter_var() 函数来过滤输入。

    【讨论】:

      【解决方案3】:

      我强烈建议升级到 php7.2

      不过,为了回答你的问题,使用 htmlspecialchars() 函数会将特殊字符转换为 html。

      http://php.net/manual/en/function.htmlspecialchars.php

      示例 htmlspecialchars()

      <?php
      $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
      echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
      ?>
      

      虽然使用 htmlentities() 更为常见,因为它会转换更广泛的字符。

      http://php.net/manual/en/function.htmlentities.php

      示例 htmlentities()

      <?php
      $str = "A 'quote' is <b>bold</b>";
      
      // Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
      echo htmlentities($str);
      
      // Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
      echo htmlentities($str, ENT_QUOTES);
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 1970-01-01
        相关资源
        最近更新 更多