WEB2.0的普及,丰富了各类WEB产品。WEB交互能力的增强,也滋生出种类繁多的安全威胁,用户输入便成了万恶之源,不仅威胁用户信息安全,也给服务器、操作系统,甚至整个局域网带来灾难,因此,验证用户输入是WEB应用必不可少的安全防范举措。

1 输入为何需要验证

输入验证一般基于两个方面的原因:一是为了保证业务功能的合理性,二是为了保证用户数据、应用程序及内部系统和网络的安全。

1.1 业务层面

从业务的有效性和合理性来说,用户提交的参数都需要进行验证。在业务层面可能要求用户名只能包含大小写字母、数字,长度必须小于12位等;密码必须同时包含字母、数字、特殊字符,且长度必须大于8位等;金额必须在(0~1000]之间……诸如此类,我们的应用程序都需进行检测。可以想象,在金融类系统中,如果不对金额进行有效性检查,在转账类业务中,如果提交转账金额-10000¥,那是不是等同于对方给我转了10000¥呢。

1.2 安全层面

从另一个安全层面来说,输入验证则显得尤为重要,而这一点恰恰容易被开发者所忽略,众多的WEB漏洞中,无不因输入引起。如果你的应用中涉及如下功能,那么就得考虑是否有相应的验证和防护措施。

类型

功能

安全威胁

说明

输入

服务器端

响应

输入作为响应body的一部分

XSS

XXE

XML作为参数传递

输入作为响应header的一部分

CRLF

输入作为邮件的一部分

SMTP注入

响应中包含输入指定的文件

目录遍历

重定向至输入指定的网页

任意重定向

输入

服务器端

执行代码

输入嵌入SQL语句中

SQL注入

输入嵌入XPath表达式

XPath注入

输入嵌入LDAP语句

LDAP注入

输入作为应用代码执行

OS命令注入

文件上传

后门

输入

服务端

API参数

服务器端包含输入指定的文件

文件包含

服务器端请求输入的网址

服务器端HTTP重定向

不同应用之间通过输入参数互相调用

SOAP注入

使用SOAP

JSON注入

使用JSON

XML注入

使用XML

HTTP参数注入

……

表1-1功能和安全威胁对照表

2 哪些输入要素需要验证

上面已经提到如果不验证输入带来的威胁,那到底哪些输入需要验证呢?这就得先了解信任边界。

2.1 信任边界

信任边界是以组件或者功能单元进行区分,在信任边界外的所有输入均需验证。下图展示了一个典型的信任边界验证的例子(各个组件在执行操作前,均需输入验证):

图2-1 信任边界确认

(1)      应用程序收到用户提交的输入。表单处理程序确认每个输入仅包含的合法字符、特殊长度限制,应转义或者过滤任何已知的攻击特征。

(2)      应用程序执行SQL查询。为防止SQL注入, DAO执行查询前,应用程序应对用户输入中包含的可用于攻击数据库的所有字符转义。

(3)      将用户提交的某些输入数据提交给SOAP服务,进一步获取相关数据。为防止SOAP注入,SAOP查询组件需要对用户提交数据中的任何XML元字符进行适当编码。

(4)      应用程序在用户的浏览器中显示响应数据。为防止跨站脚本攻击,输出组件需对植入返回页面中的任何用户提交数据执行HTML编码。

2.2 输入来源

在WEB应用中,输入来源基本可分为两类:一类由用户提交,另一类则来自于共享数据。用户提交的数据主要包括:

(1) 查询参数

(2) POST参数

(3) Cookie

(4) Referer

(5) REST参数

共享数据主要包括:

(1) 共享数据库

(2) 共享文件数据

(3) 网络数据

3 如何验证输入

输入验证的方式按照输入的类型有所不同,输入的类型可归纳为两类:常规参数和文件。当然,这里不涉及业务层面的合理性验证。

3.1 常规参数的输入验证

常规参数的输入验证方法需要根据特定的功能而定,主要有如下方法:

方法

说明

备注

字符转义

对影响程序结构和逻辑,以及改变输出效果的特殊字符均需转义。

效果比较好,且不影响业务功能。

字符过滤

