web安全笔记(5)
1.2 处理用户的输入
很多针对web应用程序的攻击都涉及到提交未预期的输入,它导致了该应用程序设计者没有料到的行为。因此,对于应用程序安全性防护的一个关键的要求是它必须以一个安全的方式处理用户的输入。基于输入的漏洞可能出现在一个应用程序的功能的任何地方,并与每上通常使用的技术类型相关。对于这种攻击,输入验证是常用的必要防护。不存在通用的单一的防护机制。
1.2.1各种类型的输入
一个典型的web应用程序在不同范围形式内处理用户提供的数据。某种类型的输入验证可能对于所有这些输入形式是不可行的。
在许多情况下,一个应用程序对于特定的输入项能够实施非常严格的验证检查。比如提交给登录函数的用户名可以要求最大长度和只能包含字母。
在另外一些情况下,应用程序必须容纳更大范围的可能性的输入。比如提交给一个个人信息页面的地址字段,它可以包含字母、数字、空格、连接符,撇号以及其它字符。对于这种类型,仍然需要加以可行限制,如不能超过合适的长度,以及不能包含HTML标记。
在某些情形下,一个应用程序可能需要接受来自用户的任意的输入。比如,一个blog应用程序的用户,他创建的博客的主题的web应用程序攻击,那么他提交的内容则可以包含明显的所要讨论的攻击字符串。该应用程序需要以一个安全的方法把这些输入存储在一个数据库中并写到磁盘上,以及回显给用户。所以该应用程序就不能因为输入看起来有潜在的恶意简单拒绝。
除了来自用户的浏览器的各种输入外,典型的应用程序也接受从服务器到客户端,然后回传给服务器的数据。这些项目包括诸如cookies和隐藏的表单字段这些,它们不会被这个应用程序的普通用户所看到,但是对于攻击者来说是可见和可修改的。在这些情况中,应用程序可以对所接收的数据进行特定的验证。例如要求参数必须有一个指定数值集中的值,如表明用户所偏爱的语言的cookie,或以一个指定的格式,如一个客户的ID号。进一步说,当应用程序发现返回自用户的由服务器生成的数据已经被修改了的话,这通常就表明该用户正在探测应用程序的漏洞。在此类情况下,应用程序应该拒绝请求并记录下这个探测事件。
