我有一个使用.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
文件的正确方法是什么?
答案 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)
答案 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');
但是你不应该过多地依赖这个检查,因为它很容易绕过。