对影响程序结构和逻辑,以及改变输出效果的特殊字符均需过滤。

效果比较好,但特殊字符可能与业务要求冲突。

白名单

只接受特定的输入,其他均忽略。

效果非常好,但适用性低,适合需要严格检查的业务。

黑名单

不接受特定的输入,其他均接受。

效果差,特别针对XSS等此类变种很多的安全威胁。

映射

建立映射关系,外部使用映射对象,而非直接使用源数据

效果非常好,但适用性低,适合需严格检查且不希望泄露源数据的业务。

表3-1 常规参数输入验证方法

如下针对各类安全威胁,列举了行之有效的参数输入验证方法:

类型

安全威胁

输入验证方法

输入

服务器端

响应

XSS

纯文本的参数:输出时转义<、>、&、{、}、#、"、'、;、/、[、]为HTML实体,对于DOM型XSS,则需确保JS在使用参数前,转义这些特殊字符。

富文本的参数:

1、  格式化输入,保证所有数据均可被识别和标准化;

2、  采用白名单的机制,明确允许出现哪些标签、哪些属性,对不允许出现的标签和属性值进行干扰或移除;

3、  对特定的属性值进行检查,比如:url必须以http://或https://开头,或者以/开头等。

4、  对标签内的特殊字符(<、>、"、'等)采用HTML实体转义。

XXE

优选方案:在解析XML时,不解析外部实体。

CRLF

移除%0D%0A或者其他形式的回车换行符。

SMTP注入

移除%0D%0A或者其他形式的回车换行符。

正文中不允许仅包含.的消息行。

目录遍历

对输入解码和规范化,拒绝包含、/以及空字符的请求。

检查是否请求相应目录、相应后缀的文件。

或者使用白名单指定允许访问的文件列表,拒绝其他文件的访问。

任意重定向

对输入解码和规范化,检查重定向地址是否在合法域内。

输入

服务器端

执行代码

SQL注入

参数化查询。

XPath注入

仅允许字母数字。

拒绝包含(、)、=、'、[、]、:、,、*、/,以及所有空白符的请求。

LDAP注入

仅允许字母数字。

拒绝包含(、)、;、,、*、|、&、=,以及空字符的请求。

OS命令注入

避免直接调用操作系统命令。

白名单限制允许调用的系统命令,拒绝白名单之外的命令执行。

输入

服务端

API参数

文件包含

白名单限制允许包含的文件,拒绝白名单之外的文件包含。

服务器端HTTP重定向

建立重定向地址的强随机映射表,外部提交随机字符,应用程序则根据随机字符匹配重定向地址,拒绝无法映射的重定向。

SOAP注入

       解码后转义<、>、/ 为&lt;、&gt;、&#47。

XML注入

解码后转义<、>、/ 为&lt;、&gt;、&#47。

JSON注入

解码后转义'、"、、{、}、[、]为'、"、\、{、}、[、]。

HTTP参数注入

解码后转义&为%26

表3-2 常见安全威胁输入验证方法

3.2 文件上传的输入验证

文件上传时,如果验证不当,则很可能被用于上传恶意文件,也就是说,服务器以及内部网络可能完全沦陷。一般地,需对上传文件执行如下检查:

(1) 文件类型:最好使用endWith检查上传文件名中的文件类型。

(2) 文件头:检查二进制文件的文件头是否为白名单文件类型的文件头。

(3) 文件格式:检查文件的格式是否为白名单文件类型的格式。

以上只是简单总结WEB应用常见安全威胁的一般输入验证方法,在具体的项目开发过程中,还需要有针对性的调整验证策略。希望此文能给各位开发、测试人员以及白帽子们有所帮助。

WEB应用安全之输入验证相关推荐

  1. WEB安全:浅谈输入验证

    近期负责一个主站系统的Code Review,过程中排查了一些由于输入验证引起的安全漏洞,但遗憾的是遗漏了一个分支功能点,导致线上用户昵称可能存在被篡改的风险.打算总结分享一些安全方面的经常,所以有了 ...

  2. 好程序员web前端教程分享JavaScript验证API

    好程序员web前端教程分享JavaScript验证API,小编每天会分享一下干货给大家.那么今天说道的就是web前端培训课程中的章节. JavaScript验证API 约束验证DOM方法 Proper ...

  3. web安全性测试用例(输入、输出、SQL注入、跨站请求伪造(CSRF)、跨站脚本攻击(XSS))实实在在的干货

    https://www.cnblogs.com/qmfsun/p/3724406.html 建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 1.   输入验证 ...

  4. WEB安全基础入门—身份验证漏洞

    欢迎关注订阅专栏! WEB安全系列包括如下三个专栏:! <WEB安全基础-服务器端漏洞> <WEB安全基础-客户端漏洞> <WEB安全高级-综合利用> 知识点全面细 ...

  5. 登录工程二:现代 Web 应用的典型身份验证需求

    朋友就职于某大型互联网公司.前不久,在闲聊间我问他日常工作的内容,他说他所在部门只负责一件事,即用户与登录. 而他的具体工作则是为各个业务子网站提供友好的登录部件(Widget),从而统一整个网站群的 ...

  6. 《产品经理心得》02:表单提示和输入验证方案

    内容导航: 前言 1.作品案例 2.提示的类型 3.按照时间顺序划分 4.建议 前言 表单是Web设计中使用频次非常高的页面,那么,其用户体验也占据了整个产品体验的很大比例.因此,如何统一的设计表单提 ...

  7. 安全编程-安全输入验证

    在几乎所有安全的程序中,你的第一道防线就是检查你所接收到的每一条数据.如果你能不让恶意的数据进入你的程序,或者至少不在程序中处理它,你的程序在面对攻击时将更加健壮.在不得不接收输入,但是又不能相信输入 ...

  8. 登录工程:现代 Web 应用的典型身份验证需求

    朋友就职于某大型互联网公司.前不久,在闲聊间我问他日常工作的内容,他说他所在部门只负责一件事,即用户与登录. 而他的具体工作则是为各个业务子网站提供友好的登录部件(Widget),从而统一整个网站群的 ...

  9. Project Web Access 2007自定义FORM验证登录实现 zt

    背景: Project Server 2007安装后生成的WEB管理网站Project Web Access默认采用Windows验证,并自动将安装时登录系统的计算机管理员指定为Project Web ...

最新文章

  1. 机器学习-终结者是否会出现
  2. android23 imei 权限,android------关于API 23的权限问题
  3. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
  4. Java常见排序算法之直接选择排序
  5. 【Leetocde | 10 】54. 螺旋矩阵
  6. 论文阅读课8-Chinese Relation Extraction with Multi-Grained Information and External Linguistic Knowledge
  7. bzoj 4551[Tjoi2016Heoi2016]树
  8. PAT 乙级 1023. 组个最小数 (20) Java版
  9. PE框架学习之道:PE框架——style的配置
  10. labelimg安装教程
  11. 雨流计数法的matlab实现,采用三点法与四点法
  12. 旅游B2B2C系统解决方案
  13. thought work java,ThoughtWorks
  14. LeanCloud带图形校验码的短信发送Vue组件开发
  15. matlab 微分符号,Matlab 符号微积分
  16. bash通配符(wildcard)和特殊符号
  17. MySQL表结构的管理
  18. radosgw bucket index sharding
  19. 电阻、二极管、三极管搭出的逻辑电路
  20. 经典RPG游戏的七个次重要要素

热门文章

  1. ROS Qt5 librviz人机交互界面开发一(配置QT环境)
  2. 计算两个矩阵的行向量之间的欧式距离
  3. distinct 使用
  4. android seek to,android – MediaPlayer seekTo从一开始就不一致地播放歌曲
  5. matlab legend对齐,MATLAB中不正确的图例框大小?(Improper legend box size in MATLAB?)
  6. SuperMap iServer在不同系统中设置开机自启动--Linux篇
  7. Flask之SQLAlchemy
  8. Php资讯瀑布流模板,无限下拉加载瀑布流zblogphp模板 还有自适应+seo优化-收费zblogphp模板-天兴工作室...
  9. linux 两个版本GCC共存,Centos软件gcc 多版本共存
  10. MySQL 多表联合查询有何讲究?