0

我正在向名为 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 密钥等。

4

3 回答 3

1

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

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

有些人建议您可以通过简单地检查 HTTPreferer标头来实现相同级别的安全性。这可以工作,但不太可靠,因为人们可以出于隐私原因阻止推荐人。

于 2013-06-18T21:34:57.687 回答
1

如果您担心“直接输入”但仍需要使用 GET 请求,您可以检查 PHP 中的请求标头以仅允许使用$_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");
}

(修改自大卫沃尔什

于 2013-06-18T21:17:40.147 回答
-2

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

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

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

于 2013-06-18T21:13:38.817 回答