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

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

спасибо

5 ответов


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

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

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

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

использовать PDO, и сделать ваши запросы безопаснее с помощью подготовленные запросы.

подробнее о написании безопасного SQL читайте в моей презентации среда SQL Инъекционные мифы и заблуждения.


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

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

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

результат должен быть \ если вы используете

 mysql_real_escape_string( addslashes( '\'))

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

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


почему вы хотите применить 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);
}

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

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

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


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

mysql_real_escape_string()

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