题
基础:
- 我有一种联系形式,使用 php验证 形式。(此外,以客户端)要这样做,可以在任何服务器方语言。
- 服务器只允许 A-z0-9为某些领域(这是 接受验证这个领域 英语仅用于非常有限的范围内)
- 如果包含错误,我重新填充的领域,使用户不必重新输入之前再次提交
- 我愿意不让其他网站张贴到我的形式,即使合法的使用可以在那里找到。
我可以很容易让一个形式上不同的网站,该网站员额,一个肮脏的词汇,一个领域。某些肮脏的词是完全合法根据的验证的规则,但我employeer显然不会喜欢这样的事情发生。
我的印象是,专用黑客可能会影响cookie,php会议和当然隐藏的领域很容易欺骗沿着与反向链接和这样的。我怎么可以阻止第三方网站张贴到我的页面?
请帮我在谷歌这一点。我的搜索方面的薄弱和抚养方法,我知道将会失败。
什么如果有人提出"d03boy吃猫"通过一个形式在其网站上,并得到人点击的链接提交给我的形式?(承认这是可能的,和我的公司不能接受任何风险),然后在一个用户点击的链接,他们看到里面的"名称"领域"d03boy吃猫"和获取的超级罪和善待动物组织的联系关于我们的网站的内容。我们只是无法解释为用户发生了什么事。真的,什么都没有发生,但是打乱一个单一的用户是不是可以接受我的雇主。
我们当前的方案是没有报告任何用户输入的,这在我看来是一个很大的实用性问题。
解决方案
这听起来你需要一个温和系统地对用户生成的内容,不是一个技术解决方案。很明显你可以检查引用的领域,内容刷洗和尝试过滤器的亵渎,但是列举了不良 从来没有 工程。(它可以是一个可接受的"第一次通过",但人类极足智多谋的在避免诸如过滤器)。
把用户提交的内容成队列,并具有主持人审查和核准内容。减轻负载,你可以设定可信的用户"预先核准",但是你说你的客户不能接受任何风险。
坦率地说,我发现那是不可能的:即使调解人有风险,主持人将会破坏你的系统。如果这实际上是真正的(他们有零风险容忍度),那么我建议他们不接受任何用户输入,不信任的主持人以及在事实上消除本身的网站(因为一个内幕可以去流氓把东西不正确的)。显然每一个行为有风险;你需要找出多少,他们可以接受,例如主持人根据批准的队列。
其他提示
我不知道我完全明白你的问题,但我将尽我所能来给你一个基本的答案。
Xss(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>
因为我不使用会议的其他任何地方的网站上,我不认为我们都暴露太多届会议的劫持。令牌变化,每个负荷,并获得标记相匹配的话,你会知道的
- 我用沙。一个容易猜到 在我的代码
- 我保证它在本届会议。我假设 本届会议是gettable
- 我的盐。我认为这是一个很好的 秘密。如果他们知道我的盐他们已经 拥有我的服务器