实际上我有一个收集信息和收据的登录表单。
现在我想确保只接受来自我的服务器提供的此登录页面的请求,而不是任何其他使用相同参数命中我的网址的页面。
感谢您提前启发。
答案 0 :(得分:1)
最简单的方法 - 无论您的开发环境是什么 - 将在登录发布后设置会话变量,然后让您的servlet检查该特定值。
答案 1 :(得分:0)
可能有更好的方法,但这样的事情应该做的工作
if ($_SERVER["PHP_SELF"] == 'mydomain.com') {
// do some stuff
} else {
die "requests from external servers are denied!";
}
另请查看此链接以获取有关CSRF漏洞利用及其预防方法的详细说明:http://en.wikipedia.org/wiki/Cross-site_request_forgery#Prevention
答案 2 :(得分:0)
在登录页面中:
<input type='hidden' name='access' value='granted'/>
在您的登录表单页面重定向
if(isset($_POST)&&($_POST['access']=='granted')){
session_start();
$_SESSION['access']='granted'
}
在您要控制的每个页面上(登录除外):
if ($_SESSION['access']!='granted'){
die "Request denied!";
}
答案 3 :(得分:0)
您可以在登录表单页面中发出某种一次性票证,并在以后发送表单提交时进行检查。
一个简单的例子是在登录页面请求的会话中设置一个标志。稍后在提交表单时,您将检查是否已设置该标志。如果已设置,则允许处理并取消设置,以便不能再次使用。
请注意,这只会在提交之前强制请求登录表单。但它不会阻止任何类型的攻击,如自动请求或跨站点请求伪造攻击,如果它是你想要完成的。
答案 4 :(得分:0)
一个快速的解决方案是跟踪每个表单提交。
当您显示包含表单的页面时,您在数据库表中添加一行:
submission_id | token | expire |
然后在您放置(在隐藏字段中或在表单的操作中)submission_id的页面中。
当您收到表单的帖子时,您可以进行所需的所有检查(常见的是:每个submission_id只提交1次,到期时间)