Санатифицировать контактную форму без MySQL_REAL_ESCAPE_STRING
-
26-09-2019 - |
Вопрос
Я обычно использую эту функцию для демонстрации входов моей формы, прежде чем хранить их в мою базу данных:
//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, и эти данные все еще должны быть санитарными?
Решение
использовать 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);
это Enogth
Другие советы
Цель дезинфицирования данных с mysql_real_escape_string
чтобы избежать инъекции SQL. Если вы не используете SQL, вы уже невосприимчивы.
Мужчины не получают рак шейки матки.
Используйте функцию дезинфекции, соответствующие специальным символам, которые вам нужно избегать. В идеале не откладывайте что-то, что не нанесет вреда.
Вся концепция неверна. Эта функция не помогает не для электронной почты даже для базы данных.
MySQL_REAL_ESCAPE_STRING не «санизирует» что-нибудь. Это просто побег разделители и ничего больше. Просто чтобы предотвратить синтаксические ошибки, если у вас есть разделитель в ваших данных:
SELECT * FROM table WHERE name = 'it's me' # error!
После того, как данные сбежали, ваши данные становятся 'it\'s me'
И нет ошибки.
Следовательно, эта функция работает только с помощью SQL-запроса и для данных, только в цитатах.
Таким образом, нет смысла делать только MySQL_REAL_ESCAPE_STRING, не имея цитаты вокруг. MySQL_REAL_ESCAPE_STRING должен использоваться
а) один. такие вещи, как отделка или полоса, нечего здесь
б) прямо перед запросом строки, составив и не в другом месте
в) только с данными, которые будут заключены в цитаты.
г) все остальные данные нуждаются в других способах санитарии
Что касается электронного письма, вам не нужна какая-либо санитация, которую вы отправляете его как простой текст. Единственная предосторожность, которую вы должны взять, является против Инъекция почты
Не большая сделка, хотя. Просто поставьте ввод пользователя только в тело сообщения. не в тему, к или из или любого другого заголовка. Только для тела сообщения. И ты в безопасности
(Я новичок в Stackoverflow, поэтому я собираюсь по этому неправильному способу / сделать плохую работу с укладкой моего ответа, не стесняйтесь, дайте мне знать.)
Поправьте меня, если я ошибаюсь, так как я также имею дело с той же проблемой прямо сейчас, но я не думаю, что принятый ответ, использующий filter_var, достаточно, если злоумышленники могут обойти это с помощью Unicode.
Пример: «& # 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);