我有一个jQuery脚本,使用.live()
加载它的页面内容。
$('#content').load("content.php?" + id);
问题:如何拒绝用户通过URL直接访问文件content.php
?
我试图将此代码放在content.php
的顶部,但访问被拒绝出现在我的#content
div 中
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'content.php' == basename($_SERVER['SCRIPT_FILENAME']))
die('Access Denied');
确保用户不能使用URL访问我的content.php
文件的正确方法是什么?
您可以使用某种哈希。例如,如果content.php具有参数id
;您添加了一个额外的参数hash
,该参数包含"某个随机字符串"+id*15的MD5哈希。在content.php中,您可以检查hash&id匹配;如果不拒绝访问。
计算必须用PHP(而不是ajax)完成,因为用户一定不知道哈希算法。
使用这种方法,用户可以查找源代码并直接访问页面,但不能完全拒绝,因为浏览器需要访问页面才能显示它。但用户不能访问以前没有通过ajax访问过的页面。你可以使用一些标题(HTTP_X_REQUESTED_WITH
)来阻止大多数互联网用户直接访问页面,但有经验的用户无论如何都会更改标题并访问它。
如果您想保护使用,可以使用一次性密钥算法。让服务器生成一个密钥,该密钥将包含在页面的某个变量或属性中。然后在load命令中,您将密钥传递给content.php,如下所示:
key = $("{some selector to get the key}")
$('#content').load("content.php?id=" + id + "key=" + key);
一旦页面使用密钥调用服务器,服务器将使密钥过期,使其无法使用。这样,只有活动页面请求才能访问您的content.php文件。
这种方法仍然不是防弹的,但会使用户更难访问content.php。
由于您通过ajax调用资源,一个可能的解决方案是向请求中发送一个特定的头,如HTTP_X_REQUESTED_WITH
,然后检测头服务器端,如
/* AJAX check */
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) ||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') {
die($content);
}
我建议阅读以下内容:检测服务器上的Ajax事件。
主页上是否有其他内容可以从content.php文件中引用,以验证您是否将其作为主页的一部分而不是单独的页面加载?您还可以通过会话将内容从主页传递到content.php页面,然后在加载content.php结束时删除该项。
如果URL可以通过AJAX请求访问,那么它可以直接访问,对此你无能为力
function isAjaxRequest() {
return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
并在脚本的开头检查它:
if (!isAjaxRequest())
die('Access Denied');
但你不应该过于依赖这个检查,因为它很容易绕过。