如何在没有影响 Ajax 调用的标头位置的情况下执行此操作,并且在用户访问禁止的 url 时不简单地回显错误消息?
有多种方法可以实现这一点,让我们在这里讨论两种:
检查推荐人
首先,您可以检查 HTTP 引用,浏览器将链接到当前页面的页面的 URL 作为 HTTP 标头发送。
http://foo.invalid/blah/?action=newfolder.php
当用户单击表单/链接时,请查看此(缩短的)HTTP 请求。
要求
Request URL:http://foo.invalid/blah/?action=newfolder.php
Request Method:POST
标头
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:foo.invalid
Referer:http://foo.invalid/
可以看到有“Referer”字段,如果用户直接打开http://foo.invalid/blah/?action=newfolder.php
,就不会有referer字段。
来源
<?php
if (empty($_SERVER['HTTP_REFERER'])) {
// Redirect to login (Referer empty)
} else {
// Show JSON warning (Referer not empty)
}
?>
但是,此解决方案并不那么可靠,因为一些用户出于隐私原因禁用或伪造了引用者。
添加自定义 HTTP 标头字段
更好的方法是发送自定义 HTTP 标头,请注意您只能将自定义 HTTP 标头添加到 AJAX 请求。JQuery等一些库已经为您添加了自定义标头。
var r = new XMLHttpRequest();
r.open('get', '/blah/?action=newfolder.php');
r.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
r.send(null);
现在请求将包含自定义X-Requested-With
标头,如果缺少标头,您可以假设该页面是通过输入 URL 打开的。
<?php
if (empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
// Redirect to login (X-Requested-With empty)
} else {
// Show JSON warning (X-Requested-With not empty)
}
?>