PHP 和 AJAX 安全问题
我目前正在构建一个Web应用程序,其中PHP文件使用jQuery的$ .ajax函数加载到主文件中。但是,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可。
所以我的问题是,最好的方法是什么,以便PHP文件被“ajaxed”知道它包含在正确的页面中并且将正常运行,但是如果以任何其他方式访问它(即使有人在我的PHP文件中制作他们自己的网站和AJAX),那么该文件应该说“拒绝访问”或其他什么。
提前致谢
我目前正在构建一个Web应用程序,其中PHP文件使用jQuery的$ .ajax函数加载到主文件中。但是,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可。
所以我的问题是,最好的方法是什么,以便PHP文件被“ajaxed”知道它包含在正确的页面中并且将正常运行,但是如果以任何其他方式访问它(即使有人在我的PHP文件中制作他们自己的网站和AJAX),那么该文件应该说“拒绝访问”或其他什么。
提前致谢
在谷歌搜索了很多之后,答案就结束了!
步骤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:现在,让我们用,
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');
}
注意:抱歉嵌套 IF..否则,但它增加了可理解性。如果没有,您可以将所有三者简化为一个。85% 安全性增强 !
引用Eran Galperin从类似的讨论中
正如其他人所说,Ajax请求可以通过创建正确的标头来模拟。如果你想进行基本检查以查看请求是否是Ajax请求,你可以使用:
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request }
但是,您永远不应该将此检查的安全性基于此检查。如果这是您需要的,它将消除对页面的直接访问。
也請考慮到Jeremy Ruten的這個答案:
无法保证他们通过 AJAX 访问它。直接访问和 AJAX 访问都来自客户端,因此很容易被伪造。
为什么还要这样做?
如果是因为PHP代码不是很安全,请使PHP代码更安全。(例如,如果 AJAX 将用户 ID 传递给 PHP 文件,请在 PHP 文件中编写代码以确保该用户 ID 是正确的。
在上面链接的讨论中有更聪明的想法。