阻止直接访问文件,但允许通过jquerys加载功能进行访问

时间:2016-10-22 08:53:44

标签: javascript php jquery .htaccess

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

目前,我正在尝试在feed.php内的容器内显示文件main.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

如果有人可以通过 .htaccess php ,或者甚至是完全不同的方式来建议解决方案,那么我会非常感谢!

提前致谢。

2 个答案:

答案 0 :(得分:2)

请按照以下步骤实现:

  1. 在jquery的.load函数中发布安全代码。
  2. 如果已发布的security_code参数与security_code中传递的.load匹配,则在Feed.php页面中放置一个PHP条件,然后只允许访问该页面,否则限制。< / LI>

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

    <强> 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.";
    }
    

答案 1 :(得分: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标头很容易被发送/欺骗。但它会阻止偶尔用户尝试直接访问Feed。

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

无论哪种方式:没有办法让这个“水密”。如果您的浏览器可以(应该能够)以某种方式访问​​Feed,那么只需打开调试器,查看网络选项卡中发送的实际请求并发送完全相同的标头/请求从Curl获取文件。实际上,您也会在调试器中看到请求(即实际馈送)的响应。

在我之后重复:如果我(或用户的)浏览器可以从jQuery&#39;访问提要。 (通过AJAX请求或其他任何方式)如果该用户甚至比立即放弃更持久,则该用户可以访问该提要。只有使用会话才能防止未经授权的访问。用户,因为它依赖于登录。登录后,无论发生什么,该请求都可以被伪造,并且#39;伪造了。无论如何从任何其他申请发送。