Подтвердить что ты не робот

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

Подробнее о написании безопасного SQL читайте в моей презентации SQL Injection Myths and Fallacies.

Ответ 2

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

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

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

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

 mysql_real_escape_string( addslashes( '\\'))

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

mysql_real_escape_string()

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