2、处理用户的输入      

我们要这样认为,所有的用户输入都不可信。如何安全地处理用户输入是防御攻击的一个很关键的要求。一般的WEB程序都会在前台页面做输入确认(一般是js验证),不过这些都可以很简单的被攻击者绕过。
 
输入处理的方法:


①拒绝已知的非法输入,一般是采用黑名单的方法,黑名单中包括在攻击中使用的一直的字符串或者字符。这种方法效果不明显,首先是恶意的字符串或者代码可能会经过各种格式编码,再次是攻击技术在不断的发展,总会有一些字符串过滤不到(防御总是落后于攻击就是这个道理)。a、如果select被过滤,可以尝试SeLecT、sleslectct;b、如果or 1=1被过滤,尝试or 2=2;c、如果alert(‘xss’)被过滤,尝试prompt(‘xss’),还可以通过在表达式之间使用非标准字符串破坏应用程序执行的令牌,来避开特定关键字的过滤。如:select/*yeetrack.com*/username,password/*yeetrack.com*/from/*yeetrack.com*/users,或者<img%09 onerror=alert(1) src=a>,基于黑名单的过滤还容易收到空字符的攻击,空字符可能导致过滤器停止处理输入,如:%00<script>alert(1)</script>。

②只接受已知的正常输入,即设置白名单。白名单虽然确实有效,但是许多情况下不满足我们的需求。

③净化。这种方法是指WEB程序接收用户的输入,然后在后台对用户的输入进行净化。数据中可能存在的恶意字符被删除或者进行编码、转义。这种方法一般很有效,也被广泛使用。如:如果要防御xss攻击(关于xss攻击,参看: ),对用户的输入进行html编码,将>字符编码为&gt。虽然进行了转义和编码,但是对于在一个输入项中容纳集中可能的恶意数据,还是有可能产生攻击行为。
 
一个比较安全的流程如下:

①WEB程序收到用户的登陆信息,表单处理程序净化掉里面的非法字符,确认输入符合要求。

②WEB程序查询数据库获取用户密码。为防止sql注入(关于sql注入,参见:),在执行sql前,要对用户输入中包含的可用于攻击数据库的所有字符进行转义。

③用户登录成功,WEB程序将用户资料传给后台的soap服务,进一步获取用户的信息。为了防止对soap的注入攻击,需要对用户的输入进行任何xml元字符进行编码。

④WEB程序在用户的浏览器中显示用户的账户信息,为防止xss攻击,WEB程序对返回页面中用户提交的数据都要进行html编码。

摘自:?p=148