【问题标题】:SQL injection protection mechanism in phpphp中的SQL注入保护机制
【发布时间】:2012-10-23 18:38:02
【问题描述】:

因此,通常您会从表单中收集数据并将其插入数据库。

我知道mysql_real_escape_string() 用于消除威胁,但我想提供一种机制,它接受 $_POST 并对其进行处理,以确保数据库使用安全。

实现这一目标的理想而优雅的方式是什么?简单地遍历 post 数组是否足以使数组安全?

【问题讨论】:

标签: php sql-injection


【解决方案1】:

有时你知道某些东西必须是字符串,有时你知道它必须是整数。有时您知道它必须是电子邮件地址,有时您知道它必须是 4 个字符长的字符串。

mysql 扩展当然已经被弃用了,而且已经有一段时间了。 PHP 文档说:

不建议使用此扩展来编写新代码。反而, 应使用 mysqli 或 PDO_MySQL 扩展名。另见 MySQL API 概述,在选择 MySQL API 时获得更多帮助。

PDO 是在 PHP 中使用 MYSQL 的“正确”方式。如果由于某种原因不行,请使用 mysqli。但是,只需使用 PDO。

来自文档:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>

注意,calories 是 int,color 是 string。这是一种更好的处理方式。

这与filter_var一起可以确保事情是安全的。

http://www.php.net/manual/en/filter.filters.sanitize.phphttp://www.php.net/manual/en/filter.filters.validate.php 描述了可用的不同过滤器。

【讨论】:

    【解决方案2】:

    使用 mysqli_real_escape_string 和 array_map

    $_POST = array_map('mysqli_real_escape_string', $_POST);
    

    如果你想对所有查询字符串变量做同样的事情:

    $_GET = array_map('mysqli_real_escape_string', $_GET);
    

    【讨论】:

      【解决方案3】:

      我使用这两个功能:

      function getMySQLString($string) {
          global $link;
      
          /* Si esta activaldo el magic quotes, saco los caracteres de escape */
          if (get_magic_quotes_gpc()) {
              $string = stripslashes($string);
          }
      
          /* Armo el string. */
          return mysqli_real_escape_string($link, $string);
      }
      
      
      function toSecureArray($array) {
          $result = Array();
      
          /* Recorro todas las llaves del campo */
          $keys = array_keys($array);
          foreach ($keys as $key_id => $value) {
              if (!is_array($array[$value]))
                  $result[$value] = getMySQLString($array[$value]);
          }
      
          return $result;
      }
      

      "toSecureArray" 不是递归的,你可以做得更好。 :)

      【讨论】:

      • 我个人不喜欢看到围绕 PHP
      • 你能解释一下为什么吗?由于特殊原因我不使用 PDO,我认为此代码即使对于 PHP > 5.2 版本也是有效的。
      • 当然。您的代码在语法方面很好,实际上几乎读起来就像get_magic_quotes_gpc 的 php.net 示例。但它的日期为"This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0."。我认为在某些时候你必须停止围绕两个主要版本之前消失的东西编写代码。真的 get_magic_quotes_gpc 应该 always 返回 false ,除非您的版本落后。 This 解释了 PDO 相对于 mysqli_ 的优势。
      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 2014-10-17
      • 1970-01-01
      • 2019-05-25
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多