阻止对文件的直接访问,但允许通过jquery的load函数访问


block direct access to file but allow access through jquerys load function

我使用jQuery通过它的.load()函数向用户显示某个页面。我这样做是为了让用户定制网站,让他们适应自己的需求。

此刻,我试图在main.php内的容器内显示文件feed.php;

我遇到了一个问题,我想阻止直接访问文件(I。e:直接到它的路径(./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,甚至是一个完全不同的方式做到这一点,我将非常感激!

请按照以下步骤实现:

  1. 在jquery的.load函数中发布一个安全码
  2. 在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.";
}

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']报头(但是,这很容易被欺骗),当然,如果访问提要需要登录,请使用正常的会话逻辑来确保用户登录。

不管怎样:没有办法使它"水密"。如果您的浏览器可以(应该能够)以某种方式访问提要,那么只需打开调试器,查看在network选项卡中发送的实际请求,然后发送完全相同的头/请求来从Curl获取文件。实际上,您也将在调试器中看到请求的响应(即实际的提要)。

跟我说:如果我的(或用户的)浏览器可以从jQuery访问提要(通过AJAX请求或其他),那么该用户可以访问提要,如果他甚至只是一点点比立即放弃更持久。只有使用会话才能将"未经授权"的用户拒之门外,因为它依赖于登录。在登录后,请求无论如何都是可见的,并且该请求可以被'伪造'从任何其他应用程序发送,无论如何