做项目也有一段时间了在程序中也遇到很多安全方面的问题也该总结一下了这个项目是一个CMS系统系统是用ASPNET做的开发的时候发现微软做了很多安全措施只是有些新手程序员不知道怎么开启下面我通过几个方面简单介绍
SQL 注入
XSS
CSRF
文件上传
SQL 注入
引起原因
其实现在很多网站中都存在这种问题就是程序中直接进行SQL语句拼接可能有些读者不太明白下面通过一个登录时对用户验证来说明
验证时的sql语句
select * from where user=
+txtUsername
Text+
and pwd=
+txtPwd
Text+
这是一段从数据库中查询用户对用户名密码验证
看上去好象没有什么问题但是实际这里面浅藏着问题用户名admin 密码admin
select * from where user=
admin
and pwd=
admin
如果用户和密码正确就可通验证如果我用户名asdf or = 密码随意输入
我们再来看语句
select * from where user=
asdf
or
=
and pwd=
执行后看到什么?是不是所有记录如果程序只是简单判断返回的条数这种方法就可以通验证
如果执行语句是SA用户再通过xp_cmdshell添加系统管理员那么这个服务器就被拿下了
解决方法
a 这个问题主要是由于传入特殊字符引起的我们可以在对输入的用户名密码进入过滤特殊字符处理
b 使用存储过程通过传入参数的方法可解决此类问题(注意在存储过程中不可使用拼接实现不然和没用存储过和是一样的)
XSS(跨站脚本攻击)
引起原因
这个也有时被人们称作HTML注入和sql注入原理相似也是没有特殊字符进行处理是用户可以提交HTML标签对网站进行重新的构造其实在默认的情况下在aspnet网页中是开启validateRequest属性的所有HTML标签后会NET都会验证
但这样直接把异常抛给用户多少用户体验就不好
解决方法
a 通过在 Page 指令或 配置节中设置 validateRequest=false 禁用请求验证然后我们对用户提交的数据进行HtmlEncode编码后的就不会出现这种问题了(ASPNET 中编码方法ServerHtmlEncode(string))
b 第二种是过滤特殊字符这种方法就不太提倡了如果用户想输入小于号(<)也会被过滤掉
CSRF(跨站点请求伪造)
引起原因个人认为csrf在Ajax盛行的今天来说倒是方便了因为它可以在你不知道的情况用你的通过验证用户进行操作所以也被称为浏览器劫持如果你已通过某个网站的验证那么你将以你的角色对网站进行操作比如你是管理员可以添加其它的用户到管理组但是如果有人构造了添加管理员的链接被管理员点后也会执行相应操作
解决方法
修改信息时添加验证码或添加Session令牌(ASPNET中已经提供一个自动防范的方法就是用页面属性ViewStateUserKey在Page_Init方法中设置其值thisViewStateUserKey=SessionSessionID)
文件上传
引起原因
如果你的网站使用的是在线编辑器如FCKEditoreWeb等等如果没有处理好文件上传那么上线后网站会很快的被篡改
解决方法
在用户登录时加入是否可上传文件的Session标志其实Fckeditor已经写好了直接把验证函数CheckAuthentication()中的注释段中
return ( Session[
IsAuthorized
] != null && (bool)Session[
IsAuthorized
] == true );
注释去掉在登录成功加入
Session[
IsAuthorized
] = true;
就可以了
如果网站没有用到上传到服务器的文件浏览的话把fckeditoreditorfilemanager中的browser目录也删除