我正在向一个名为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密钥等的类似行。
答案 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"]
进行验证。