Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和AJAX安全问题_Php_Ajax_Security - Fatal编程技术网

PHP和AJAX安全问题

PHP和AJAX安全问题,php,ajax,security,Php,Ajax,Security,我目前正在构建一个web应用程序,其中使用jQuery的$.ajax函数将PHP文件加载到主文件中。然而,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可 所以我的问题是,最好的方法是什么,这样被“AJAX”嵌入的PHP文件就知道它包含在正确的页面中,并且可以正常工作,但是如果它是以任何其他方式访问的(即使有人在我的PHP文件中创建了自己的网站和AJAX),那么该文件应该说“拒绝访问”之类的话 提前感谢引用类似的 正如其他人所说,Ajax请求可以 被模仿,被模仿,被模仿,被

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

所以我的问题是,最好的方法是什么,这样被“AJAX”嵌入的PHP文件就知道它包含在正确的页面中,并且可以正常工作,但是如果它是以任何其他方式访问的(即使有人在我的PHP文件中创建了自己的网站和AJAX),那么该文件应该说“拒绝访问”之类的话

提前感谢

引用类似的

正如其他人所说,Ajax请求可以 被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿 标题。如果你想有一个基本的 检查请求是否是Ajax 请求您可以使用:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 //Request identified as ajax request
}
然而,你永远不应该以你的 这张支票的安全性。会的 消除对页面的直接访问 如果这是你需要的

请将此答案也考虑在内:

没有办法保证这一点 他们通过AJAX访问它。 直接访问和AJAX访问 来自客户,因此可以轻松 是假的

你为什么要这么做

如果是因为PHP代码不是 非常安全,使PHP代码更安全 保护(例如,如果您的AJAX 将用户id传递给PHP文件, 在PHP文件中编写代码以使 确保这是正确的用户id。)


以上链接的讨论中有更多聪明的想法。

这并不简单,很可能根本没有办法做到这一点。您可以要求在php文件中输入一些POST变量,并在AJAX请求中发送它们。这将保护您不受只在浏览器中粘贴URL的人的攻击

没有人可以从其他域(安全问题)AJAX您的站点,但始终可以连接并直接发送http请求,例如通过cURL


您可以在cookie中创建一些令牌,这也可以从jquery请求中看到,但该解决方案也可能被黑客攻击。

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

见:
在另一个域上运行的JavaScript无法访问域上的任何页面,因为这违反了。攻击者需要利用XSS漏洞进行攻击才能实现此目的。简言之,您不需要担心这种特定的攻击,只需要担心影响每个web应用程序的旧攻击

安全连接ajax和php需要某种方式。 你可以用

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

别忘了保护php文件,因为使用cURL可以伪造文件头。

在谷歌搜索了很多次后得出结论

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

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
  }
});
正在生成令牌:

注意:很抱歉嵌套IF..ELSE,但它增加了可理解性。 如果需要,您可以将所有三个功能简化为一个功能。增强了85%的安全性


只需在应用程序中设置会话,并检查会话是否已设置

session_start();
if(!isset($_SESSION['gebruikersnaam'])) {
  header('Location: path/to/app/home');
}
//Do stuff
您还可以使用以下选项:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 header('Location: path/to/app/home');
}
但并非所有浏览器都支持HTTP\u X\u请求的\u

为了获得额外的安全性,您可以检查ajax调用是否正在从应用程序中提交

  if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") {
   header('Location: path/to/app/home');
}

那么,应该如何使用XMLHttpRequest访问此页面呢?你知道同一原产地政策吗?我知道同一原产地政策。可以对XMLHttpRequest进行检查,以确定脚本是否已通过AJAX(即您自己的脚本)调用,或者是否有人将其浏览器指向此位置。不过,从自己网站的Firbug控制台调用脚本是另一回事;line让我的本地PHP用20秒重新加载页面。这将如何防止有人通过控制台发送调用?会有相同的HTTP\U引用器吗?在这种情况下,令牌是无用的,因为用户可以读取JS脚本(步骤2)。@zeuf:token由服务器在页面加载时“每次(每个请求)”生成。因此,这并不重要。@HardikThaker@zeuf如果您担心javascript中的令牌,您可以在服务器端使用salt。例如:
$randomNumber=rand(10009999)$browserToken=hash(“sha256”,$randomNumber)$saltValue=“abc123456”$serverToken=$browserToken$盐值$serverToken=hash(“sha256”,$serverToken)$_会话[“令牌”]=$serverTokenif(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 header('Location: path/to/app/home');
}
  if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") {
   header('Location: path/to/app/home');
}