Как я могу защитить этот код от SQL-инъекций? Немного запутался - PullRequest
2 голосов
/ 31 марта 2010

Я читал различные источники, но я не уверен, как внедрить их в мой код. Мне было интересно, может ли кто-нибудь помочь мне с этим? Как только мне покажут, как это сделать в моем коде, я думаю, что смогу это сделать! Это из автозаполнения AJAX, который я обнаружил в сети, хотя я видел, что он как-то связан с уязвимостью для SQL-инъекций из-за '% $ queryString%' или чем-то еще? Любая помощь очень ценится!

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 ]

7 голосов
/ 31 марта 2010

Уязвимость внедрения заключается в том, что вы передаете пользовательские данные прямо в запрос без его очистки. В частности, эта строка проблематична:

$queryString = $_POST['queryString'];  

Если вы используете функцию mysql_real_escape_string() вокруг $_POST['queryString'], это лишит пользователей возможности вставлять свой собственный код.

* +1007 *
1 голос
/ 31 марта 2010

Используйте 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

...