网站报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中涵盖手表制作符的ajax请求就能实现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); // 不转换任何引号