Запрет XSS в формах HTML со стороннего сайта - PullRequest
0 голосов
/ 07 января 2009

Основы:

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 08 января 2009

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

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

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

0 голосов
/ 08 января 2009

Моя попытка

...
<?
$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. Я использую SHA. Легкая догадка сделать на моем php код
  2. Я держу это в сессии. Я полагаю сессия получается
  3. Моя соль. Я думаю это хорошо секрет. Если они знают мою соль, они уже владел моим сервером
0 голосов
/ 07 января 2009

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

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

htmlentities($str, ENT_QUOTES)

PHP htmlentities

...