网站报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来体现,但在需求能够直接被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的1个小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); // 不转换任何引号