实际上,我有一个收集信息并继续进行的登录表单。
现在我想确保只接收来自我的服务器提供的登录页面的请求,而不是任何其他使用相同参数访问我的 url 的页面。
提前感谢您的启发。
最简单的方法——无论你的开发环境是什么——都是在登录时设置一个会话变量,然后让你的 servlet 检查那个特定的值。
In the login page:
<input type='hidden' name='access' value='granted'/>
In the page your login form redirects
if(isset($_POST)&&($_POST['access']=='granted')){
session_start();
$_SESSION['access']='granted'
}
On every page you want to control(except login):
if ($_SESSION['access']!='granted'){
die "Request denied!";
}
一个快速的解决方案是跟踪每个表单提交。
当您显示带有表单的页面时,您会在数据库表中添加一行:
submission_id | token | expire |
然后在您放置的页面中(在隐藏字段中,或在表单的操作中)submission_id。
当您收到表单的帖子时,您可以做所有您需要的检查(常见的有:每个submission_id只提交1个,过期时间)
可能有更好的方法,但这样的事情应该可以完成
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
您可以在登录表单页面中发出某种一次性票证,然后在发送表单提交时检查它。
一个简单的例子是在登录页面请求的会话中设置一个标志。稍后提交表单时,您检查是否设置了标志。如果已设置,则允许处理并取消设置,因此无法再次使用。
请注意,这只会在提交之前强制请求登录表单。但它并不能阻止任何类型的攻击,如自动请求或跨站点请求伪造攻击,如果这是您想要完成的。