详细描述:
为了方便的获得网站域名,开发人员一般依赖于HTTP Host header。例如,在php里用_SERVER["HTTP_HOST"]。但是这个header是不可信赖的,如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。
解决办法:
web应用程序应该使用SERVER_NAME而不是host header。在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一SERVER_NAME名单并开启UseCanonicalName选项。
个人建议:
这类的漏洞其实是URL的特使字符没做拦截导致,应该在拦截器针对URL和host头的特殊字符做拦截(放在第一条规则),返回404状态即可。可参考《web所需过滤的特殊字符》。