Санатифицировать контактную форму без MySQL_REAL_ESCAPE_STRING

StackOverflow https://stackoverflow.com/questions/3437464

Вопрос

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

//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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top