首页 > 如何避免HTTP表头注入使程序更健壮?

如何避免HTTP表头注入使程序更健壮?

如果一个网站使用了cookie,可通过注入HTTP表头的方式登录下面的表单

Username:
Password:

方法是注入一行新代码,如Set-Cookie,或使用SID,攻击例怎么做?又如何避免?


csrf http://en.wikipedia.org/wiki/Cross-site_request_forgery


B/S架构的软件,安全原则第一条就是:

任何来自客户端的数据都是不可信的。

都要做数据验证,过去大伙儿可能更多地关注$GET, $_POST, $_REQUEST,事实上还要把$_COOKIE, $_SERVER["HTTP*"]也加入待验证的行列来。

验证规则黑白名单结合,白名单就是只允许出现你的业务事先约定好的数据格式(如用户名只允许数字字母,出现了标点符号啥的就验证不通过),黑名单就是不允许出现你事先规定不喜欢的字符(如用户名里不允许出现fuck、admin、root)

验证通过的数据,放入到一个数组里,后面的程序代码要用时,从这个数组取数据(而不从$_POST/$_GET/$_REQUEST等原始用户输入去取了),这样可以100%防注入。


  1. 发生原因

首先,Http头注入发生的场景都是程序在HTTP头中使用了来自客户端发送的数据,比如在用户登录后,需要转向登录前的网址,如果使用Http头的Location:$url的话,就有可能发生HTTP头注入漏洞。
假如登录网页为login.php?url=http://xxxx/%0D%0ALocation:+http://hacker.com/ ,登录后如果直接转向URl里的url值的话,用户会被转向到http://hacker.com/ 因为url里包含%0D%0A,所以就会出现问题。因为http头都是以换行符分割的,一行一个。

当然,如果确实服务器端存在http头注入漏洞的话,那么%0D%0A后面也可以进行其它http头设置,比如set-cookie等等。

  1. 对策

2.1. 不在http头中使用客户端数据,比如上例的跳转目的地址可以固定为某一页面。
2.2. 检查http头是否有换行符

【热门文章】
【热门文章】