课程表

网络安全课程

工具箱
速查手册

验证用户输入(一)

当前位置:免费教程 » 其他 » 网络安全
注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2017/11/3 16:46:06

在一个交互的HTML页面或者原生态APP等窗体上,都会有用户输入、服务器响应的内容。一般情况下,我们都会对用户的输入类型做一些文字说明,我们希望每个用户都按我们的提示来输入数据,但实际上,总有一些“不听话”或者不太熟悉流程的用户,会输入各种奇葩的数据。如果我们没有一个验证机制,就可能产生一些程序错误,导致影响用户体验。更糟糕的是,单纯文字的提示对黑客来说,不但没有阻挡作用,反倒给他们带来了帮助——黑客会专门输入你提示的数据类型伺机发动攻击。

为了对这些输入数据进行验证,我们有必要对每个控件中输入的数据进行验证。


一、需要验证哪些方面

总的来说,我们大致需要对这些输入进行如下方面的验证:

1、验证控件值是否符合特定格式

通过比较用户输入的数据格式,是否和我们规定的格式一样,例如,字符的数量多少,是否支持小数点、字母,数值的范围,特定的字符格式(例如Email、手机号、电话号码、身份证号等)。

2、验证是否会导致错误阻塞

某些用户输入可能会导致引发一个错误信息,导致窗体崩溃,例如读写数据库错误、读取文件/文件夹权限不够等。如果我们不做任何处理,玩玩会导致一些技术信息泄露,例如出错部分的详细代码。这些代码可能会被黑客利用。

3、欺骗和恶意代码

某些情况下,例如HTML页面,黑客会修改收到的静态文件,利用其中的表达提交信息,绕开一些验证,然后任意输入ta想要输入的信息提交给服务器。这时我们不加验证,就会全盘接受这些信息。而这些信息中可能包含一些恶意代码,导致程序崩溃或溢出异常。下面列出一些常见的恶意代码攻击方式:

  • 输入超出长度的字符,导致缓冲区溢出会程序错误
  • 权限方面的攻击代码,例如给自己添加一个管理员账号
  • 一个SQL语句,对数据库进行肆意的增删改操作。如果数据库泄露,许多重要的用户信息将会被黑客下载利用

二、客户端验证和服务器验证

那么,如何防范这些黑客、或者无意识的用户提交的非法数据呢?大体来说,我们可以从客户端和服务器端两方面进行验证,来防范非法数据。

现代的浏览器,都支持客户端验证(一般是HTML5+JavaScript方式),而一些原生态的APP窗体也支持客户端验证。由于HTML5+JavaScript都可以被浏览器解释并直接运行,服务器不需要执行任何操作,客户端和服务器之间也没有任何数据往返,因此客户端验证可以有效的减轻服务器负担。而增加客户端验证后,也增大黑客攻击的成本,因为其必须花一定时间去去除这些验证方式。

现代的浏览器已经能够比较好的支持标准化的HTML5和JavaScript,因此兼容性上的问题会原来越少。例如,可以在页面上增加一个HTML5控件,让用户只能输入Email地址:

  1. E-mail: <input type="email" name="user_email" />

同样的,如果只想让用户输入数字,可以使用这样的H5控件:

  1. 年龄: <input type="number" name="user_age" />

更多的关于H5表单控件的知识,请点击这里

某些情况下,可以一个表单失去焦点就对其进行验证,当然也可以采取在最后时刻对其验证的方式。总之,客户端验证是初步保证了用户数据的合法性,在这一层基本上就可以排除无恶意用户的错误输入了。

但是,仅仅有客户端验证对于一个有目的的黑客来说,只是一种骚扰,起不到根本性的防护作用。因此,必须在接受用户输入数据后,对其进行服务器端的验证。原则上,客户端必须对每一条输入都进行验证,而服务器应该再一次验证这些输入。服务器端验证的基本思想是,防止输入的数据绕过客户端的代码,对服务器进行攻击。

例如,我们必须验证一个用户输入的姓名中,是否含有单引号(')之类的注入语句。也许你觉得只验证文本框的内容就可以了,但是黑客通过同名的方法,很容易绕过这些限制。由于目前的编程语言大部分只能识别提交来的数据的方式,是GET还是POST,而没有办法验证是什么样的控件提交来的。

我们还可以添加一个限制,即从某一地址传来的表单数据才是有效的,而其他一切数据都是非法的。这一方法在服务器被非法上传了文件后会失效,但它会保证问题不是出在当前页面。

我们可以从以下方面对数据进行验证:

  • 验证一个值是否是空
  • 验证两个控件的值是否相等(常用于确认密码)
  • 验证一个值是否会导致程序错误、泄露代码,或者导致程序崩溃或溢出
  • 验证一个值是否包含HTML、JS等代码
  • 验证一个值是否包含非法的SQL注入字符串
  • 验证一个值的类型,如果要求是数字,是否处于某一范围;如果要求是字符,长度是否超过限制
  • 验证一个值是否符合某些正则表达式,如,是否是Email地址、Url地址、身份证号、手机号、邮政编码等

在以后的章节中,会更加详细的介绍对用户输入的验证。

注意:本页面内容为W3xue原创,未经授权禁止转载,违者必究!
来源:W3xue  发布时间:2017/11/3 16:46:06
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号