前言
互联网世界鱼龙混杂,我们的网站放在internet上除了网站用户和会员会造访,还会有一群觊觎网站利益服务器功能的人在暗中观察,抓住机会找到漏洞就把网站一举拿下,从而盗取数据或是利用服务器资源作为矿机等等,因此服务器防御也是不可忽略不可轻视的一方面。
大部分公司在开发运维过程中并不会去刻意注意服务器安全,也不会去请专门的安全人员,直到服务器被攻破,被人勒索了以后才会意识到安全问题的重要性,虽说见兔顾犬,未为晚也,亡羊补牢,未为迟也,但是倘若我们能做到防范于未然,做好基础防御,至少让小学生级别的黑客被拒之门外,岂不善哉。
本文也仅作为基础防御手段收集,如果公司数据非常重要,还是需要请专门的安全公司来保驾护航。
一、SQL注入(这是一种很古老的攻击方式)
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,如查询用户表所有用户信息、删除数据库等。(容易中招对象:后端代码使用SQL直接拼接方式访问数据库)
SQL注入的总体思路:
1.寻找到SQL注入的位置
2.判断服务器类型和后台数据库类型
3.针对不通的服务器和数据库特点进行SQL注入攻击
防范思路:
1.检查变量数据类型和格式
2.过滤特殊字符
3.绑定变量,使用预编译语言
4.数据库信息加密
二、XSS攻击(Cross-Site Scripting)跨站脚本攻击
特点:注入恶意的HTML/JavaScript代码到用户浏览的网页上,从而达到Cookie资料窃取、会话劫持、钓鱼欺骗等攻击。<攻击代码不一定非要在 中>(XSS的本质是“HTML注入”,用户的数据被当成了HTML代码一部分来执行,从而混淆了原本的语义,产生了新的语义)
原因:Web浏览器本身的设计不安全。浏览器能解析和执行JS等代码,但是不会判断该数据和程序代码是否恶意。
防范思路:
1.HttpOnly 浏览器禁止页面的JS访问带有HttpOnly属性的Cookie
2.输入检查 XSS Filter 对输入内容做格式检查,类似“白名单”,可以让一些基于特殊字符的攻击失效。在客户端JS和服务器端代码中实现相同的输入检查(服务器端必须有)
3.输出检查 在变量输出到html页面时,可以使用编码或转义的方式来防御XSS攻击 HtmlEncode:将字符转成HTMLEntities,对应的标准是ISO-8859-1
在Html标签中输出:<div>$var</div>
在标签中输出的变量,如果未做任何处理,都能导致直接产生XSS:构造一个<script>
标签,或者是任何能够产生脚本执行的方式:<div><script>alert(/XSS/)</script></div>
或者 <a href=# ><img src=# onerror=alert(1) /></a>
防御方法:对变量使用HtmlEncode。
在Html属性中输出:<div id=“abc name=”$var"> 攻击方法:<div id="abc" name=""><script>alert(/XSS/)</script><""></div>
防御方法:采用HtmlEncode。 在OWASP ESAPI中推荐了一种更严格的HtmlEncode:除了字母、数字外,所有的特殊字符都被编码成HTMLEntities。
在<script>
标签中输出:<script>var x = "";alert(/XSS/);//";<script>
防御方法:使用JavascriptEncode。
在事件中输出:与在<script>
标签中输出类似:<a href=# onclick="funcA('');alert(/XSS/);//')">test</a>
防御方法:使用JavascriptEncode。
在CSS中输出:方式多样
防御方法:尽可能禁止用户可控制的变量在"<style>
标签"、“html标签的style属性”、"CSS文件"中输出。如果一定有此需求,则推荐使用 OWASP ESAPI 中的encodeForCSS()函数。除了字母、数字外的所有字符都被编码成十六进制形式“\uHH”。
在地址中输出:比较复杂。一般是在URL的path(路径)或者search(参数)中输出,使用URLEncode即可。
<a href="http://www.evil.com/?test=$var">test</a> --> <a href="http://www.evil.com/?test=" onclick=alert(1)"" >test</a>
整个URL都被用户完全控制时,URL的Protocal(http://) 和Host (www.evil.com)部分不能使用URLEncode,可能会构造伪协议实施攻击:
<a href="$var"></a> --> <a href="javascript:alert(1);"></a>
防御方法:先检查变量是否以”http“开头(如果不是则自动添加),以保证不会出现伪协议类的XSS攻击。在此之后,再对变量进行URLEncode。
e:处理富文本 网站允许用户提交一些自定义的HTML代码,称之为”富文本“。比如用户在论坛里发帖,帖子的内容有图片、视频、表格等,这些”富文本“的效果都需要通过HTML代码来实现。
防御方法:与输入检查的思路一致。使用"XSS Filter":“事件”应该被严格禁止;一些危险的标签:、
f:防御DOM Based XSS 如果是输出到事件或脚本,要做一次javascriptEncode;如果是输出到HTML内容或者属性,要做一次HtmlEncode。
处理XSS注入的时候,不仅仅要转义或删除特殊的 HTML 标记和符号,如尖括号<>,如script,如iframe等,还需要过滤 JavaScript 事件所涉及的大量属性,前端一般使用XSS Filter 设置“白名单”。过滤的事件大致如下:
属性 当以下情况发生时,出现此事件
onabort 图像加载被中断
onblur 元素失去焦点
onchange 用户改变域的内容
onclick 鼠标点击某个对象
ondblclick 鼠标双击某个对象
onerror 当加载文档或图像时发生某个错误
onfocus 元素获得焦点
onkeydown 某个键盘的键被按下
onkeypress 某个键盘的键被按下或按住
onkeyup 某个键盘的键被松开
onload 某个页面或图像被完成加载
onmousedown 某个鼠标按键被按下
onmousemove 鼠标被移动
onmouseout 鼠标从某元素移开
onmouseover 鼠标被移到某元素之上
onmouseup 某个鼠标按键被松开
onreset 重置按钮被点击
onresize 窗口或框架被调整尺寸
onselect 文本被选定
onsubmit 提交按钮被点击
onunload 用户退出页面