7.网络安全

1) 什么是网络安全

作为程序员,主要是面向产品的安全的问题。比如sql注入,xsscsrfcookie窃取等等,都值得我们去思考。保证网站运行正常,客户数据安全。

 

2) sql注入

简单的说,就是利用表单提交数据和URL传参,来控制数据库,进行一些非法操作,比如,查询到不该知道的数据,破坏数据库的结构等等。如果网站存在SQL注入的漏洞,那么一定是可以用表单和URL参数,构造非法的SQL命令,从而操作数据库。

新建项目,新建SqlSecurityController控制器,新建两个index action一个用于httpget,一个用于httppost,在action头部使用特性。

 

这里使用了ado.net的方式查询数据库,namepassword参数把页面提交的用户名和密码组成一条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--,登陆。提示失败。

 

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

 

 

 

3) 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攻击

CSRFCross-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页面。id31的数据被修改了。产生严重的后果。

 

 

CSRF防御

新建提交方式为getEdit ation,view页面的form提交标签内输入@Html.AntiForgeryToken()。

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

 

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

 

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

 

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

 

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

 

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

被攻击时为null

 

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

 

posted @ 2017-11-07 23:20  飞天阿豪  阅读(239)  评论(0编辑  收藏  举报