PHP和AJAX安全问题

时间:2010-07-29 12:00:56

标签: php ajax security

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

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

提前致谢

7 个答案:

答案 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)

如果您担心其他人未经您的批准可能会访问您的内容,您也可以阻止热链接

请参阅: http://www.htmlbasix.com/disablehotlinking.shtml

答案 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');
}