Всем доброго времени суток. У меня возник вопрос. Есть у меня обработчик формы. Код (Text): <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <?php $name = $_POST['name']; $email = $_POST['mail']; $msg = $_POST['message']; $capcha = $_POST['capcha']; if(isset($_POST['send'])) { if(empty($_POST['name'])) { echo 'Заполните Имя'; exit(); } if(!preg_match("/^[а-яА-ЯёЁa-zA-Z]{3,15}+$/u",$_POST['name'])) { echo 'Имя должно содержать только кириллицу'; exit(); } if(empty($_POST['mail'])) { echo 'Заполните Ваш E-mail'; exit(); } if(!preg_match("/^[0-9a-z_]{2,25}+@[0-9a-z_^\.]+\.[a-z]{2,6}+$/",$_POST['mail'])) { echo 'E-mail заполнен не верно.Попробуйте еще раз'; exit(); } if(empty($_POST['message'])) { echo 'Заполните Поле сообщения'; exit(); } if(empty($_POST['capcha'])) { echo 'Введите сумму чисел'; exit(); } if(!preg_match("[50]",$_POST['capcha'])) { echo 'Не верно введена капча'; exit(); } $email = stripslashes($email); $email = htmlspecialchars($email); $name = stripslashes($name); $name = htmlspecialchars($name); $msg = stripslashes($msg); $msg = htmlspecialchars($msg); $to = 'моя почта@почта.ru'; //кому отправить $subject = 'Сообщение от пользователя'; $message = 'Имя: '.$name. '@-mail: '.$email. 'Сообщение: '.$msg; if(mail($to,$subject,$message)) echo '<HTML> <HEAD> <TITLE>Редирект через 0 секунд</TITLE> <META HTTP-EQUIV="Refresh" CONTENT="0; URL=ok.html"> </HEAD> <BODY> Ваша заявка принята. </BODY> </HTML>'; else echo '<HTML> <HEAD> <TITLE>Редирект через 0 секунд</TITLE> <META HTTP-EQUIV="Refresh" CONTENT="0; URL=error.html"> </HEAD> <BODY> Извините, что-то пошло не так </BODY> </HTML>'; } ?> Прочитал, что для защиты от вредоносного кода такой валидации и обработки введенных данных вполне достаточно.Так ли это? Подскажите, если не затруднит, все ли в порядке с ее защитой? И если нет, то как можно ее улучшить? Заранее благодарю!
--- Добавлено --- Так во первых короче я ща поправлю а ты читай в код и вникай. --- Добавлено --- Так во первых короче я ещё попровляю и делаю правильно жди доделаю, а потом вникай. --- Добавлено --- На попробуй должно работать, я просто улучшил твой код на более читабельный и нормальный разделил html и php поправил функцию мейла, в общем разберайся что не понятно спрашивай. PHP: <?php if (isset($_POST['submit'])) { $name = $_POST['name']; $email = $_POST['mail']; $msg = $_POST['message']; $capcha = $_POST['capcha']; if (isset($_POST['send'])) { $err = []; if (empty($_POST['name'])) { $err[] = 'Заполните Имя'; } if (!preg_match("/^[а-яА-ЯёЁa-zA-Z]{3,15}+$/uD", $_POST['name'])) { $err[] = 'Имя должно содержать только кириллицу'; } if (empty($_POST['mail'])) { $err[] = 'Заполните Ваш E-mail'; } if (!preg_match("/^[0-9a-z_]{2,25}+@[0-9a-z_^\.]+\.[a-z]{2,6}+$/", $_POST['mail'])) { $err[] = 'E-mail заполнен не верно.Попробуйте еще раз'; } if (empty($_POST['message'])) { $err[] = 'Заполните Поле сообщения'; } if (empty($_POST['capcha'])) { $err[] = 'Введите сумму чисел'; } if (!preg_match("[50]", $_POST['capcha'])) { $err[] = 'Не верно введена капча'; } if (empty($err)) { // За место всей твоей лабуда тут нужно сделать только так если ты хочешь убрать html теги из поля сообщения $msg = strip_tags($msg); $to = 'моя почта@почта.ru'; //кому отправить $subject = 'Сообщение от пользователя'; $message = 'Имя: ' . $name . '@-mail: ' . $email . 'Сообщение: ' . $msg; $headers = 'From: webmaster@example.com' . "\r\n" . 'Reply-To: webmaster@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers); // Заголовки обязательно нужно отправлять если хочешь чтобы письмо адекватно приходило на почту в нормальной кодировке. $thisGood = 'Привет всё класссно, письмо отправлено '; } } } ?> <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <?php if (!empty($thisGood)):?> <h1 align="center"><?php echo $thisGood ;?></h1> <?php endif ;?> <?php if (!empty($err)) :?> <?php foreach($err as $error => $value) :?> <h1 align="center"><?php echo $value;?></h1> <?php endforeach;?> <?php endif ;?> </body> </html>
@Барс1989, а ты знаешь, зачем ты каждую строчку пишешь? Вот к примеру, нахрена строчки 52 -55? Если у тебя в имени только кириллица, и ты проверяешь это регуляркой, откуда там возьмётся что-то ещё, чтоб убирать слеши или кодировать html-сущности? А так здесь 1000 раз обсуждалось, что и когда нужно делать - поищи по форуму. --- Добавлено --- Вообще, защита делается от чего-то. От чего и кого ты пытаешься защитить, если просто введённые данные отправляются на почту в plaintext-формате?
@askanim, ну поправить поправил. Зачем там strip_tags, я правда, не сильно понимаю, но может быть.. Если бы письмо в html отправлялось, то htmlspecialchars был бы уместен, а так - почтовик сам знает, что там надо сделать htmlspecialchars, если письмо пришло в plaintext (в случае использования веб-интерфейса почты), так что совершенно лишне ему ещё чем-то помогать. Ну и человек должен не бездумно вызовы вставлять, а знать, что и зачем делается. Вот я и спрашиваю, зачем там stripslashes, зачем там htmlspecialchars и прочая лабуда
@askanim для проверки правильного написания электронного почтового адреса есть отдельный флаг в функции https://secure.php.net/manual/ru/function.filter-var.php Пример №1
@denis01 знаю можешь вернутсья и посмотреть там где у меня дебаты, были с твоим другом @Ganzal. Ну там где я кидал свою уневерсальную форму сборки регистрации, там есть такая спец функция проверки на php, но мне честно тут было не много лень прямо всё исправлять я поправил что прямо у меня глаз выжгло просто. А остальное оставил мелочи. Сам дойдёт поправит потом, главное, чтобы код форматировал правильно, и понимал что для чего, пусть понимает и изучает. А вот. во первых я сказал если надо вырезать все теги. заместо всей лабуды что он написал @mkramer Например такой вариант, ты хочешь отправить определённое форматированное письмо в теге каком то. С твоими шрифтами, а чувак берёт там и свои коды пишет и в итоге что у нас на почту приходит ?) Для таких случаев хелп ми стрип тег --- Добавлено --- @mkramer а если вдруг он ещё захочет в базу положить это, в чистом виде текста, зачем ему там хранить, теги.... Тоже взял вырезал, пусть знает что такое есть, а вот эти htmlspecial для чего это?) Нафиг, код не нарушит, а в базу он не ложит, а будет ложить в помощь pdo::quote или pdo:repare
52-55 строчки поставил скорее для перестраховки. Нашел статью и там на них помимо валидации ставилась еще и обработка заполненной формы, поэтому от нее собственно решил и оттолкнуться. За кириллицу сорь ( строка 22) Я ее изменить забыл. Там не только кириллица. Забыл подправить. Меня смущало то, что в сообщении можно отправить скрипт например вредоносный и т.д. Валидацию на поле сообщение не писал же. Вычитал, что нужно добавить Код (Text): $msg = stripslashes($msg); $msg = htmlspecialchars($msg); и заодно там разбиралась защита логина и мыла с валидацией, но к ней прибавлялось Код (Text): $email = stripslashes($email); $email = htmlspecialchars($email); $name = stripslashes($name); $name = htmlspecialchars($name); askanim, спасибо огромное!!! Спасли! Только вопрос один по коду возник. Строки 34-35. Там защита от html-тегов или от вставок скриптов на perl и т. д. тоже?
Тут в общем то меня пугает не только письмо пришедшее мне на почту. Как я понял ( я могу ошибаться, так-как не особо еще в полной мере ознакомился с php ), данные будут обрабатываться на стороне сервера же? А потом отправляться на почту. А при обработке сервер может выполнить вредоносный код, что может вызвать краш всего и вся( тут опять же могу ошибаться, так-как познание в php у меня пока еще малы). Собственно тут-то и встал вопрос о защите от вредоносного кода серверной части. Нашел статью по написании гостевой книги http://www.softtime.ru/bookphp/gl11_1.php (взял ее как аналог к моей форме) В той статье помимо валидации майла и т.д. Код (Text): if (!empty($email)) /* если введен e-mail, то проверяем с помощью регулярного выражения правильность ввода */ { if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { $action = ""; $error = $error."<LI> Неверно введен е-mail.&nbsр Введите e-mail в виде <i>softtime@softtime.ru</i> \n"; } } идет вот такая проверка на обработку введенных данных Код (Text): Теперь обрабатываем введенный пользователем текст функциями удаления HTML-тегов и обратных слешей: $name = substr($_POST["name"],0,32); $name = htmlspecialchars(stripslashes($name)); // обрабатываем имя $city = substr($_POST["city"],0,32); $city = htmlspecialchars(stripslashes($city)); // обрабатываем город $email = substr($_POST["email"],0,32); $email = htmlspecialchars(stripslashes($email)); // обрабатываем e-mail $url = substr($_POST["url"],0,36); $url = htmlspecialchars(stripslashes($url)); // обрабатываем url-адрес $msg = substr($_POST["msg"],0,1024); $msg = htmlspecialchars(stripslashes($msg)); // обрабатываем сообщение Собственно отсюда и получилась у меня такая форма --- Добавлено --- Еще раз огромное спасибо за помощь! --- Добавлено --- Спасибо! Правда я уже пытался применить этот флаг, но форма после этого почему-то перестала работать ( во всем виноваты мои кривые руки видимо ), поэтому я собственно от этой затеи отказался, чтобы окончательно форму не поломать своими экспериментами
Откуда вы все такую чушь берёте? Вся обработка прописана в твоей программе. Содержимое строковых переменных само по себе не выполняется, если ты не передаёшь его в функцию eval. htmlspecialchars используется при выводе в браузер, чтоб браузер не воспринял данные как код. Серверу вообще по барабану. Вот если ты формируешь на стороне php команду другому серверу (sql, к примеру), тогда уже нужно позаботиться, чтоб команда была корректна для того сервера, поскольку он её выполнит. И опять же, ты читал доку, что такое htmlspecialchars и прочее?
htmlspecialchars, как я понял, преобразует теги и избавляет от внедрения на сервер (sql) вредоносного кода. (Это опять же может быть не верным моим суждением, так-как по части php я совсем зеленый) . Поэтому собственно и возникает вопрос, такая форма сможет ли защитить от поломки сервера, (sql) и засорения почты вредоносным кодом ? А так-как я не силен еще пока в php, то запросто могу вместо защиты наоборот проделать бреши для всего и вся . Поэтому и уповаю на вас
А документацию почитать? htmlspecialchars, грубо говоря, заменяет < и > на < и >, а также заменяет некоторые другие сущности. О чём написано https://secure.php.net/manual/ru/function.htmlspecialchars.php. К SQL-инъекциям она вообще никакого отношения не имеет. И даже если бы имела - где у тебя в этом коде SQL? htmlspecilchars используется при выводе введённых пользователем данных, чтобы избежать XSS-атак (https://ru.wikipedia.org/wiki/Межсайтовый_скриптинг)
Проблема в том, что я еще не особо понимаю php и собственно все, что я делаю - импровизация. Вот собственно первоначальный обработчик формы с валидацией и обработкой данных , которую я заказал у фрилансера и от которой я собственнопляшу и которую пытаюсь преобразовать. Код (Text): <form method="POST" action=""> Имя<input type="text" name="name"/><br/> Телефон<input type="text" name="phone"/><br/> E-mail<input type="email" name="email"/><br/> <textarea name="message" placeholder="Сообщение"></textarea><br/> <input type="submit" name="send" value="Отправить"> </form> <?php if(isset($_POST['send'])) { if(empty($_POST['name'])) { echo 'Заполните Имя'; exit(); } if(eregi('[0-9]',$_POST['name'])) { echo 'Имя не должно содержать числа или символы'; exit(); } if(empty($_POST['phone'])) { echo 'Заполните Телефон'; exit(); } if(!eregi('[0-9]',$_POST['phone'])) { echo 'Телефон должен содержать только цифры'; exit(); } if(empty($_POST['email'])) { echo 'Заполните E-mail'; exit(); } if(empty($_POST['message'])) { echo 'Заполните Поле сообщения'; exit(); } $name = $_POST['name']; $phone = $_POST['phone']; $email = $_POST['email']; $mes = $_POST['message']; $to = 'почта@почта.ру'; //кому отправить $subject = 'Тема'; $message = 'Имя: '.$name.' Телефон: '.$phone.' E-mail: '.$email.' Сообщение: '.$mes; if(mail($to,$subject,$message)) echo 'Успешно отправлено'; else echo 'Ошибка при отправке'; } ?> Как мне объяснил создатель данного обработчика, то убираем эти строки Код (Text): <form method="POST" action=""> Имя<input type="text" name="name"/><br/> Телефон<input type="text" name="phone"/><br/> E-mail<input type="email" name="email"/><br/> <textarea name="message" placeholder="Сообщение"></textarea><br/> <input type="submit" name="send" value="Отправить"> </form> и все чудеснейшим образом работает, защита от всего и вся стоит и т.д. Возможно она работала и валидация с обработкой данных в ней есть, но я не заметил где, а данный фрилансер канул в лету Данный обработчик должен был подключаться к форме на странице index.html. как пример: Код (Text): <form method="post" action="form.php"> таким способом, но она не работала. (Возможно валидация с обработкой и была, но я ее не увидел при попытке починить форму, поэтому дописал сам)Тут собственно и началось (возможно неудачное) мое знакомство с php Форму собственно поправил как мог и она на данный момент рабочая, но вот валидацию не уверен, что верно сделал, так-как собственно столкнулся с данной проблемой около недели назад ,а до этого вообще с php не был знаком Поэтому в документации еще пока не силен Спасибо за совет!
Фрилансер давно видимо писал, судя по eregi. Ну вот у него никакой лишней фигни не стоит в коде. Если не хотите сами разбираться, лучше наймите другого фрилансера, пока не наворотили
В том то и дело, что собственно хочется самому научиться разбираться, чтобы понимать что есть что . Ибо я лично валидации у него не увидел, а как оказалось . Собственно даже ради этого стоить попытаться самому освоить php, чтобы разбираться что есть что. Проблема в том ,что еще времени мало прошло с моего ознакомления с php и мне пока сложно найти ту или иную информацию, как верно нужно делать. Собственно , поэтому и попросил у вас помощи. ))) Обязательно исправлюсь и научусь со временем. . Фрилансер не научит и не поможет советом, а сделает и убежит. Лучше научиться самому (хотя бы понимать, что есть что). Дай человеку рыбу - он будет сыт один день. Научи человека ловить рыбу - он будет сыт всю жизнь.
Я тоже так думал по началу пока lord of the developer мистер @mkramer не многими неделями ранее не вразумил меня магучими словами что это же ёлки просто строка, как она может выполнится, а я такой репу чешу а блин точно это же просто строковое знаечние, если его каким то образом не выполнять, то с ним не чего происходить не будет. --- Добавлено --- This GOOD. Молодец, аж слеза вышла. Будешь следовать этому принципу скоро догонишь и меня, ведь на самом деле я не так далеко ушёл, просто я сижу и читаю и изучаю каждый день --- Добавлено --- Это на тот случай, если тебе нужно будет вырезать все теги из текста, когда твоя строка пройдёт эту функцию, из неё вырежутся все обозначения типа <?> и у тебя останется только голый текст, который дальше можешь отформатировать так как тебе надо и отправить на почту, ну это как пример, а вообще есть более обширное применение этой функции, но там уже надо ковырять мануал. Например чтобы не вывести на страницу, скрипт какой нибудь. удалять например все теги <script> и тд. но я сам ещё особо сильно не ковырял эту тему, но скоро подойдёт время к этому.
askanim, спасибо за доскональные разъяснения! Очень многое стало понятно благодаря Вам! Вообще за все спасибо! Буду очень стараться не отставать и в ближайшем будущем надеюсь тоже помогать на форуме тем, кто только начинает свой путь в освоении PHP! )))