1.输入处理
输入处理为业务逻辑处理之前的数据准备阶段。
a.检验字符编码的有效性
b.必要时转换字符编码
c.检验参数字符串的有效性
检验字符编码:每种语言都有检验字符编码的函数,再输入处理中使用相应函数进行检验。
转换字符编码:转换字符编码的方法因编程语言而不同,可分为自动转换字符编码的语言和在脚本中手动转换字符编码的语言。
输入校验:今早发现输入错误并提示用户重新输入,提高了易用性;防止错误处理造成数据不一致等,提高了系统的可靠性。
安全性策略和输入校验:输入阶段实施的校验不能成为安全隐患的防范策略,输入校验是根据应用程序的软件规格而实施的操作。
根据应用程序的规格进行校验:
校验控制字符,换行符(CR和LF)和Tab等通常不显示在页面上、ASCIIb编码中0x20以下以及0x7F(DELETE)的字符、空字节。
校验字符数,应用程序的规格文档中应当明确定义所有输入项目的最大字符数。
需要校验的参数:输入校验的对象为所有的参数。
hidden参数、单选框、select元素;
Cookie中包含会话ID以外的值的情况下,Cookie值也是校验对象;
Referer等HTTP消息头也需要校验。
2.二进制安全与空字节攻击
二进制安全:不管输入值是怎样的字节列都能原封不动地对其进行处理的功能,特别是当包含零值字节(NULL字节,\0)时也能正确处理。
空字节:在C语言以及Unix与Windows的API中规定空字节为字符串的结尾。不能正确处理空字节的函数被称为不是二进制安全的函数。
空字节攻击:利用空字节攻击的手段被称为空字节攻击。空字节攻击本身并不造成伤害,而是通常被用于绕过其他安全隐患的防范策略。
检验脚本如下:
test.php
检验参数p是否只包含数字
http://www.wcs.com/test.php?p=1%00<script>alert('xss')</script>
通过%00截断绕过了ereg检验。ereg函数不是二进制安全的函数。
3.PHP的正则表达式库
利用正则表达式便利地实现输入校验。ereg系列,非二进制安全,在PHP5.3及以后已被废弃;
preg系列,仅在字符编码为UTF-8的情况下能正常处理中文字符;
mb_ereg3系列,适用于大多数字符编码。
通过在程序的开头使用preg或mb_ereg进行包含空字节的控制字符校验,能够同时进行应用规格中的字符种类校验和空字节校验。
4.输入校验与框架
在使用Web应用开发框架的情况下,可以利用框架中提供的输入校验功能,从而简化开发流程。
5.“非控制字符的正则表达式”
"确认输入值为0-100的字符且不包含控制字符"
PHP(preg_match),使用POSIX字符集:
PHP(preg_match),Perl风格的\P{Cc}:
PHP(mb_ereg),只能使用POSIX字符集:
Perl能使用\P{Cc}来指定控制字符以外的字符。Perl中可以使用正则表达式字面量,所以不必使用两个\来转义:
Java(String类的matchs方法),匹配规则为全体一致,所以正则表达式中不必使用\A和\z。Java中正则表达式的形式为字符串,所以需要使用两个\来转义。
VB.NET,.NET FRAMEWORK中提供了使用Regex类进行正则表达式查询的功能。VB.NET的字符串字面量中不需要使用两个\来转义。