阻止用户提交除申请之外的请求

时间:2012-07-25 07:23:12

标签: php security

实际上我有一个收集信息和收据的登录表单。

现在我想确保只接受来自我的服务器提供的此登录页面的请求,而不是任何其他使用相同参数命中我的网址的页面。

感谢您提前启发。

5 个答案:

答案 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次,到期时间)