代码之家  ›  专栏  ›  技术社区  ›  Kiada

如何保护此代码不受SQL注入的影响?有点困惑

  •  2
  • Kiada  · 技术社区  · 15 年前

    我已经阅读了各种源代码,但我不确定如何将它们实现到我的代码中。我想知道是否有人能帮我一把?一旦我在我的代码中演示了如何做一次,我就可以拿起它了!这是我在网上找到的一个Ajax自动完成函数,尽管我看到了与它有关的一些事情,因为它容易受到由于‘%querystring%’或其他原因而导致的SQL注入的攻击?任何帮助都非常感谢!

    if ( isset( $_POST['queryString'] ) )
    {
      $queryString = $_POST['queryString'];
      if ( strlen( $queryString ) > 0 )
      {
        $query = "SELECT game_title, game_id FROM games WHERE game_title LIKE '%$queryString%' || alt LIKE '%$queryString%' LIMIT 10";
        $result = mysql_query( $query, $db ) or die( "There is an error in database please contact support@laglessfrag.com" );
        while ( $row = mysql_fetch_array( $result ) )
        {
          $game_id = $row['game_id'];
          echo '<li onClick="fill(\'' . $row['game_title'] . '\',' . $game_id . ');">' . $row['game_title'] . '</li>';
        }
      }
    }
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   Anthony Forloney    15 年前

    注入漏洞是您将用户提供的数据直接传递到查询中而不进行清理。尤其是,这一行有问题:

    $queryString = $_POST['queryString'];  
    

    如果你使用这个函数 mysql_real_escape_string() 围绕 $_POST['queryString'] ,这将阻止用户插入自己的代码。

    $queryString = mysql_real_escape_string($_POST['queryString']); 
    
        2
  •  1
  •   Yacoby    15 年前

    使用 mysql_real_escape_string() 在将值连接到查询字符串之前,对来自不受信任源的所有值。(作为一般规则,如果不将值硬编码到查询字符串中,则对其进行转义)。例如:

    $queryString = mysql_real_escape_string($_POST['queryString']);
    $query =  "SELECT game_title, game_id "
            . "FROM games "
            . "WHERE game_title LIKE '%".$queryString."%'" 
            . "|| alt LIKE '%".$queryString."%' "
            . "LIMIT 10";
    

    使用支持准备好的语句的MySQL适配器通常更容易,这使得忘记清理输入变得更加困难。例如,php有 pdo mysqli