Очистить контактную форму без mysql_real_escape_string - PullRequest
7 голосов
/ 09 августа 2010

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

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

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

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

Каков наилучший способ очистки данных, которые не хранятся в базе данных mysql, и нужно ли эти данные еще обрабатывать?

Ответы [ 4 ]

15 голосов
/ 09 августа 2010

использование filter_var()

http://php.net/manual/en/function.filter-var.php

например, если вы хотите очистить электронную почту:

$_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

к сообщению

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

это просто

1 голос
/ 09 августа 2010

Цель очистки данных с помощью mysql_real_escape_string состоит в том, чтобы избежать внедрения SQL. Если вы не используете SQL, вы уже защищены.

Мужчины не болеют раком шейки матки.

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

0 голосов
/ 28 марта 2013

(я новичок в stackoverflow, поэтому я поступаю неправильно), выполняя плохую работу со стилем моего ответа, не стесняйтесь, дайте мне знать.)

Поправьте меня, если я 'Я ошибаюсь, так как сейчас я тоже занимаюсь той же проблемой, но я не думаю, что принятого ответа с использованием filter_var достаточно, поскольку злоумышленники могут обойти это с помощью unicode.

Пример: "& # 66;& # 99; & # 99; & # 58; "(пробелы добавлены, поэтому stackoverflow будет отображать его правильно)

Это не будет удалено из строки и будет позже заменено на "Bcc:".

Это мое решение, но естьможет быть лучше.Если кто-нибудь знает кого-то, я бы с удовольствием его услышал.

    $string = str_replace("&", "(and)", $string);
    $string = str_replace("#", "(num)", $string);
    $string = str_replace(";", "(semi-colon)", $string);
    $string = str_replace(":", "(colon)", $string);
    $string = str_replace("@", "(at)", $string);
    $string = str_replace("\\", "(backslash)", $string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);
0 голосов
/ 09 августа 2010

Вся концепция неверна.Эта функция не помогает не для электронной почты, даже для базы данных.

mysql_real_escape_string не "дезинфицировать" ничего.Это просто escape-разделители и ничего больше.Просто для предотвращения синтаксических ошибок, если в ваших данных есть разделитель:

SELECT * FROM table WHERE name = 'it's me' # error!

после экранирования данных, ваши данные становятся 'it\'s me' и ошибки нет.
Поэтому эта функция работает только сЗапрос SQL и данные заключены только в кавычки .

Таким образом, нет смысла делать просто mysql_real_escape_string без кавычек.mysql_real_escape_string следует использовать
a) в одиночку.такие вещи, как trim или stripslashes, здесь не имеют никакого отношения
b) непосредственно перед составлением строки запроса, а не где-либо еще
c) только с данными, которые будут заключены в кавычки.
d) все другие данные нуждаются в других способахо санитарной обработке

Что касается электронной почты, вам не нужна никакая санитарная обработка, вы отправляете ее в виде простого текста.Единственная мера предосторожности, которую вы должны предпринять, - против инъекции почты
Хотя это не так уж и страшно.Просто введите пользовательский ввод только в тело сообщения.не в тему, в или из или любой другой заголовок.Только тело сообщения.И ты в безопасности

...