функция для очистки ввода в базу данных Mysql - PullRequest
13 голосов
/ 05 февраля 2012

Я пытаюсь собрать вместе функцию общего назначения, которая очистит входные данные для базы данных 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() вместе, и есть ли что-нибудь еще, что я мог бы добавить, чтобы улучшить санитарную обработку.

Спасибо

Ответы [ 5 ]

28 голосов
/ 05 февраля 2012

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

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

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

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

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

Подробнее о написании безопасного SQL читайте в моей презентации Мифы и ошибки SQL-инъекций .

5 голосов
/ 05 февраля 2012

Магические кавычки устарели .Выключите их, если можете:).

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

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

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

 mysql_real_escape_string( addslashes( '\\'))

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

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

3 голосов
/ 05 февраля 2012

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

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

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

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);
}
0 голосов
/ 05 февраля 2012

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

косые черты не "дезинфицируют" данные. Косые черты экранируют только разделители строк . Таким образом, единственная санитарная обработка, о которой вы можете говорить, это экранирование и цитирование .

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

0 голосов
/ 05 февраля 2012

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

mysql_real_escape_string()

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

...