阻止直接访问文件,但允许通过 jquery 加载函数访问

Posted

技术标签:

【中文标题】阻止直接访问文件,但允许通过 jquery 加载函数访问【英文标题】:block direct access to file but allow access through jquerys load function 【发布时间】:2017-03-04 13:32:31 【问题描述】:

我正在使用 jQuery 通过它的.load() 函数向用户显示某个页面。我这样做是为了允许用户自定义网站,让他们能够满足他们的需求。

目前,我正在尝试在main.php 内的容器内显示文件feed.php

我遇到了一个问题,我想阻止直接访问文件(即:直接访问它的路径(./feed.php )),但仍允许通过 .load() 函数提供服务。

如果我为此使用 .htaccess deny from all 方法,我会在页面的特定部分得到 403。我找不到任何其他解决此问题的方法;不允许我实现我想要的。

这是我目前的(简体)scripthtml

<script type="text/javascript">
    $("#dock-left-container").load("feed.php"); // load feed.php into the dock-left-container div
</script>

<div class="dock-leftside" id="dock-left-container"></div> // dock-left-container div

如果有人可以通过 .htaccessphp 或什至 完全不同 的方式提出解决方案,我会非常感谢!

提前致谢。

【问题讨论】:

你为什么使用 load(), 函数。你在检查之前有什么条件吗?它似乎是一个身份验证系统实现.. @LukeP.Issac 不,它不是......它用于布局定制 【参考方案1】:

请按照以下步骤实现:

    在 jquery 的.load 函数中发布安全码。 在 Feed.php 页面中放置一个 PHP 条件,如果发布的 security_code 参数找到并与 .load 中传递的 security_code 匹配,则只允许访问该页面,否则限制。

请按照您现有代码中的以下更改来实现它。

JS

<?php 
    $_SESSION['security_code'] = randomCode();
?>
<script type="text/javascript">
    $("#dock-left-container").load("feed.php", 
       security_code: '<?= $_SESSION['security_code']; ?>'
   ); // load feed.php into the dock-left-container div
</script>

PHP

将php条件放在feed.php的顶部

if(isset($_POST['security_code']) && $_POST['security_code'] == $_SESSION['security_code'])
    //Feed.php page's all the stuff will go here
else
    echo "No direct access of this page will be allowed.";

【讨论】:

为什么是89764123?通过 PHP 随机生成安全代码会更好吗?谢谢 如果您生成一个随机数,那么您必须将其存储在 PHP 会话中,然后将其传递到 .load 和 php 页面中,您必须将发布的值与会话值匹配。跨度> 我知道 :) 我只是好奇该代码是否有必要哈哈 你的 JS 代码在 PHP 文件中吗?如果是,那么我在之前的评论中所说的很容易实现。 @RahutPatel 很公平。【参考方案2】:

feed.php:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
    readfile('myfeed.xml');
 else 
    header('HTTP/1.0 403 Forbidden');

jQuery 默认发送HTTP_X_REQUESTED_WITH 标头。到目前为止,这并不是任何远程安全的,因为 HTTP 标头很容易被发送/欺骗。但它会阻止偶尔尝试直接访问提要的用户。

您还可以检查$_SERVER['HTTP_REFERER'] 标头(但同样,这很容易被欺骗),当然,如果需要访问提要,请使用您的正常会话逻辑来确保用户已登录。

无论哪种方式:都无法做到“防水”。如果您的浏览器可以(应该能够)以某种方式访问​​提要,那么只需打开调试器,查看网络选项卡中发送的实际请求并发送完全相同的标头/请求即可到达来自 Curl 的文件。实际上,您也会在调试器中看到请求的响应(即实际提要)。

在我之后重复:如果我的(或用户的)浏览器可以访问“来自 jQuery”的提要(通过 AJAX 请求或其他方式),那么该用户可以访问提要,只要他比给予更持久一点立即起来。仅使用会话将阻止“未经授权”的用户,因为它依赖于登录。登录后,无论如何都可以看到请求,并且无论如何都可以“伪造”该请求以从任何其他应用程序发送。

【讨论】:

您能否发表一个原因,说明为什么这可能有效以及如何改变它?谢谢 它应该可以工作,因为内部的加载函数和 xmlhttprequest 当你直接点击 url 时不是这种情况。在这里,条件是检查 xmlhttprequest 的 http 标头。

以上是关于阻止直接访问文件,但允许通过 jquery 加载函数访问的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何阻止对文件的直接 URL 访问,但仍允许登录用户下载它?

停止直接访问 (.htaccess) 并允许 ajax 请求到子文件夹

如何拒绝直接访问网站文件但允许网站文件通过包含'file.php'相互访问?

如何配置亚马逊云端以阻止某些 S3 存储桶文件访问?

允许/阻止标签的可访问性字体大小调整

是否可以仅从应用程序提供对智能合约的访问并阻止直接访问?