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

时间:2012-01-04 17:25:17

标签: php jquery

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

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

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

我尝试将此代码置于content.php之上但访问被拒绝显示在我的#content div

if (!empty($_SERVER['SCRIPT_FILENAME']) && 'content.php' == basename($_SERVER['SCRIPT_FILENAME']))
    die('Access Denied');

确保用户无法使用网址访问我的content.php文件的正确方法是什么?

6 个答案:

答案 0 :(得分:6)

您可以使用某种散列。例如,如果content.php具有参数id;你添加一个额外的参数hash,其中包含“'一些随机字符串'+ id * 15”的MD5哈希值。在content.php中,你检查哈希& id匹配;如果没有拒绝访问。

计算必须在PHP(而不是ajax)中完成,因为用户必须不知道散列algprithmus。

使用此方法,用户可以直接查找源代码并访问页面,但您不能完全禁止该页面,因为浏览器需要访问页面才能显示它。但用户无法访问之前未通过ajax访问的页面。您可以使用一些标题(HTTP_X_REQUESTED_WITH)来阻止大多数互联网用户直接访问该页面,但有经验的用户仍会更改标题并访问它。

答案 1 :(得分:3)

如果您想保护使用,可以使用一次性密钥算法。让服务器生成一个页面将包含在某个变量或属性中的键。然后在load命令中将密钥传递给content.php,如下所示:

key = $("{some selector to get the key}")
$('#content').load("content.php?id=" + id + "key=" + key);

一旦页面使用密钥对服务器进行调用,服务器将使密钥过期,使其无法使用。这样,只有活动页面请求才能访问您的content.php文件。

此方法仍然不是防弹,但会使用户更难以访问content.php。

答案 2 :(得分:2)

由于您通过ajax调用资源,因此可能的解决方案是将特定标头发送到HTTP_X_REQUESTED_WITH之类的请求中,然后像这样检测标头服务器端:

/* AJAX check  */
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') {

    die($content);
}

答案 3 :(得分:1)

我建议您阅读:Detecting Ajax Events on the Server

答案 4 :(得分:0)

主页上是否有其他内容可以从content.php文件中引用,以验证您是将其作为主页的一部分加载而不是独立页面?您还可以通过会话从主页将内容传递到content.php页面,然后在加载content.php结束时删除该项目。

答案 5 :(得分:0)

如果可以使用AJAX请求访问该URL,则可以直接访问该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');

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