0

基础:

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

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

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

请随时帮助我谷歌这件事。我的搜索词很弱,提出我知道会失败的方法。

如果有人通过他们网站上的表单提交“d03boy 吃​​猫”并让人们点击将其提交到我的表单的链接怎么办?(承认这是可能的,我的公司不能接受任何风险)然后,当用户点击他们在“名称”字段中看到的链接时,“d03boy 吃​​猫”非常生气,并就我们网站的内容联系了 PETA。我们只是无法向用户解释发生了什么。诚然,什么都没发生,但我的雇主不能接受让单个用户感到不安。

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

4

3 回答 3

1

这听起来像是您需要一个用于用户生成内容的审核系统,而不是技术解决方案。显然,您可以检查推荐人字段、内容清理并尝试过滤亵渎,但列举坏处永远不会奏效。(这可能是一个可接受的“第一次通过”,但人类在避免此类过滤器方面非常足智多谋)。

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

坦率地说,我发现这是不可能的:即使有版主,版主也有可能颠覆你的系统。如果这确实是真的(他们的风险容忍度为零),那么我建议他们不要接受任何用户输入,不要相信版主,实际上要消除网站本身(因为内部人员可能会变得流氓并提出不正当的内容)。显然,每一个行为都有风险;您需要了解他们可以接受多少,例如基于版主的批准队列。

于 2009-01-07T21:21:38.200 回答
0

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

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

htmlentities($str, ENT_QUOTES)

PHP 实体

于 2009-01-07T20:29:02.487 回答
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. 我的盐。我认为这是一个很好的秘密。如果他们知道我的盐,他们已经拥有了我的服务器
于 2009-01-07T23:17:23.973 回答