我正在向一个名为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"]
来验证