Запретить XSS в HTML-формах со стороннего сайта
Вопрос
Основы:
- У меня есть контактная форма, которая использует php для проверки формы.(в дополнение к клиентской стороне). Однако это можно сделать на любом языке серверной стороны.
- Серверная сторона позволяет только A-z 0-9 для некоторых полей (это приемлемо для проверки этого поля в английский только с этим крайне ограниченным диапазоном)
- Если форма содержит ошибки, я заполняю поля заново, чтобы пользователю не приходилось вводить текст заново перед повторной отправкой.
- Я не хочу, чтобы другие сайты публиковали сообщения в моей форме, даже если там можно найти законное использование.
Я могу легко создать форму на другом веб-сайте, в поле которой будет публиковаться нецензурное слово.Некоторые грязные слова совершенно законны в соответствии с правилами проверки, но моему сотруднику явно не хотелось бы, чтобы такое произошло.
У меня сложилось впечатление, что преданные хакеры могут повлиять на файлы cookie, сеансы PHP и, конечно же, скрытые поля, которые легко подделать вместе с реферерами и тому подобным.Как я могу запретить сторонним сайтам публиковать сообщения на моей странице?
Пожалуйста, не стесняйтесь помочь мне в этом.Мои условия поиска слабы, и методы поиска, которые, как я знаю, не принесут успеха.
Что, если кто-то отправит сообщение «d03boy ест кошек» через форму на своем сайте и заставит людей щелкнуть ссылку, которая отправит это сообщение в мою форму?(Признайте, что это возможно, и моя компания не может принять на себя какой-либо риск). Затем, когда пользователь нажимает на ссылку, которую он видит в поле «имя», «d03boy ест кошек», он очень обижается и связывается с PETA по поводу содержания нашего сайта.Мы просто не можем объяснить пользователю, что произошло.Да, ничего не произошло, но расстраивать отдельного пользователя для моего работодателя неприемлемо.
Наше текущее решение — не сообщать о каких-либо действиях пользователя, что, на мой взгляд, является большой проблемой с удобством использования.
Решение
Похоже, вам нужна система модерации для пользовательского контента, а не техническое решение.Очевидно, вы можете проверить поле реферера, очистить контент и попытаться отфильтровать непристойное, но перечисляющее зло. никогда работает.(Это может быть приемлемым «первым проходом», но люди бесконечно изобретательны в том, чтобы избегать таких фильтров).
Поместите отправленный пользователем контент в очередь и попросите модераторов просмотреть и одобрить контент.Чтобы облегчить нагрузку, вы можете установить для доверенных пользователей статус «предварительно одобренных», но вы сказали, что ваш клиент не может принять никакого риска.
Честно говоря, я считаю это невозможным:даже при наличии модераторов существует риск того, что модератор разрушит вашу систему.Если это действительно так (что у них нулевая толерантность к риску), то я предлагаю им не принимать никаких пользовательских данных, не доверять модераторам и фактически удалить сам сайт (потому что инсайдер может пойти на зло и разместить что-то ненадлежащее).Очевидно, что каждое действие сопряжено с риском;вам нужно выяснить, сколько они могут принять, например, очередь одобрения на основе модератора.
Другие советы
Я не уверен, что полностью понимаю ваш вопрос, но сделаю все возможное, чтобы дать вам базовый ответ.
Межсайтовый скриптинг (XSS) обычно происходит, когда кто-то другой вставляет HTML в ваши формы.Ваш веб-сайт позволяет это сделать, потому что он не экранирует HTML должным образом.Если вы используете PHP, вам, вероятно, захочется использовать функцию htmlentities($str, ENT_QUOTES).
htmlentities($str, ENT_QUOTES)
Моя попытка
...
<?
$form_token = "";
$token = "";
$encoded_token = "";
$salt = "ThiséèÞ....$ÖyiìeéèÞ"; //it is 70 characters long
...
...
$blnGoodToken = false;
...
...
//Check for the encoded token
session_start();
$encoded_token = GetSuper('POST', 'TOKEN');
if (isset($_SESSION['TOKEN'])) {
if (sha1($_SESSION['TOKEN'] + $salt) === $encoded_token) {
$blnGoodToken = true;
//echo "Good Token";
}
else {
//echo "Bad Token";
$blnGoodToken = false;
unset($_SESSION);
session_unset();
session_destroy();
session_start();
}
}
else {
$blnDoit = false;
echo "No Token, possible no session";
}
$token = uniqid(rand(), TRUE);
$_SESSION['TOKEN'] = $token;
$form_token = sha1($token + $salt);
...
...
?>
...
...
<form action="request.php?doit=y" method="post">
<input type="text" name="TOKEN" id="TOKEN" value="<?=$form_token?>" />
<!--
form stuff
-->
<input type="reset" value="Clear" />
<input type="submit" value="Submit" />
</form>
Поскольку я больше нигде на сайте не использую сеансы, я не думаю, что мы особо подвержены перехвату сеансов.Токен меняет каждую загрузку, и чтобы токен соответствовал сеансу, вам нужно знать
- Я использую ША.Легкая догадка сделать на моем PHP код
- Я храню это в сеансе.Я полагаю сессия gettable
- Моя соль.Я думаю, что это хорошо секрет.Если они знают мою соль они уже владел моим сервером