web常见攻击 Sql注入 CSRF,XSS,盗链
在Web安全领域,常见的攻击方式有以下6种:
1、SQL注入攻击
2、跨站脚本攻击 - XSS
3、跨站伪造请求攻击 - CSRF
4、文件上传漏洞攻击
5、分布式拒绝服务攻击 - DDOS
6、盗链
1. Sql注入
在发送到后端的参数中添加sql命令,使其拼接在sql语句中执行,以执行非法操作
比如:
#查询用户构造sql如下 select uid from users where username='xiaoming' and password=xxxx
当用户名输入 xiaoming' AND 1=1--,就可以拼接出如下sql
select uid from users where username='xiaoming' AND 1=1-- and password=xxx
--后面的会被当做注释,不会执行,该语句后面1=1,一直为true,仅仅知道用户名,就能登录系统
sql注入防御方法:
1. 终结大法,预编译sql语句,绑定参数,或者使用存储过程
sql注入的根本是sql语句拼接,不拼接就没事。sql语句的参数,不直接拼接,而是使用占位符,例如 ?。
数据库驱动提供了预编译语句的支持,不同的语言,都可以使用数据库驱动模块,调用预编译。
预编译之后,调用bind参数的方法,将所有参数绑定进去。
用数据库引擎执行sql语句,这时哪些参数会被以文本的格式执行,无论如何,都不会产生副作用。
例如php访问mysql:
//使用问号替代变量位置 $sql = "SELECT uid,username FROM user WHERE username=?"; $stmt = $mysqli->prepare($sql); //绑定变量 $stmt->bind_param("s", $username); $stmt->execute();
2. 检查变量的数据类型和格式,比如 id 为 int 类型,就不能包含字符串,邮箱,日期 只能包含特定字符。
3. 过滤特殊符号 单引号,双引号,反斜杠,等等
4. 用户密码要加密,使用 bcrypt, pbkdf2 等算法较好
2. XSS(Cross site Scripting,跨站脚本攻击)
XSS(Cross Site Script),跨站脚本攻击,因与css同名,所以改为X,未知的意思。
凡是用户的输入的全部或其中一部分,原封不动输出回页面的,基本都存在XSS攻击。
有3类:
1. 反射型 通过URL中携带脚本来攻击
例如:www.test.com/index ? name=<img%20src=1%20onerror=alert(1)>
如果name被原封不动的写入的html页面,就会执行img的onerror方法,直接js脚本
2. 存储型 通过表单提交,将js保存到数据库中,以后页面输出该字段皆携带脚本
一般通过表单提交,如网站的留言,评论,博客,日志等,向服务器存储js脚本。
3. Dom-base型 攻击形式也属于反射型号存储型之一,由于其会操作dom元素,特单独列出一种
XSS防御方法:
1. 对输入进行格式验证,特殊字符过滤
2. 对输出进行编码,转义,例如 html实体编码,将&转为& 将<转为< 将>转为> 将"转为" 特殊字符前加\进行转义 \'、\"、\<、\>
3. 敏感cookie设置httpOnly
3.CSRF(Cross site request forgery,跨站请求伪造)
CSRF(Cross-site request forgery),跨站请求伪造。
其方式是:攻击者盗用你的身份,以你的名义发送恶意请求。
过程:登录A网站生成cookie,在没有登出A网站的情况下,登录B网站,B网站会自动访问A网站的某些url,这样可以携带未登出的A网站的cookie信息,
就可以以合法的身份,操作A网站该用户的资源。
比如
get方式:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
用img直接发起get请求访问已登录网站,同时携带cookie,如果未登出A网站
post方式:
<body onload="steal()"> <iframe name="steal" display="none"> <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php"> <input type="hidden" name="toBankId" value="11"> <input type="hidden" name="money" value="1000"> </form> </iframe> <script type="text/javascript"> function steal() { iframe = document.frames["steal"]; iframe.document.Submit("transfer"); } </script> </body>
用iframe向A网站POST数据,同时携带cookie,如果A网站未登出
CSRF防御方法:
1. 验证码
每次提交表单,都要提交一个验证码,验证码可以有多种形式,图片验证码,计算验证码,拖动验证码,点击验证码,短信验证码等等,
只是比较麻烦,非敏感提交不适合。
2. 一次性Token
在表单页面中携带一个随机token,每次提交验证token,合法就通过,并且移除。下一次使用新的token。
4. 防盗链
盗链会增加服务器的负担。盗链主要是对网站图片,视频以及其他资源文件的下载。
防御措施
判断ip地址和域名,只有白名单中的ip和域名才能返回资源,否则,
不予处理,或者返回一个网站logo。