PHP和AJAX安全问题

car*_*663 25 php security ajax

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

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

提前致谢

Har*_*ker 56

谷歌搜索结束后的结论!

步骤1:为所有Web服务生成令牌系统:

生成令牌:

<?php
  session_start();
  $token = md5(rand(1000,9999)); //you can use any encryption
  $_SESSION['token'] = $token; //store it as session variable
?>
Run Code Online (Sandbox Code Playgroud)

第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
  }
});
Run Code Online (Sandbox Code Playgroud)

第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');
}
Run Code Online (Sandbox Code Playgroud)

注意:如果是嵌入式的话,请耐心等待,但这会增加不足之处. 如果有的话,你可以简化所有这三个.增强85%的安全性!

  • @HardikThaker @zeuf如果您担心javascript中的令牌-您可以在服务器端使用盐。例如:`$ randomNumber = rand(1000,9999); $ browserToken = hash(“ sha256”,$ randomNumber); $ saltValue =“ abc123456”; $ serverToken = $ browserToken。$ saltValue; $ serverToken = hash(“ sha256”,$ serverToken); $ _SESSION [“ token”] = $ serverToken;`然后在进行验证时,您只需重新创建serverToken并验证其是否匹配即可。 (2认同)

mid*_*dus 10

引用Eran Galperin的类似讨论

正如其他人所说,可以模拟Ajax请求创建正确的标头.如果您想要进行基本检查以查看请求是否是Ajax请求,您可以使用:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 //Request identified as ajax request
}
Run Code Online (Sandbox Code Playgroud)

但是,您永远不应该根据此检查确定安全性.如果这是你需要的,它将消除对页面的直接访问.

请将Jeremy Ruten的答案考虑在内:

没有办法保证他们通过AJAX访问它.直接访问和AJAX访问都来自客户端,因此很容易被伪造.

你为什么要这样做呢?

如果是因为PHP代码不是很安全,那么使PHP代码更安全.(例如,如果你的AJAX通过用户ID到PHP文件,在PHP文件编写代码,以确保是正确的用户ID).

在上面讨论的讨论中有更聪明的想法.


小智 5

安全连接ajax和php需要某种方式.您可以使用

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl")
{
 //Request identified as ajax request
}
Run Code Online (Sandbox Code Playgroud)

别忘了保护php文件因为cURL可以欺骗标题.