【问题标题】:How do i secure this PHP script?我如何保护这个 PHP 脚本?
【发布时间】:2011-03-31 22:38:52
【问题描述】:

我很担心sql注入,那我该如何预防呢? 我正在使用这个脚本,但有几个人告诉我它非常不安全,如果有人可以通过告诉我它有多棒来提供帮助:)。

源代码:

if(isset($_POST['lastmsg']))
{
$lastmsg=$_POST['lastmsg'];
$result=mysql_query("SELECT * FROM updates WHERE item_id<'$lastmsg' ORDER BY item_id DESC LIMIT 16");
$count=mysql_num_rows($result);
while($row=mysql_fetch_array($result))
{
$msg_id=$row['item_id'];
$message=$row['item_content'];

【问题讨论】:

  • $lastmsg 是数值吗?

标签: php security sql-injection


【解决方案1】:

永远不要将来自用户($_POST$_GET)的信息直接放入查询中。如果它们是数字,总是先用(int)$varintval($var) 将它们转换为整数;如果它们是字符串,请始终使用 mysql_real_escape_string() 转义它们。

阅读http://us2.php.net/mysql_real_escape_string 并使用它。

【讨论】:

  • 注意:确保你使用mysql_real_escape_string而不是mysql_escape_string
【解决方案2】:
$lastmsg = intval($_POST['lastmsg']);

【讨论】:

  • 这是本例中的正确答案。检查失败的intval 会很好,否则它将默认为0,这可能会产生意想不到的后果
  • 欢迎编辑 :) 感谢您的建议。是的,他应该检查它是否 > 0。
【解决方案3】:

最好的解决方案是迁移到 mysqli_ 或 PDO 并为您的查询使用准备好的语句。

【讨论】:

    【解决方案4】:

    确保在您的 PHP 配置 (PHP.ini) 中禁用了 magic_quotes_gpc 指令。

    如果 lastmsg 是一个字符串并且您使用的是 mysql,请执行以下操作:

    $lastmsg = mysql_real_escape_string($_POST['lastmsg']);    
    

    如果 lastmsg 是一个字符串并且您的 DBMS 没有本机转义函数,请执行以下操作:

    $lastmsg = addslashes($_POST['lastmsg']);
    

    如果 lastmsg 应该是一个数字,请检查它并且不要进行任何转义。您可以使用函数is_numeric(),然后使用intval() 将数字字符串转换为整数。

    【讨论】:

      【解决方案5】:

      你可以简单地添加这个:

      $lastmsg=addslashes($_POST['lastmsg']);
      

      对于更大的规模,您可以使用更强大的解决方案,这是您可以使用的功能

      function escape_value($value) {
          $magic_quotes_active = get_magic_quotes_gpc();
          $new_php = function_exists("mysql_real_escape_string");
          if ($new_php){
              if ($magic_quotes_active){
                  $value = stripslashes($value);
                  }
              $value = mysql_real_escape_string($value);
          } else {
              if(!$magic_quotes_active) { $value = addslashes($value); }
          }
          return trim($value);
      }
      

      mysql_real_escape_string 并不总是可用,所以这里有一个解决方法

      【讨论】:

      • addslashes 不是正确的选择。您需要使用mysql_real_escape_string() 来防止注入。见stackoverflow.com/questions/3473047/…
      • 引用 PHP 文档:“强烈建议使用 DBMS 特定的转义函数(例如 MySQL 的 mysqli_real_escape_string())”
      猜你喜欢
      • 2023-03-14
      • 2014-10-10
      • 2011-04-23
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多