Запретить XSS в HTML-формах со стороннего сайта

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Основы:

  • У меня есть контактная форма, которая использует php для проверки формы.(в дополнение к клиентской стороне). Однако это можно сделать на любом языке серверной стороны.
  • Серверная сторона позволяет только A-z 0-9 для некоторых полей (это приемлемо для проверки этого поля в английский только с этим крайне ограниченным диапазоном)
  • Если форма содержит ошибки, я заполняю поля заново, чтобы пользователю не приходилось вводить текст заново перед повторной отправкой.
  • Я не хочу, чтобы другие сайты публиковали сообщения в моей форме, даже если там можно найти законное использование.

Я могу легко создать форму на другом веб-сайте, в поле которой будет публиковаться нецензурное слово.Некоторые грязные слова совершенно законны в соответствии с правилами проверки, но моему сотруднику явно не хотелось бы, чтобы такое произошло.

У меня сложилось впечатление, что преданные хакеры могут повлиять на файлы cookie, сеансы PHP и, конечно же, скрытые поля, которые легко подделать вместе с реферерами и тому подобным.Как я могу запретить сторонним сайтам публиковать сообщения на моей странице?

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

Что, если кто-то отправит сообщение «d03boy ест кошек» через форму на своем сайте и заставит людей щелкнуть ссылку, которая отправит это сообщение в мою форму?(Признайте, что это возможно, и моя компания не может принять на себя какой-либо риск). Затем, когда пользователь нажимает на ссылку, которую он видит в поле «имя», «d03boy ест кошек», он очень обижается и связывается с PETA по поводу содержания нашего сайта.Мы просто не можем объяснить пользователю, что произошло.Да, ничего не произошло, но расстраивать отдельного пользователя для моего работодателя неприемлемо.

Наше текущее решение — не сообщать о каких-либо действиях пользователя, что, на мой взгляд, является большой проблемой с удобством использования.

Это было полезно?

Решение

Похоже, вам нужна система модерации для пользовательского контента, а не техническое решение.Очевидно, вы можете проверить поле реферера, очистить контент и попытаться отфильтровать непристойное, но перечисляющее зло. никогда работает.(Это может быть приемлемым «первым проходом», но люди бесконечно изобретательны в том, чтобы избегать таких фильтров).

Поместите отправленный пользователем контент в очередь и попросите модераторов просмотреть и одобрить контент.Чтобы облегчить нагрузку, вы можете установить для доверенных пользователей статус «предварительно одобренных», но вы сказали, что ваш клиент не может принять никакого риска.

Честно говоря, я считаю это невозможным:даже при наличии модераторов существует риск того, что модератор разрушит вашу систему.Если это действительно так (что у них нулевая толерантность к риску), то я предлагаю им не принимать никаких пользовательских данных, не доверять модераторам и фактически удалить сам сайт (потому что инсайдер может пойти на зло и разместить что-то ненадлежащее).Очевидно, что каждое действие сопряжено с риском;вам нужно выяснить, сколько они могут принять, например, очередь одобрения на основе модератора.

Другие советы

Я не уверен, что полностью понимаю ваш вопрос, но сделаю все возможное, чтобы дать вам базовый ответ.

Межсайтовый скриптинг (XSS) обычно происходит, когда кто-то другой вставляет HTML в ваши формы.Ваш веб-сайт позволяет это сделать, потому что он не экранирует HTML должным образом.Если вы используете PHP, вам, вероятно, захочется использовать функцию htmlentities($str, ENT_QUOTES).

htmlentities($str, ENT_QUOTES)

HTML-сущности PHP

Моя попытка

...
<?
$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>

Поскольку я больше нигде на сайте не использую сеансы, я не думаю, что мы особо подвержены перехвату сеансов.Токен меняет каждую загрузку, и чтобы токен соответствовал сеансу, вам нужно знать

  1. Я использую ША.Легкая догадка сделать на моем PHP код
  2. Я храню это в сеансе.Я полагаю сессия gettable
  3. Моя соль.Я думаю, что это хорошо секрет.Если они знают мою соль они уже владел моим сервером
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top