html 400 错误,网站报400Bad Request错误的解决办法

今天360搜索引擎例行的网站安全检查,网站后台记录下了这一过程:

0a9f824f5b5c3857ee2af1c52824a8cc.png

这里面我发现一些记录从后台无法打开的,例如这条:http://www.icvio.com/'))%20AND%202733=3566%16

原因很简单:这些是以制表符(tab)结尾的URL。这些URL是使用函数 htmlspecialchars()处理过的,将里面的单引号和双引号使用 % 加两位16进制数字替换了,访问这些URL时,IIS会返回400 bad request的错误:

5294e5b70c9721ef66b60a7bd82f57d4.png

这个错误页面是由IIS的底层http.sys直接返回的,既不能自定义错误页面,也不能进行URL重写。而我们想要的结果是访问这样的URL时,能自动跳转至正确的URL(去掉结尾的制表符)。

于是想借助IIS URL Rewrite Module来实现,但现在请求直接被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重写规则折衷地解决了问题:

番外篇:关于htmlspecialchars函数的用法

这个方法比较简单,用到的地方也很多,基本信息可以查看一下php手册,这里我给大家贴出他的常用的一些值:

$str = "Bill & 'Steve'";

echo htmlspecialchars($str, ENT_COMPAT); // 只转换双引号echo "
";

echo htmlspecialchars($str, ENT_QUOTES); // 转换双引号和单引号echo "
";

echo htmlspecialchars($str, ENT_NOQUOTES); // 不转换任何引号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值