- 什么是网络安全
作为程序员,主要是面向产品的安全的问题。比如sql注入,xss,csrf,cookie窃取等等,都值得我们去思考。保证网站运行正常,客户数据安全。
- sql注入
简单的说,就是利用表单提交数据和URL传参,来控制数据库,进行一些非法操作,比如,查询到不该知道的数据,破坏数据库的结构等等。如果网站存在SQL注入的漏洞,那么一定是可以用表单和URL参数,构造非法的SQL命令,从而操作数据库。
新建项目,新建SqlSecurityController控制器,新建两个index action一个用于httpget,一个用于httppost,在action头部使用特性。

这里使用了ado.net的方式查询数据库,name和password参数把页面提交的用户名和密码组成一条sql语句,查询完后把DataSet数据传到View。

View页面,当(ViewBag.data).Tables[0].Rows.Count有数据时,显示登陆成功。下面是提交form表单,用于提交用户名和密码登陆。

运行程序,地址栏输入/SqlSecurity/Index。输入正确的用户名和密码,登陆。

登陆成功。

再次打开/SqlSecurity/Index页面,用户名输入'or 1 = 1--,密码不填,登陆。

此时数据库执行的sql指令变成了
select * from usertable where name = ''or 1 = 1--' and password = ''
--在sql语句中是注释的意思。成功执行了语句,返回了usertable 表中的数据。


这就是sql注入,此隐患可让不法者查询到不该看的数据,删除数据,操作数据库。
解决方法也是有很多,这里使用sql参数化的方法,修改代码为两个字符串占位,后面通过new SqlParameter()为两个参数赋指。

运行程序,地址栏输入/SqlSecurity/Index。在用户名处输入'or 1 = 1--,登陆。提示失败。

用正确的用户名和密码登陆,登陆成功。


- XSS攻击
XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。
新建SqlSecurityController控制器,新建两个index action一个用于httpget,一个用于httppost,在action头部使用特性。这里也用道了ado.net的方式来对数据库进行操作。

httpget特性的index action把查询出来的数据显示在view界面。

httpost特性的index action把输入的数据添加到数据库,然后跳转到index action查询数据。

新建Index view,用于展示和输入数据,@Html.Raw()返回的是没有编码的 HTML 标记。

运行程序,地址栏输入/XssAttack/Index。看到了两条数据和两个输入框。

在用户名处输入<a herf='www.baidu.com'>aaaa</a>,密码输入555。登陆。
保存到数据库后再次进入页面时,查询出3条数据。
提交用户名的时候是一个a标签链接,现在完全显示出来了。


又比如输入<script src="/Scripts/JavaScript.js"></script>加载非法脚本提交,当用户打开页面时就会执行脚本。

非法提交的跨站脚本信息显然是不被允许的。不过Razor语法帮我们做了很多。在index view视图中去掉@Html.Raw(),再次打开/XssAttack/Index。输入的标签被编码了。

或者用
@Html.AttributeEncode() @Html.Encode()来执行编码。最好还是在提交输入框内容时验证一下,当出现非法字符串时,出现提乱码。


4)CSRF攻击
CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片src。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。
新建提交方式为POST Edit Action,负责修改用户信息。

这里我们只会让有权限的角色执行这个action,但当有权限的角色登陆后cookie信息存在,攻击者就可以骗取用户点击某个链接或者图片,该网站或图片转到Edit Action,修改了不该修改的数据等。
被骗取到的攻击网页。打开便会向服务器Edit Action提交修改信息。

运行程序,地址栏输入/XssAttack/Index。假如此处以被XSS攻击,注入了"致富发财的方法"这个链接,用户点击进去,就执行了攻击者的攻击页面。

执行一闪而过,回到index页面。id为31的数据被修改了。产生严重的后果。

CSRF防御
新建提交方式为get的Edit ation,在view页面的form提交标签内输入@Html.AntiForgeryToken()。

同时在提交到的Post Edit action添加特性[ValidateAntiForgeryToken]

修改id为31的数据为正常数据,运行程序,地址栏输入/XssAttack/Index。

当用户无意点击攻击链接时。便会报错。导致攻击失败。

而用/XssAttack/Edit正常修改,则成功。


防御攻击的原理和验证码类似,也可用验证码方式做到。

还有一种办法就是获取上一个页面,比如是从那一个页面跳转过来的,如果Request.UrlReferrer为null或者不是本站点下的网站,则可判断为CSRF攻击。
被攻击时为null。

正常提交数据时,可判断是否为本域名提交。
