我目前正在构建一个Web应用程序,其中PHP文件使用jQuery的$ .ajax函数加载到主文件中。但是,只需在地址栏中键入文件名即可在应用程序外部访问PHP文件。
所以我的问题是什么是最好的方法来使它成为'ajaxed'的PHP文件知道它包含在正确的页面中并且将正常运行,但是如果以任何其他方式访问它(即使有人要在他们的PHP文件中创建自己的网站和AJAX,那么该文件应该说“访问被拒绝”或其他什么。
提前致谢
答案 0 :(得分:54)
谷歌搜索结束后的结论!
步骤1:为所有Web服务生成令牌系统:
生成令牌:
<?php
session_start();
$token = md5(rand(1000,9999)); //you can use any encryption
$_SESSION['token'] = $token; //store it as session variable
?>
步骤2:发送ajax呼叫时使用它:
var form_data = {
data: $("#data").val(), //your data being sent with ajax
token:'<?php echo $token; ?>', //used token here.
is_ajax: 1
};
$.ajax({
type: "POST",
url: 'yourajax_url_here',
data: form_data,
success: function(response)
{
//do further
}
});
步骤3:现在,让我们使用
保护ajax处理程序PHP文件session_start(); //most of people forget this while copy pasting code ;)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//Request identified as ajax request
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl")
{
//HTTP_REFERER verification
if($_POST['token'] == $_SESSION['token']) {
//do your ajax task
//don't forget to use sql injection prevention here.
}
else {
header('Location: http://yourdomain.com');
}
}
else {
header('Location: http://yourdomain.com');
}
}
else {
header('Location: http://yourdomain.com');
}
注意:如果是嵌入式的话,请耐心等待,但这会增加无法理解的能力。 如果有的话,你可以简化所有这三个。增强85%安全性!
答案 1 :(得分:10)
从类似的Eran Galperin
中引用discussion正如其他人所说,Ajax请求可以 被模仿是创造正确的 头。如果你想要一个基本的 检查请求是否是Ajax 请求您可以使用:
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request }
然而,你永远不应该以你的为基础 这张支票的安全性。它会 消除对页面的直接访问 如果这就是你所需要的。
请在Jeremy Ruten之后考虑这个答案:
无法保证这一点 他们通过AJAX访问它。 直接访问和AJAX访问 来自客户,所以它很容易 被伪造。
为什么你要这样做呢?
如果是因为PHP代码不是 非常安全,使PHP代码更多 安全。 (例如,如果你的AJAX 将用户标识传递给PHP文件, 在PHP文件中编写代码来制作 确保这是正确的用户ID。)
在上面讨论的讨论中有更聪明的想法。
答案 2 :(得分:5)
安全连接ajax和php需要某种方式。 你可以用
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl")
{
//Request identified as ajax request
}
不要忘记保护php文件,因为cURL可以欺骗标题。
答案 3 :(得分:2)
如果您担心其他人未经您的批准可能会访问您的内容,您也可以阻止热链接
答案 4 :(得分:2)
在其他域上运行的JavaScript无法访问您域中的任何页面,因为这违反了Same-Origin Policy。攻击者需要利用XSS漏洞来解决这个问题。简而言之,您不必担心这种特定的攻击,只需要影响每个Web应用程序的旧攻击。
答案 5 :(得分:1)
这并不简单,而且根本没有办法做到这一点。您可以在php文件中要求一些POST变量,并在您的AJAX请求中发送它们。这样可以保护您免受仅在其浏览器中粘贴网址的人的侵害。
没有人可以从其他域AJAX您的网站(安全问题),但总是可以连接和drieclty发送http请求,例如通过cURL。
您可以在Cookie中创建一些令牌,也可以从jquery请求中看到,但该解决方案也可以被黑客攻击。
答案 6 :(得分:0)
只需在应用中设置会话并检查会话是否已设置
https/www.mysite.com:443/some-folder/xyz.html
你也可以使用它:
session_start();
if(!isset($_SESSION['gebruikersnaam'])) {
header('Location: path/to/app/home');
}
//Do stuff
但并非所有浏览器都支持HTTP_X_REQUESTED_WITH
为了获得额外的安全性,您可以检查ajax调用是否来自您的应用
if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
header('Location: path/to/app/home');
}