2012-02-04 3 views
12

Я пытаюсь объединить функцию общего назначения, которая будет дезинфицировать входные данные в базу данных Mysql. До сих пор это то, что у меня есть:функция для дезинфекции ввода базы данных Mysql

function sanitize($input){ 
    if(get_magic_quotes_qpc($input)){ 

     $input = trim($input); // get rid of white space left and right 
     $input = htmlentities($input); // convert symbols to html entities 
     return $input; 
    } else { 

     $input = htmlentities($input); // convert symbols to html entities 
     $input = addslashes($input); // server doesn't add slashes, so we will add them to escape ',",\,NULL 
     $input = mysql_real_escape_string($input); // escapes \x00, \n, \r, \, ', " and \x1a 
     return $input; 
    } 
} 

Если я понял определение get_magic_quotes_qpc(). Это устанавливается сервером php для автоматического выхода из символов вместо использования addslashes().

Правильно ли я использовал addslashes() и mysql_real_escape_string(), и есть ли что-нибудь еще, что я мог бы добавить для повышения санитарии.

Благодаря

+2

Сочетание как можно большего количества экранирующих функций не является хорошим подходом. Вы просто получите тройные экранированные данные и не сможете использовать его ни для чего, кроме вывода in-html. – mario

+0

См. Также [Метод для дезинфекции ввода пользователя] (http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php) -and- [Что такое наилучшие функции деструкции ввода PHP?] (http://stackoverflow.com/questions/3126072/what-are-the-best-php-input-sanitizing-functions) – mario

+0

Возможный дубликат [Рекомендуется использовать функцию сантирования, которая объединяет два или более встроенных в санирующие функции в php?] (http://stackoverflow.com/questions/8800986/is-it-recommended-to-have-a-santizing-function-that-combines-two-or-more -built-i) – mario

ответ

28

htmlentities() не является необходимым, чтобы сделать данные безопасными для SQL. Он используется для повторения значений данных для вывода HTML, чтобы избежать уязвимостей XSS. Это также важная проблема безопасности, о которой вы должны помнить, но она не связана с SQL.

addslashes() избыточен с помощью mysql_real_escape_string. Вы получите буквальные обратные косые черты в ваших строках в базе данных.

Не используйте магические кавычки. Эта функция устарела много лет. Не развертывайте PHP-код в среде, где включены магические кавычки. Если он включен, выключите его. Если это размещенная среда, и они не будут отключать магические кавычки, получите нового хостинг-провайдера.

Не использовать ext/mysql. Он не поддерживает параметры запроса, транзакции или использование OO.

Используйте PDO и сделайте свои вопросы безопаснее, используя prepared queries.

Для получения дополнительной информации о написании безопасного SQL, прочитайте мою презентацию SQL Injection Myths and Fallacies.

3

Почему вы хотите применить htmlentities перед сохранением данных в базу данных? Что делать, если вы хотите использовать данные для чего-то другого, кроме как просто написать его в браузере? Например, для поиска, разделения данных, использования данных на других языках программирования и т. Д.

Единственное, что вы действительно хотите применить, это mysql_real_escape_string (или использовать PDO), ничего больше.

Обычно я предпочитаю полностью отменять эффекты магических цитат. Магические кавычки просто громоздки для работы и никогда не должны были быть изобретены. Вот отрывок из PHP manual отменить волшебные кавычки:

if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
    unset($process); 
} 
5

Волшебные кавычки deprecated. Выключите их, если сможете :).

Вторая часть addslashes и mysql_real_escape_String делает в целом то же (похоже) вещь. Просто попробуйте

addslashes('\\') 
// and 
mysql_real_escape_string('\\') 

Результат должен быть \\, так что если вы используете

mysql_real_escape_string(addslashes('\\')) 

вы должны получить \\ (или '\\\\' как строки). Используйте только mysql_real_escape_string (лучше) ИЛИ addslashes, и не оба.

Я рекомендую использовать PDO вместо сырых функций и ручного экранирования.

-4

Использование:

mysql_real_escape_string() 

Это позволит предотвратить плохие данные, такие как DROP TABLE;)

+2

Это чрезвычайно непротиворечивый ответ. mysql_real_escape_string() не предотвращает «плохие данные». Однако вы не можете использовать эту инъекцию запросов с расширением mysql в любом случае –

0

Худшая часть, что Добавление косых черт не дезинфицирует ничего, независимо от того, какая функция была использована.
, и его не следует использовать в средствах любой «санитарии» вообще.

слэши не дезинфицируют данные. Слэши не выходят разделители строк. Таким образом, единственная дезинфекция, о которой вы можете говорить, - это побег и с указанием.

В противном случае, если вы не ставите кавычки вокруг «дезинфицированной» строки, у вас не будет никакой защиты.

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