网站报400Bad Request错误的解决办法
今天360搜索引擎例行的网站安全检查,网站后台记录下了这一过程:
这里面我发现一些记录从后台无法打开的,例如这条://chixintf.com/'))%20AND%202733=3566%16
原因很简单:这些是以制表符(tab)结尾的URL。这些URL是使用函数 htmlspecialchars() 处理过的,将里面的单引号和双引号使用 % 加两位16进制数字替换了,访问这些URL时,IIS会返回400 bad request的错误:
这一严重错误信息网站新页面是由IIS的下层http.sys同时取到的,既没能自分类严重错误信息网站新页面,也没能展开URL重写。或许们如果的效果是网站访问这么的URL时,能电脑自动弹出至最佳的URL(清掉结束的做表符)。
既而想也是借助IIS URL Rewrite Module来实行,但现时post请求会直接被http.sys在表层手机阻止了,实际运到失败URL Rewrite Module。幸好,可能能够 注册申请表设置成让http.sys不手机阻止这些的URL。
注册成功表布置步骤下面:
regedit使用 公司注册表撰写器,加入HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
放入键值:AllowRestrictedChars REG_DWORD 1 (默认要求为0,会拦住\x00-\x1F与\x7F-\x9F的字符串,制作表格符的ASCII码是\x09)
重新启动http.sys与IIS,使注测表的设为开始生效:
net stop http
net start http
iisreset
那样布置后面,URL中包涵制作表格符的申请就能到了IIS URL Rewrite Module,后来用一只URL重写原则通过重定向分配转跳。最终结果却找到关键不了功效,没通过转跳,一样是400误区,只的今天是由ASP.NET跳回的。
HTTP Error 400.0 - Bad Request
ASP.NET detected invalid characters in the URL.
这可能是URL Rewrite Module的个小bug。
最后用一个折衷的处理方式,不实行重定位跳转网站,只实行URL重写,这个虽然说URL错误,但最好网站需要通常仿问。
是结果应用了今天的URL重写原则折衷地很好解决了原因:
<rule name="endwith_tab" stopProcessing="true">
<match url="^([^.]+\.(?:html|php))[\x09]" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="{R:1}" appendQueryString="false" />
</rule>
番外篇:光于htmlspecialchars数学函数的使用说明
这样的措施是相对比较简单的,用在的部位也诸多,主要资料可核实以下php手则,这些我给各位贴出他的普遍的点值:
$str = "Bill & 'Steve'";
echo htmlspecialchars($str, ENT_COMPAT); // 只转换双引号echo "<br>";
echo htmlspecialchars($str, ENT_QUOTES); // 转换双引号和单引号echo "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES); // 不转换任何引号