PHP随机密钥验证

时间:2013-06-18 21:05:31

标签: php javascript jquery

我正在向一个名为return.php的脚本发出一个AJAX请求,如下所示:

http://www.example.com/return.php?type=3&filter=2

当浏览用户点击example.com上的按钮时会发生这种情况

我想要额外的安全措施,以便只有浏览我网站的用户才能请求。没有直接打字等等。

所以我在考虑发送一些随机生成的密钥以及请求。我将使用什么方法在return.php验证是否已发送正确的密钥?

我可以生成一个密钥并将其存储在一个会话变量中,然后可以在return.php中找到它吗?

伪代码:

 if ($random_key_sent == what it should){
      //go ahead and execute code
    }
else{
     //sorry can't help
    }

最终我的请求看起来像是:

http://www.example.com/return.php?type=3&filter=2&key=8fu5jtugy489kgvuri09984ufjlgi (or whatever the key would be)

底线我正在寻找一种方法来生成某种类型的附加安全性,以便只在应用时使用return.php,沿着使用API​​密钥等的类似行。

3 个答案:

答案 0 :(得分:1)

如果您担心“直接输入”但仍需要使用GET请求,则可以检查PHP中的请求标头,仅允许使用$_SERVER['HTTP_X_REQUESTED_WITH']的Ajax请求。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Do what you need to do
} else {
    die("Ajax Only");
}

(从David Walsh修改)

答案 1 :(得分:1)

您正在寻找cross-site request forgery(CSRF或XSRF)保护。

通常,您在用户的会话数据中生成并保存反CSRF令牌,并将其放在隐藏的表单字段中(使用GET或POST),或者对于普通链接,您将令牌放入查询参数。在服务器端,检查反CSRF令牌是否与用户会话数据中的令牌匹配。

有人建议您只需检查HTTP referer标头即可达到相同级别的安全性。这可行,但不太可靠,因为人们可以出于隐私原因阻止引用者。

答案 2 :(得分:-2)

除非您要获得PHP代码检查的预设密钥列表,并且浏览器可以接收然后发送URL,否则检查密钥的特定值是不切实际的。您可以检查是否设置了$_GET["key"]数组值:

if(isset($_GET["key"])){
    // go ahead and execute code
}else{
    // sorry can't help
}

或者,您可能需要考虑要求浏览器设置与请求一起发送到网页的一些POST数据,但不能输入到地址栏中。然后,只需使用$_POST["key"}而非$_GET["key"]进行验证。