我在AJAX目录中有几个页面。我不希望直接访问这些页面,因此您不能只在AJAX目录中键入页面的URL并访问它。我通过在调用它的页面上使用PHP会话来“解决”这个问题,如下所示: 主页:
<?php
session_start();
$_SESSION['download']='ok';
?>
在ajax页面上我有这个:
<?php
session_start();
if($_SESSION['download']!=='ok'){
$redirect='/index.php'; //URL of the page where you want to redirect.
header("Location: $redirect");
exit;}
?>
唯一的问题是,如果用户经历了一次正确的过程,则会存储cookie,现在他们可以直接访问该页面。离开父页面后如何终止会话?
THX
答案 0 :(得分:2)
为什么要使用会话?
如果我理解你想要的东西:
<?php /// Is ajax request var ?
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])=="xmlhttprequest") {
// do your ajax code
} else {
// redirect user to index.php since we do not allow direct script access, unless its ajax called
$redirect='/index.php'; //URL of the page where you want to redirect.
header("Location: $redirect");
exit();
}
} ?>
答案 1 :(得分:1)
实际上没有办法以100%的确定性来实现这一点 - 问题是,对您的网站的AJAX和常规Web浏览器调用都使用相同的底层协议:HTTP。如果站点的完整性和安全性取决于阻止HTTP客户端请求特定URL,那么您的设计是错误的。
那么如何阻止人们直接访问某些目录中的文件,同时让网站使用它们呢?
创建一个控制器文件。将所有AJAX请求发送到此控制器。
Ajax的control.php
<?php
$is_ajax = true;
include "ajaxincludes/test.php";
// ... use the ajax classes/functions ...
ajaxincludes / test.php的
<?php
if (!isset($is_ajax) || !$is_ajax)) {
exit("Hey you're not AJAX!");
}
// ... continue with internal ajax logic ...
如果客户端尝试直接在http://mysite/ajaxincludes/test.php访问该文件,则会收到错误消息。访问http://mysite/ajax-control.php将包含所需的文件。
答案 2 :(得分:1)
一个非常简单的解决方案是打开您要保护的每个文件,使其免受直接URL输入和将以下内容添加到顶部:
<?php if (isset($_GET['ajax']) != true) die();?>
现在摆脱你的重定向脚本,因为它现在没用了。您不需要为此使用会话。每次请求页面时,请使用它的直接网址,只需在其末尾添加?ajax=1
即可。
通过添加?ajax=1
,PHP会将{ajax
'的键设置为$_GET
全局变量,其值为1
。如果从URL中省略?ajax=1
,则PHP不会在ajax
中设置“$_GET
”的键,因此当您检查它是否设置为isset()
时,它将返回false因此脚本将死亡而不输出任何内容。基本上,如果?ajax=1
位于URL的末尾,页面将仅输出数据。
有人仍然可以“欺骗”网址并自行添加“?ajax=1
”,但这不是人或网络浏览器的默认行为。如果你绝对需要防止这种情况,那么它会更加复杂,例如:使用公开文件夹之外的模板。大多数其他“简单”的解决方案都具有相同的“欺骗”潜力。
答案 3 :(得分:0)
由于HTTP请求标头可以伪造,因此我认为没有一种确定的方法可以满足您的要求。但是,您可以使用$_SERVER['HTTP_REFERER']
查看该请求是否来自您网站上的其他网页。
如果您网站上的其他安全性良好,则此方法的失败不会授予用户访问他们无法访问的任何内容的权限。
答案 4 :(得分:0)
我从来没有尝试过这个,但也许你可以用jQuery的.unload()做一些事情,然后调用PHP页面到unset()
会话。
答案 5 :(得分:0)
为什么不(在Ajax页面上):
session_start();
if($_SESSION['download']!=='ok'){
$redirect='/index.php'; //URL of the page where you want to redirect.
header("Location: $redirect");
exit;
}
// do whatever you want with "access granted" user
// remove the download flag for this session
unset($_SESSION["download"]);