阻止直接访问文件,但允许通过 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。我找不到任何其他解决此问题的方法;不允许我实现我想要的。
这是我目前的(简体)script
和html
:
<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 或什至 完全不同 的方式提出解决方案,我会非常感谢!
提前致谢。
【问题讨论】:
你为什么使用 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 请求到子文件夹