以下是我遇到的问题的一个最小工作示例。我现在知道错误似乎与我的服务器/设置有关,但我仍然很好奇发生了什么。有两个文件,m1.php 和 m2.php:
m1.php
<form action="m2.php" method="post">
<br> <input type="text" name="j" />
<input type="submit" VALUE="Ok" />
</form>
m2.php
<?php
print_r($_POST);
?>
一切都按预期进行(当您单击“确定”时,它会打印包含输入框中的值的数组),但有以下例外:如果我输入的字符串是
VALUE';WAITFOR DELAY '00:00:24';--
表单未得到处理。从上面的字符串中删除一个字符不会出现任何问题。
检查服务器日志,当输入上述字符串时,日志中不会出现 POST 请求,而输入我能想到的其他字符串时,日志中会出现。问题似乎出在服务器端,因为 Fiddler 显示 POST 请求的内容为
j=VALUE%27%3BWAITFOR+DELAY+%2700%3A00%3A24%27%3B--
我可以在不同平台的不同浏览器中重现此问题。这是 Apache 的问题吗?也许是 php?我怎么知道的?
我在网站上运行安全审计时发现了这个问题。没有运行 SQL 服务器,但审计报告了这个问题。我很好奇为什么那个特定的字符串会触发这种行为。
编辑:如果有人感兴趣的话,我刚刚注意到上面描述的行为根本不依赖于 php 代码。事实上,如果我通过 Fiddler 向服务器上不存在的页面发送 POST 请求,只要帖子内容包含上述字符串的某个字段,请求就不会得到答复。所以这似乎是 Apache 的问题。