如何直接在URL中拒绝用户访问脚本


How do I denied user access script directly in URL

我有一个jQuery脚本,使用.live()加载它的页面内容。

$('#content').load("content.php?" + id);

问题:如何拒绝用户通过URL直接访问文件content.php

我试图将此代码放在content.php的顶部,但访问被拒绝出现在我的#contentdiv 中

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');

但你不应该过于依赖这个检查,因为它很容易绕过。