间歇性 HTTP 403 禁止错误调用相同的 Ajax 代码

Posted

技术标签:

【中文标题】间歇性 HTTP 403 禁止错误调用相同的 Ajax 代码【英文标题】:Intermittent HTTP 403 Forbidden error calling same Ajax code 【发布时间】:2015-03-15 22:01:25 【问题描述】:

我使用我的 javascript 客户端(例如,foo.js)在服务器中调用我的 php Ajax 代码(例如,bar.php)。这在大多数情况下都可以正常工作,但偶尔我会返回 HTTP 403(禁止)而不是通常的 200(OK)。使用完全相同的代码、相同的参数等会发生这种情况。

为什么会这样?我该如何解决?是否有可能由于我的bar.php 代码内部的某些操作而发生?我怎样才能记录它的原因?

foo.js 客户端:

function postAjax(url, queryString, callback) 
  var x = new XMLHttpRequest();
  x.onreadystatechange = function() 
    if (x.readyState === 4)   // 4=after HTTP response content finished loading
      if (x.status === 200) callback(true, x.responseText);
      else callback(false, x.status);
    
  ;
  x.open('POST', url, true);
  x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  x.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  x.send(queryString);


var params = 'aaa=xxx&bbb=yyy';
postAjax('bar.php', params, myCallback);

function myCallback(ajaxStatus, ajaxResponse)  /* do something */ 

bar.php 服务器:

<?php
header('Content-Type: text/plain');
$isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
if ($isAjax) 
  /* Do something with $_POST['aaa'] and $_POST['bbb'] */
  echo 'Success';

else 
  echo 'Error';

?>

附加新信息:

浏览器控制台(在本例中为 Firefox):

当一切都好时(大部分时间): + POST http://example.com/bar.php 200 OK ZZZms

当错误时(例如,在我最后一次尝试的第 7 次之后): + POST http://example.com/bar.php 403 禁止 X ZZZms 我在 ajaxResponse 中返回 403,它来自 x.status

在 Firefox 控制台中扩展“+”,我看到了响应:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /bar.php
on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

查看 Apache Raw Accwss 日志(通过 cPanel),我看到所有类似的 POST 行,在第 7 次测试中状态从 200 更改为 404:

<my IP> - - [17/Jan/2015:09:55:50 -0500] "POST /bar.php HTTP/1.1" 404 - "<my test url>" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"

“您没有访问权限”???我怎么有 6 次权限,但第 7 次没有?

同时查看 Apache 错误日志(通过 cPanel),我看到了一行:

[Sat Jan 17 09:55:50 2015] [error] [client <my IP>] File does not exist: /home/<my user>/public_html/403.shtml, referer: <my test url>

【问题讨论】:

我看不出这个脚本应该返回 403 状态码的原因。你能看看 apache error.log 吗? 你能告诉我们你的 if ($isAax) 中的代码吗? 我在上面使用“编辑”功能添加了更多信息 - 请查看。似乎偶尔我在服务器中收到“您无权访问/bar.php”...怎么可能? 我遇到了似乎是同样的问题。一个文件上传系统,它以 5 兆分段发送。它工作了数千次,直到一个文件不断崩溃。更改段大小为我“修复”了它。可能不是永久的。 【参考方案1】:

做了一些深入的研究。这是... mod_security !!!

查看http://www.opensourceforu.com/2011/08/securing-apache-part-10-mod_security/,搜索“SecFilterScanPOST”。我的“aaa”发布变量用作一些随机令牌,并且偶尔会有一个被这个 mod_security 机制过滤的值。

在与主机支持聊天后,此问题已得到修复。最初我认为我可以通过适当地编辑一些 .htaccess 文件来自己解决这个问题,但最终看来我需要他们的帮助。

【讨论】:

我有同样的问题,但据我所知没有安装 mod_security。我很想尝试安装 nginx,作为 Apache 的更新且可能不那么臃肿的替代品,Apache 已经存在了几个世纪。

以上是关于间歇性 HTTP 403 禁止错误调用相同的 Ajax 代码的主要内容,如果未能解决你的问题,请参考以下文章

JFrog Artifactory 间歇性拒绝身份验证,403 被禁止

收到 403 禁止错误。客户端身份验证方案“匿名”禁止 HTTP 请求

Django + ajax(jquery):http错误代码403(禁止)[关闭]

列表订阅操作:403 禁止

如何解决安装IIS时出现HTTP错误403禁止访问?

HTTP 错误 403.9 - 禁止访问:连接的用户过多