形式欺骗和解决方法

Sho*_*hoe 1 html php forms security

我正在尝试开发一个表单助手来防止形式欺骗.所以我想出了这个:

<form...>
<?=form::secure()?>
...
</form>
Run Code Online (Sandbox Code Playgroud)

使用键'_token'标记隐藏的表单,使用令牌,该令牌是用户会话的id的md5(随机并在1周后续订).然后在"动作"网址(从表单):

$token = (isset($_GET['_token'])) ? $_GET['_token'] : null;
$token = (is_null($token) and isset($_POST['_token'])) ? $_POST['_token'] : $token;
if (form::is_secure($token)) { // checks if the given token is equal to md5(user id)
    ...ok...
} else {
    ...error...
}
Run Code Online (Sandbox Code Playgroud)

这是否可以防止形式欺骗或我遗漏了什么?如果用户ID的确切时刻到期时,用户刚刚加载的页面,然后提交表单,它只是打印错误,他应该再次提交表单,但多数民众赞成接受(这是罕见的).

我认为这里唯一可能出错的是,如果潜在的攻击者能够获得用户会话ID,然后他可以将?_token = id附加到它的请求并将其提供给用户进行浏览,但此时,如果攻击者拥有用户会话ID,它无论如何都可以做任何他想做的事情.

我对吗?如果没有,我如何编辑我的代码以实现我的目标?

Ant*_*ony 5

您正在有效地重新发明轮子,因为令牌需要有效的会话来验证,因此只重复会话的安全层而不添加任何额外的内容.这相当于要求某人输入密码,然后再次要求确认.它可能会让每个人都感觉更好,但如果密码被泄露,它只会减慢攻击速度但不会阻止它.

这并不是说你不应该认真对待这些事情或拒绝你的尝试.这就是我的哲学的形式(什么是通过传递的内容GETPOST)应与其他逻辑分离,如安全性和计算,服务器不应该考虑用户提供的数据作为比用户提供的数据之外的任何.理想情况下,任何人都可以向表单操作发布任何内容,服务器/控制器将正确且一致地管理它.验证会话(安全性),清理数据然后验证数据,并重新计算/验证用户实际使用Web表单时通过JS生成的任何值.理想情况下,响应是通用的,可以是重定向或Web标准响应,因此请求者(无论是Web浏览器,命令行用户还是Web服务)都可以解释它.

如果出现上述情况,那么欺骗的重点和关注就会减少,更多地强调分别增强安全层和验证层,最重要的是,做得好的后端控制器可以很容易地移植/重用.一个Web服务后端.

简而言之:您的解决方案并不坏,就我所知,它只是没有添加任何真正的安全性,甚至可能暴露您的后端安全逻辑.如果您有特定的欺骗问题/威胁,最好解决该用例并解决问题,而不是试图立即提出一个适合所有人的解决方案.可能会发现您的用例具有需要在交换的不同点处理的特定解决方案/注意事项.