Php ajaxurl给出了403,使用了一个特定的词";祭坛;或;祭坛;其他URL工作正常

Php ajaxurl给出了403,使用了一个特定的词";祭坛;或;祭坛;其他URL工作正常,php,ajax,http-status-code-404,Php,Ajax,Http Status Code 404,当我使用单词“祭坛”或“祭坛”后跟空格时,使用ajax作为GET发送到php文件的url会给我一个403错误。这是一个教堂遗址,所以他们当然会用这个词 在我在参数中使用这个词之前,代码工作得非常好。例如,即使使用内部url和特殊字符,以及单个引号,这种方法也可以很好地工作: ad2calendar.php?ajax=1&u=testuser&d=2013-11-30&s=1&iurl=table.jpg&eEvent=%3Ca%20href%3D'someurl.com'%20title%3D%

当我使用单词“祭坛”或“祭坛”后跟空格时,使用ajax作为GET发送到php文件的url会给我一个403错误。这是一个教堂遗址,所以他们当然会用这个词

在我在参数中使用这个词之前,代码工作得非常好。例如,即使使用内部url和特殊字符,以及单个引号,这种方法也可以很好地工作:

ad2calendar.php?ajax=1&u=testuser&d=2013-11-30&s=1&iurl=table.jpg&eEvent=%3Ca%20href%3D'someurl.com'%20title%3D%22Phony%20URL%22%20%3EA%20Phony%20URL%3C%2Fa%3E%0ASome%20special%20chars%20!%40%26%5E%25%23%24(%23%40%22%22¬es=test&eTitle=test&y=2013&m=11

但这给了我一个403,因为它包含一个带有空格的单词“祭坛”

ad2calendar.php?ajax=1&u=testuser&d=2013-11-30&s=1&iurl=&eEvent=table%20¬es=test&eTitle=test&y=2013&m=11

你有没有想过为什么这样一个简单的词会破坏URL,导致403

我自己的故障排除发现403来自一个比php文件更高的目录(php位于一个密码保护的目录中)。我想这可能是因为我最近将文件更改为UTF-8时出现了一些字符编码问题,但在其他情况下似乎可以正常工作。尝试使用空白的.htaccess文件,因此在表单字段上使用encodeURIComponent不会进行mod_重写。脚本不会检查此字符组合和重定向

我有php严格的错误报告,没有抛出php错误,也没有javascript错误。我似乎得到的唯一错误与结果div中显示的403页面有关,因为403页面使用的资源不在该目录位置

代码本身相当复杂,所以我无法真正开始发布所有的代码。只是想寻找一些进一步的故障排除方法。老实说,我很快就会为这个词进行破解

更奇怪的是,我能在一两个月前使用这个词,但如果我将代码回滚到那个点,错误仍然存在

从我的原始访问日志中,第一个包含“祭坛”并给出200,第二个包含带有尾随空格的“祭坛”并给出403

XXX.XXX.XXX.XXX - - [11/Nov/2013:12:35:22 -0500] "GET /ad2calendar.php?ajax=1&u=testuser&d=2013-11-30&s=0&iurl=&eEvent=Altar&notes=&eTitle=&y=2013&m=11 HTTP/1.1" 200 20102 "http://XXXXX/ad2events.php" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16"

XXX.XXX.XXX.XXX - - [11/Nov/2013:12:35:29 -0500] "GET /ad2calendar.php?ajax=1&u=testuser&d=2013-11-30&s=1&iurl=&eEvent=Altar%20&notes=&eTitle=&y=2013&m=11 HTTP/1.1" 403 1098 "http://XXXXX/ad2events.php" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16"
发现尖括号中的文本“script”也将给出403。示例:

<script > alert("I am Bad"); </script >
alert(“我坏了”);

上面给出了403错误。这证实了导致此错误的是某些安全功能或编码问题。

您所描述的行为听起来像是编写错误的规则的行为-可能是试图阻止注入的SQL包含命令,如
ALTER TABLE
,但其中包含了关键单词规则拼写错误(!)。请与您的网络主机联系以了解详细信息。

+1因为该规程能够使用以前版本的代码进行测试……只是说。是不是只有
sate
给出了404?那么
ltar
或者,
aaltar
呢?“ltar”给出了404,“aaltar”呢如果你在ubuntu上使用apache,你可以在复制错误的同时
tail-f/var/log/apache2/error.log
。你的主机在这台服务器上使用任何形式的SQL注入保护吗?我想知道是不是有什么东西应该阻止alter这个词,但是却阻止了Table。谢谢,这是我能想到的唯一解释。我将与我的web主机讨论这个问题。我实际上是进去设置了SQL的用户权限,以允许该用户使用alter,从而允许alter Table,但可能如果主机上的更高级别在规则中拼写错误,则不会。我要提到的是,在同一站点上运行的另一个用于图像幻灯片放映的数据库,该数据库允许使用此单词,但使用的是完全不同的php/sql代码。为上述两个请求添加了原始访问日志项。其中一个会通过mod_security and one not and“Alter”(SQL关键字)将通过。我突然想到,第一个请求不包含空格。除了“祭坛”之外的其他单词是否也会得到相同的结果?我无法让它失败,因为我尝试过任何其他单词,除了上面提到的,带尾随空格的“ltar”也会失败,“tar”成功。很奇怪!就像我说的,不过,跟你的网络主机谈谈。这几乎肯定是他们正在做的事情。