2.15 DDOS攻击
分布式拒绝服务攻击(Distributed denial of service attack:DDOS)可以使很多的计算机在同一时间遭受到攻击,使攻击的目标无法正常使用,分布式拒绝服务攻击已经出现了很多次,导致很多的大型网站都出现了无法进行操作的情况,这样不仅仅会影响用户的正常使用,同时造成的经济损失也是非常巨大的。
如图4-50所示,一个停车场,如果停车场都被石子堆放了,车子就无法停进来,这样提供停车服务就失效了。
图4-50 被石子铺满的停车场
DDOS攻击与此类似,如果大量垃圾数据包占满了网络I/O从而导致正常的HTTP请求找到拒绝,就形成了DDOS攻击。当年美国炸毁中国驻南斯拉夫,国内IT民间发起在某个时间段对美国驻中国大使馆的IP地址发送大量的PING命令攻击,通过ICMP协议达到DDOS攻击的目的。这次DDOS攻击长达三个小时,造成了美国使馆内的网络工作彻底瘫痪。
在Web领域往往通过在自己网页上设置iframe标签中的src指向被攻击的网站,然后通过其他手段,比如基于selenium代码(在第9.2节将进行介绍)的循环控制,来频繁访问这个网页。
<iframe src="http://www.a.com"height="0" width="0">
防止DDOS攻击的方法有三种。
•方法1。将访问频率高的数据放在内存缓存中。
•方法2。限制请求次数。比如新浪博客,一小时内最多只能发表博文10篇,如图4-51所示。
图4-51 新浪博客,一小时内最多只能发表博文10篇
•方法3。使用验证码。
测试人员也可以通过编写自动化功能测试脚本,基于GUI的或者基于接口的都可以(第9章将进行详细介绍),利用循环语句来测试代码是否对DDOS攻击做好防范。
import requests
import unittest
class login(unittest.TestCase):
defsetUp(self):
self.correctusername ="cindy"
self.correctpassword ="123456"
self.discorrectusername ="jerry"
self.discorrectpassword ="000000"
self.url="http://localhost:8000/login_action/"
self.token ="RNF3Y04qFeJkMwCDsTMn4gfMcyfQ2vUjXbcENLADEFyCSRp1pBdezZKwHhlSwqgE"
self.cookie = {"csrftoken":self.token}
#正确的用户名,正确的密码
deftest_correctusername_correctpassword(self):
payload={"username":self.correctusername,"password":self.correctpassword,"csrfmiddlewaretoken":self.token}
for i in range(1000):
data =requests.post(self.url,data=payload,cookies=self.cookie)
#验证返回码
self.assertEqual("200",str(data.status_code))
#验证返回内容
self.assertIn("电子商务系统" ,str(data.text))
if __name__=='__main__':
#构造测试集
suite=unittest.TestSuite()
suite.addTest(login("test_correctusername_correctpassword"))
#运行测试集合
runner=unittest.TextTestRunner()
runner.run(suite)
2.16钓鱼和网页跳转
钓鱼是黑客经常采取的攻击手段。钓鱼多数采用网页跳转的技巧来实现。这里先来介绍一下网页跳转。
1)网页跳转
网页跳转一般分为客户端跳转和服务器端跳转。
① 客户端跳转
客户端跳转将引起URL变化,jsp代码如下
<%
response.sendRedirect("wellcome.html");
%>
Python的Django框架为。
returnrender(request,"index.html",{'uf':uf,"error":"用户名或者密码错误"})
当页面发生跳转以后,抓包软件会获取响应码为3XX的响应包。如图4-52所示。
图4-52 网页跳转产生的3XX响应包
②服务器端跳转
服务器端跳转URL不会变化,但是仍旧会返回响应码为3XX的响应包。下段代码是Java产生的服务器端跳转,跳转后进入wellcome.html。
public class HttpForwardServlet extends HttpServlet{
@Override
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
this.doPost (request, response);
}
@Override
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException{
request.getRequestDispatcher("wellcome.html").forward(request,response);
}
}
2)钓鱼
黑客往往通过各种诱饵,利用用户的各种心理,诱惑用户上钩,进入故意设置好的网站,从而达到钓鱼的目的。如图4-53所示。
图4-53 钓鱼
“QQ基金实现你发财的梦想”可能是给你短信或者微信,甚至于植入某个网站的木马,当你被其内容吸引点击后,就进入了QQ登录界面,这个登录界面其实就是黑客制作藐视QQ的网站,而非QQ官方网站。当你输入自己QQ用户名和密码后,QQ用户名和密码就被黑客截获。
有如下的HTML代码。
<a href="selenium.html"target="_blank">selenium介绍</a>
在selenium.html中,黑客通过植入如下代码来实现钓鱼的功能。
<script type='text/javascript'>
if (window.opener) {
window.opener.location='http://www.myhack.com/';
}
</script>
当用户点击selenium介绍连接后进入selenium.html页面,在selenium.html中通过window.opener.location把主界面跳转到黑客网站。通过对第2.4-3节的学习,知道如果把<a>标签中加入rel="noopenernoreferrer"属性,即。
<a href= "selenium.html"target="_blank" rel="noopenernoreferrer">selenium介绍</a>
就可以防止钓鱼了。另外还可以通过以下方式来防止钓鱼。
•避免使用重定向和转发。
•如果使用重定向和转发,则不要确定目标时涉及到用户参数。
•如果需要登录,可以从session获取登录信息然后进行判断。
•可以通过request获取之前的页面路径:Request.getHeader("referrer")来防止钓鱼。
•可以通过上一个页面传参,本页面验证的方式。参数放在body中,不要放在URL、session或cookie中。