1.验证码技术
为什么必须使用验证码?验证码的主要目的是强制人机交互来抵御机器自动化攻击的。
普遍的客户端交互如留言本、会员注册等仅是按照要求输入内容,但网上有很多攻击软件,如注册机,可以通过浏览WEB,扫描表单,然后在系统上频繁注册,频繁发送不良信息,造成不良的影响,或者通过软件不断的尝试,盗取你的密码。而我们使用通过使用验证码技术,使客户端输入的信息都必须经过验证,从而可以解决这个问题。
一般的验证码是通过字符验证,但是字符验证很容易被别人识别,就算加上干扰线、字符旋转别人也能够识别一部分。后来,出现了语音验证,这个有点像听力,如果不是人为操作,应该不能有点难破解。逻辑验证,我个人觉得这个验证还是相当靠谱一点的,比如说“1+1=?”、“米饭和钢铁那个是食物?”,这类来源于正常人的百科知识,如果是机器人肯定是破解不了的,如果机器人破解了,人类就完了。不过逻辑验证可能会需要人工管理这些问题,这个是随之带来的麻烦。我没做过逻辑验证,只是这样猜想需要问题的存储和管理。
字符型验证防止被破解:
1、 背景干扰线尽量能够干扰到字符,采用和字符相同的颜色,能够破坏高亮度反差色提取法对字符的学习。QQ有采用。
2、 矢量变形:想Google、Ms、Yahoo都采用了这种变态的方法,这种将字符进行扭曲变形,基本上机器识别率为零,因为没有相对应的固定形状。
损失是用户也不一定认得。需要验证码图片有一些大才行。
3、 字符粘连,可以破坏掉字符切割法分割字符,Google也有用到这个,QQ也有采用。
4、 中文验证码,中文验证码的识别难度比较大,但是现在逐渐的也慢慢被学习并且破解。
5、 字符旋转:需要和字符粘连在一起才能够起作用,他们一起,验证码几乎不具备机器破解可能性。
2.防止SQL注入技术
刚开始学编程的时候,我经常这样写sql语句,比如说一个登录的sql
string login_sql = "select * from userTable where userID='"+this.txtUserID.Text+"' and userPass='"+this.txtPass.Text+"'";
这样做往往是由于经验不足造成的,程序员还处于一个天真的状态。
当用户输入用户名为“1 or 1=1 ”的时候,这段sql的原始意思就变了,用户随便就登录。
这样写存在验证漏洞,把sql语句的编写权分享给了用户,这是不明智的冒险行为。
所以我们要防范用户输入sql的关键词,比如“delete 、or、and、update、--”等等。
以前对付这种漏洞的方式主要有三种:
字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统 中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之 鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通 过拼接字符串出来的,还是会有漏洞。
参数化查询可有效防止sql注入
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才 套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。
当你输入用户名“admin”、密码“1 or 1=1”的时候,在参数化sql这里他的语句是这样
select * from userTable where userID=’admin‘ and userPass='1 or 1=1'''
3.数据库备份
一般人都明白,当发生意外的时候,有一个备注的话还是很庆幸的。
4.密码加密
即将用户注册时候的密码MD5加密保存到数据库,当登录的时候将用户输入的密码加密然后和数据库用户的密码匹配。
作用:防止别人知道了密码也不知道真实的密码,管理员都不知道用户的密码。
5.防范XSS攻击:跨站脚本攻击
XSS攻击的危害包括
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
我自己也曾在别人的网站上注入过一段javascript的弹框脚本,自己深有体会。
基于特征的防御:
一般xss攻击会有”javascript“这个关键词,所以我们可以对输入文件进行校验。也可以对输入的文本采用完全编码,这样javascript的脚本就失效了。
6.防止地址栏变量更改
http://www.weibo.com/order.html?id=1001&number=10&type=1&sign=y789rfsh9jl
类似这样,用MD5对前面的参数进行加密,加密后的结果为sign这个变量值。当到达目标页面后,对前面的参数进行加密并和sign匹配。