Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2017, 20:22
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Защита для input и textarea ?
Добрый день уважаемые. Задался вопросом защиты html документа от вредоносных скриптов. На форумах вычитал что основная форма "отсеивания" вредоносного кода должна происходить на стороне сервера. (Согласно объяснениям злоумышленник может отключить JS а зараженное сообщение всё равно будет отсылаться) Хотел узнать насколько это утверждение верно, и всё таи какие есть методы по защите?
В пример приведу самую простую форму из одного input и textarea
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
	
	<form id="form" action="send.php" method="POST">
		<div class="box-email">
			<input name="email" type="email" placeholder="your_email@gmail.com" autofocus
			required>
		</div>
		<div class="box-message">
			<textarea name="textMessage" id="textMessage" cols="30" rows="5"
			placeholder="You can write me some message" required></textarea>
		</div>
		<div class="send-box">
			<input type="submit" value="Send">
		</div>
	</form>
	
	<script src="script.js"></script>
</body>
</html>

То чем я попробовал отфильтровать данную форму в php
<?php
$textMessage = $_POST['textMessage'];
$email = $_POST['email'];

// Filters
$textMessage = htmlspecialchars($textMessage);
$email = htmlspecialchars($email);

$textMessage = urldecode($textMessage);
$email = urldecode($email);

$textMessage = trim($textMessage);
$email = trim($email);

if (mail("for_spam@gmail.com", "Заявка с сайта", "Суть письма:"."\n".$textMessage."\n"."E-mail: ".$email ,"From: for_spam@gmail.com \r\n"))
	{     echo "сообщение успешно отправлено";
} else {
	echo "при отправке сообщения возникли ошибки";
}
?>

Из всех методов что я вычитал самые часто встречаемые стали фильтрация на тег <script> и заменять угловые скобки и амперсанд на их спецсимволы.
function sanitizeHTML(html) {
    var doc = document.implementation.createHTMLDocument("Test");
    doc.body.innerHTML = html;
    var nodes = doc.querySelectorAll("script,style,link,object");
    for (var i=0, len=nodes.length; i < len; i++) {
        nodes[i].parentNode.removeChild(nodes[i]);
    }
    return doc.body.innerHTML;
}


str = str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");

Может ещё кто чего присоветует, и по JS и по php
Ответить с цитированием
  #2 (permalink)  
Старый 21.02.2017, 02:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$textMessage = htmlspecialchars($textMessage) и mail() как text/plain. Вопрос - какое содержание получим в почтовом отправлении?

$textMessage = urldecode($textMessage);
$email = urldecode($email);

с чего вдруг?
Ответить с цитированием
  #3 (permalink)  
Старый 21.02.2017, 09:51
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

1) Первая функция преобразует все символы, которые пользователь попытается добавить в форму: При этом новые переменные в php не создаются, а используются уже имеющиеся.(для примера - фильтр, преобразует символ "<" в '&lt;'.)
2) функция декодирует url, если пользователь попытается его добавить в форму.
Ответить с цитированием
  #4 (permalink)  
Старый 21.02.2017, 10:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Black_Star
Первая функция преобразует все символы, которые пользователь попытается добавить в форму:
Полнейшая чушь, так как почта в данном случае отправляется как text/plain. В этом случае вместо того, чтобы прочесть "Мне нужно <= чем ...", получатель прочтет Мне нужно &lt;= чем ...". Это нормально? И только при отправке почты как text/html нужно обрабатывать тело сообщения htmlspecialchars().

Сообщение от Black_Star
функция декодирует url, если пользователь попытается его добавить в форму
Вообще без комментариев, ну дурь, что говорить.
Ответить с цитированием
  #5 (permalink)  
Старый 21.02.2017, 11:02
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Возможно Мои знания в пыхе очень низки (Собственно потому-то я и задаю вопрос)
Источник моих ответов вот.
http://webriz.ru/st/one/prosteyshaya...chi-html-i-php
А показывать, laimas какой Вы тут Д'Артаньян, а все остальные жалкие нубы, не приводя при этом ни каких аргументированых ответов глупо.
Ответить с цитированием
  #6 (permalink)  
Старый 21.02.2017, 14:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Black_Star
А показывать, laimas какой Вы тут Д'Артаньян
Точно улыбнуло.

Ну причем тут знания, ну вы же изучаете, ну скажите на милость, где написано в руководстве, что htmlspecialchars это инструмент фильтрации значений? Она нужна при выводе данных в браузер, который оперирует html. Что будет, если даже нет в выводе "опасного", а просто выражение мной приведенное? Правильно, html будет битым. Ну естественно преобразовывая < и > в html-мнемоники htmlspecialchars предотвращает XSS атаки на странице.

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

Для проверки и фильтрации данных формы есть целый набор фильтров, вот чем надо пользоваться при ее проверке.
Ответить с цитированием
  #7 (permalink)  
Старый 21.02.2017, 15:08
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Black_Star, если enctype формы равен application/x-www-form-urlencoded, а по умолчанию это так, то в $_GET и $_POST уже находятся urldecode-данные, т.е. в данном случае при отправке формы браузер делает urlencode данных и указывает заголовок Content-Type: application/x-www-form-urlencoded, при получении HTTP-сообщения PHP смотрит по заголовку Content-Type какого типа контент пришел, так как это application/x-www-form-urlencoded, то делает обратную операцию urldecode и раскладывает данные по ключам массивов $_GET и $_POST.
Ответить с цитированием
  #8 (permalink)  
Старый 22.02.2017, 08:23
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Спасибо за пояснения
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инициализация Tinamce для нескольких textarea niko099 Элементы интерфейса 1 05.07.2015 16:57
Мини библиотека для контроля ввода текста в TEXTAREA / INPUT devote Ваши сайты и скрипты 5 21.03.2014 14:13
Не работает innerHTML для textarea в ФФ ropil Сайт Javascript.ru 5 06.05.2008 19:53
Разным элементам input - разное форматирование. Как? eclipse (X)HTML/CSS 1 25.10.2007 13:55
Позиция курсора в input type="text" (ie) Кирпич Общие вопросы Javascript 2 21.10.2007 06:44