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实体编码,将&转为&amp; 将<转为&lt; 将>转为&gt; 将"转为&quot; 特殊字符前加\进行转义 \'、\"、\<、\>
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。

posted @ 2017-05-27 14:33  全玉  阅读(604)  评论(0编辑  收藏  举报