PHP随机密钥验证


PHP random key verification

我正在向一个名为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密钥等类似的行

您正在寻找跨站点请求伪造(CSRF或XSRF)保护。

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

一些人建议你可以通过简单地检查HTTP referer头来达到相同的安全级别。这可以工作,但不太可靠,因为人们可以出于隐私原因阻止推荐人。

如果你担心"直接输入",但仍然需要使用GET请求,你可以检查请求头在PHP只允许Ajax请求使用$_SERVER['HTTP_X_REQUESTED_WITH']

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)

除非您有一个PHP代码检查的预设键列表,并且浏览器可以接收并发送URL,否则检查特定值的键是不切实际的。您可以检查$_GET["key"]数组的值是否设置:

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

或者,您可以考虑要求浏览器设置一些POST数据,这些数据随请求一起发送到网页,但不能输入到地址栏中。然后用$_POST["key"}而不是$_GET["key"]来验证