本篇不涉及具体语言,只从思路角度出发,阐述网络安全的攻防。
在一个交互的HTML页面或者原生态APP等窗体上,都会有用户输入、服务器响应的内容。一般情况下,我们都会对用户的输入类型做一些文字说明,我们希望每个用户都按我们的提示来输入数据,但实际上,总有一些“不听话”或者不太熟悉流程的用户,会输入各种奇葩的数据。如果我们没有一个验证机制,就可能产生一些程序错误,导致影响用户体验。更糟糕的是,单纯文字的提示对黑客来说,不但没有阻挡作用,反倒给他们带来了帮助——黑客会专门输入你提示的数据类型伺机发动攻击。
为了对这些输入数据进行验证,我们有必要对每个控件中输入的数据进行验证。
一、需要验证哪些方面
总的来说,我们大致需要对这些输入进行如下方面的验证:
1、验证控件值是否符合特定格式
通过比较用户输入的数据格式,是否和我们规定的格式一样,例如,字符的数量多少,是否支持小数点、字母,数值的范围,特定的字符格式(例如Email、手机号、电话号码、身份证号等)。
2、验证是否会导致错误阻塞
某些用户输入可能会导致引发一个错误信息,导致窗体崩溃,例如读写数据库错误、读取文件/文件夹权限不够等。如果我们不做任何处理,玩玩会导致一些技术信息泄露,例如出错部分的详细代码。这些代码可能会被黑客利用。
3、欺骗和恶意代码
某些情况下,例如HTML页面,黑客会修改收到的静态文件,利用其中的表达提交信息,绕开一些验证,然后任意输入ta想要输入的信息提交给服务器。这时我们不加验证,就会全盘接受这些信息。而这些信息中可能包含一些恶意代码,导致程序崩溃或溢出异常。下面列出一些常见的恶意代码攻击方式:
1、输入超出长度的字符,导致缓冲区溢出会程序错误
2、权限方面的攻击代码,例如给自己添加一个管理员账号
3、一个SQL语句,对数据库进行肆意的增删改操作。如果数据库泄露,许多重要的用户信息将会被黑客下载利用
二、客户端验证和服务器验证
那么,如何防范这些黑客、或者无意识的用户提交的非法数据呢?大体来说,我们可以从客户端和服务器端两方面进行验证,来防范非法数据。
现代的浏览器,都支持客户端验证(一般是HTML5+JavaScript方式),而一些原生态的APP窗体也支持客户端验证。由于HTML5+JavaScript都可以被浏览器解释并直接运行,服务器不需要执行任何操作,客户端和服务器之间也没有任何数据往返,因此客户端验证可以有效的减轻服务器负担。而增加客户端验证后,也增大黑客攻击的成本,因为其必须花一定时间去去除这些验证方式。
现代的浏览器已经能够比较好的支持标准化的HTML5和JavaScript,因此兼容性上的问题会原来越少。例如,可以在页面上增加一个HTML5控件,让用户只能输入Email 详文参考: