2012-05-07 3 views
-6

Можно создать дубликат: How to include a PHP variable inside a mysql insert statementКак использовать эту функцию

Как я могу использовать эту функцию, чтобы очистить переменную, которая извлекается из URL? Предположим, что у меня есть переменная $id, которая извлекается из «www.mydomain.com/single-page?id=534», и я хочу сделать ее защищенной, прежде чем использовать ее в инструкции выбора MySQL.

<?php 
    class SecureSqlInjection 
    { 
     function specificData($val) 
     { 
      $val = htmlspecialchars(stripslashes(trim($val))); 
      $val = str_ireplace("script", "blocked", $val); 
      $val = mysql_escape_string($val); 
      return $val; 
     } 

     function secureSuperGlobalGET(&$value, $key) 
     { 
      if(!is_array($_GET[$key])) 
      { 
       $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key])); 
       $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]); 
       $_GET[$key] = mysql_real_escape_string($_GET[$key]); 
      } 
      else 
      { 
       $c=0; 
       foreach($_GET[$key] as $val) 
       { 
        $_GET[$key][$c] = mysql_real_escape_string($_GET[$key][$c]); 
        $c++; 
       } 
      } 
      return $_GET[$key]; 
     } 

     function secureSuperGlobalPOST(&$value, $key) 
     { 
      if(!is_array($_POST[$key])) 
      { 
       $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key])); 
       $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]); 
       $_POST[$key] = mysql_real_escape_string($_POST[$key]); 
      } 
      else 
      { 
       $c=0; 
       foreach($_POST[$key] as $val) 
       { 
        $_POST[$key][$c] = mysql_real_escape_string($_POST[$key][$c]); 
        $c++; 
       } 
      } 
      return $_POST[$key]; 
     } 

     function secureGlobals() 
     { 
      array_walk($_GET, array($this, 'secureSuperGlobalGET')); 
      array_walk($_POST, array($this, 'secureSuperGlobalPOST')); 
     } 
    } 
?> 
+0

Ух ... используя супер-глобалы для ваших собственных данных ... – Tibor

+1

В чем ваш вопрос? [so] ** не ** инструмент проверки кода. Вы получаете какие-либо ошибки? – Lix

ответ

7

Для предотвращения атак с внедрением SQL, вы должны избежать данных, которые вам получить от пользователя при построении запроса, используя, например:

$query = "SELECT * FROM `users` WHERE `id` = '" . 
    mysql_real_escape_string($_POST['id']) . "'"; 

(Обратите внимание на одинарные кавычки вокруг значения.)

гораздо лучше идея все же использовать prepared SQL statements. Во всяком случае, магия кавычек устарела, поэтому нет необходимости в stripslashes() и супер-глобалях и всем этим обманом.

Также, используйте htmlspecialchars() только при выдаче. Теперь у вас на самом деле есть объекты HTML в переменных, с которыми вы все еще работаете.

+1

mysql_real_escape_string не делает данные «безопасными» –

+0

@YourCommonSense Я просто использовал слова OP, я извиняюсь за замешательство. – Tibor

+0

вы не должны избегать данных, которые вы получаете от пользователя, используя mysql_real_escape_string, а также –

4

Вы также можете привести переменную как целое, так как ваш идентификатор будет содержать только цифры:

$id = (int)$_GET['id']; 

Если передать строку «? ID = asdoi» за $ идентификатор получит значение 0.

Смежные вопросы