PHP 和 AJAX 安全问题

2022-08-30 15:29:48

我目前正在构建一个Web应用程序,其中PHP文件使用jQuery的$ .ajax函数加载到主文件中。但是,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可。

所以我的问题是,最好的方法是什么,以便PHP文件被“ajaxed”知道它包含在正确的页面中并且将正常运行,但是如果以任何其他方式访问它(即使有人在我的PHP文件中制作他们自己的网站和AJAX),那么该文件应该说“拒绝访问”或其他什么。

提前致谢


答案 1

在谷歌搜索了很多之后,答案就结束了!

步骤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% 安全性增强 !


答案 2

引用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 是正确的。

在上面链接的讨论中有更聪明的想法。


推荐