从第三方站点阻止HTML表单中的XSS

时间:2009-01-07 20:13:43

标签: xss html-form

基础知识:

  • 我有一个使用的联系表格 php来验证 形式。 (除客户端外)这可以用任何服务器端语言完成。
  • 服务器端仅允许     某些字段的A-z 0-9(它是     可以接受验证此字段     英语只有非常有限的范围)
  • 如果表单包含错误,我会重新填充字段,以便用户在重新提交之前不必重新输入
  • 我愿意不让其他网站发布到我的表单,即使在那里可以找到合法用途。

我可以轻松地在不同的网站上制作一个表单,将脏字发布到字段中。根据验证规则,某些脏话是完全合法的,但我的雇主显然不希望这种情况发生。

我的印象是专门的黑客可以影响cookie,php会话,当然隐藏的字段很容易与引用等一起欺骗。如何阻止第三方网站发布到我的页面?

请随时帮助我Google。我的搜索条件很弱,并且我知道的方法会失败。

如果有人通过他们网站上的表单提交“d03boy吃猫”并让人们点击提交给我表单的链接怎么办? (承认这是可能的,我的公司不能接受任何风险)然后,当用户点击他们在“名称”字段“d03boy吃猫”中看到的链接并获得超级冒犯并联系PETA关于我们网站的内容。我们无法向用户解释发生了什么。没错,但是我的雇主不接受让单个用户感到不满的情况。

我们目前的解决方案是不报告任何用户输入,我认为这是一个很大的可用性问题。

3 个答案:

答案 0 :(得分:1)

这听起来像是需要适用于用户生成内容的审核系统,而不是技术解决方案。显然,您可以检查引荐来源字段,内容清理并尝试过滤亵渎,但枚举错误从不有效。 (它可以是一个可接受的“第一次通过”,但人类在避免这种过滤器方面是无限的资源)。

将用户提交的内容放入队列,让主持人审核并批准内容。为了减轻负担,您可以将受信任的用户设置为“预先批准”,但您说您的客户不会接受任何风险。

坦率地说,我发现这是不可能的:即使是主持人,主持人也有可能破坏你的系统。如果这确实是真的(他们没有风险承受能力)那么我建议他们不接受任何用户输入,不信任版主并且实际上消除了网站本身(因为内部人员可能会变得流氓并且放置不正确的东西)。显然,每一个行为都有风险;您需要了解他们可以接受多少,例如基于审核人的审批队列。

答案 1 :(得分:0)

我不确定我完全理解你的问题,但我会尽力给你一个基本答案。

当其他人在您的表单中放入HTML时,通常会发生跨站点脚本(XSS)。您的网站允许这样做,因为它没有正确地转义HTML。如果你使用PHP,你可能想要使用htmlentities($ str,ENT_QUOTES)函数。

htmlentities($str, ENT_QUOTES)

PHP htmlentities

答案 2 :(得分:0)

我的尝试

...
<?
$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. 我的盐。我觉得这很好 秘密。如果他们已经知道我的盐 拥有我的服务器
相关问题