PHP网络技术(二)——模拟网络灌水攻防

PHP网络技术(二)——模拟网络灌水攻防

(原创内容,转载请注明来源,谢谢)

一、概念

网络上如留言板、论坛等,可以提交评论的地方,或者其他可以给用户提交内容并且需要存入数据库的地方,就存在灌水的可能。灌水,即破坏者通过大量输入无用信息,造成网站负担严重,数据库存储空间变大,多了大量无用的数据。

二、浏览器

浏览器是一个实现HTTP协议的客户端软件,在整个过程中,作为一个执行者,负责消息发送和接收展示。因此,模拟发送信息就是模拟HTTP协议和服务器进行交互。

三、PHP

在客户端可以用AJAX发送请求,服务端PHP有自带的函数,也可以用抓包软件如Fiddler构造HTTP Request包。

PHP自带处理HTTP的函数如下:

1)get_headers(解释的内容来自PHPManual)

该函数取得服务器响应一个 HTTP 请求所发送的所有标头,返回包含有服务器响应一个 HTTP 请求所发送标头的索引或关联数组,如果失败则返回 FALSE。

格式是array get_headers( string $url [, int $format = 0 ] ),URL是目标URL,如果将可选的format 参数设为 1,则get_headers() 会解析相应的信息并设定数组的键名。

2)file系列函数

file系列如fopen、file_get_contents等,不仅可以操作文件,也可以操作网络资源。

3)stream系列函数

该系列是流处理函数,可以发送各种协议的文件,不仅限于HTTP,在modernphp读书笔记里面有详细的介绍。

4)Socket系列函数

可以通过Socket的套接字方式,发送和请求数据,包括但不限于HTTP协议。

5)curl扩展库

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP”还是“HTTPS”自动选择是否加密发送内容。

6)http_build_query

生成请求串。用该函数或者file系列函数,PHP会自动创建一个变量叫做$http_response_header,用于保存HTTP响应的报头。

四、模拟发送垃圾评论

为了模拟发送垃圾评论,先自己建一个html,用于简单的评论,将评论提交到数据库,采用ajax的方式获取页面数据往后台传。较为简单就不附上代码。

然后,再创建一个php页面,用于发送垃圾评论。代码如下:

<?php
$data = array('comment' => 'attackcomment');
$data = http_build_query($data);
$opts = array(
         'http'=> array(
                   'method'=> 'POST',
                   'header'=> 'Content-type:application/x-www-form-urlencoded; charset=UTF-8'.'\r\n'
                                               .'Content-Length:'.strlen($data).'\r\n'
                                               .'User-Agent:Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0'.'\r\n'
                                               .'Referer:http://127.0.0.1/phpnet/remark.html'.'\r\n',
                   'content'=> $data
         )
);
$context = stream_context_create($opts);
ini_set('user_agent','Mozilla/5.0 (WindowsNT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0');
$html =@file_get_contents('http://127.0.0.1/phpnet/remark.html', false, $context);

上述使用到了http_build_query、stream_context_create、file_get_contents等函数,页面刷新一次就提交一条数据到数据库。而如果把$html放到for循环里面,可以每次刷新页面就提交更多数据,对数据库造成极大的风险。

五、防范措施

防范措施通常有四种:IP限制、验证码、Token和表单欺骗、审核机制。

1、IP限制

HTTP协议是应用层协议,是基于TCP/IP的协议,因此IP难以伪造。可以使用PHP的SERVER中的变量REMOTE_ADDR,功能是浏览当前页面的用户的 IP 地址。

关于PHP获取IP的方法,除了REMOTE_ADDR,还有HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR等。

比较:REMOTE_ADDR不可以显式的伪造,虽然可以通过代理将ip地址隐藏,但是这个地址仍然具有参考价值,因为它就是与你的服务器实际连接的ip地址。当服务器直接暴露在客户端前面的时候,只需要读取REMOTE_ADDR就行了,其他方法都不可信。

相比之下,HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR这两种ip地址都可以通过http header来伪造,但并不意味着它们一无是处。生产环境中很多服务器隐藏在负载均衡节点后面,你通过REMOTE_ADDR只能获取到负载均衡节点的ip地址,一般的负载均衡节点会把前端实际的ip地址通过HTTP_CLIENT_IP或者HTTP_X_FORWARDED_FOR这两种http头传递过来。后端再去读取这个值就是真实可信的,因为它是负载均衡节点告诉你的而不是客户端。

IP限制就是获取用户请求的IP,然后再加以判断,可以自己设定规则。比如一段时间内连续发送请求,则设置成黑名单或者禁用几小时;或者设置一个IP一段时间内只能提交一次内容等。

2、Token

该方法的目的在于加大供给的难度。可以在html页面隐藏一些内容,如可变的Token,每次提交都要和服务器进行校对,如果不通过则提交失败。

具体方法为,在前台传一个码到后台,后台利用时间、加密等进行计算,这样就没法简单的用for循环来进行攻击,而需要可变动的提交内容,加大攻击的难度。

3、验证码

验证码是有效的防止措施,当要求比较高时,往往可以设计复杂的验证码,如12306的验证码。还有淘宝等需要滑动的验证码,安全性相对也较高。虽然这样对用户不够友好,但是却可以防止网站被灌水攻击。

4、人工审核

这是最后一道坎,即将用户提交的内容先存到一个临时表,经人工审核通过后的数据迁移到正式的表中。甚至可以将临时表的数据库放到一个独立的服务器,这样即使被攻击导致崩溃也不会影响到其他正常的业务。

六、抓包工具

抓包在前端、网络开发等具有重要作用,对于手机APP接口开发也具有重要作用,通过抓包可以判断每个请求服务端的事件所调用的PHP端的路径、类名、方法名、传的参数等,对于调试具有重要作用。

对于抓包工具,我最熟悉的是Fiddler,此为免费软件,网络上有很多使用方法介绍的很详细,在此贴上几个我觉得讲的不错的链接。

http://blog.csdn.net/qq_21445563/article/details/51017605

http://www.cnblogs.com/Darren_code/archive/2011/09/28/Fiddler.html

——written by linhxx 2017.07.15

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏轮子工厂

win10/win8换win7教程

重做系统相信很多小伙伴都get到了这个技能,U启动、大白菜、Ghost安装器…blablabla…一大堆。很多方法都可以帮助你重新换一个系统,但是在预装win8...

533
来自专栏java一日一条

RESTful API 最佳实践

在参考了GitHub API设计和大量博客文章后总结了一下RESTful API的设计,分享如下。想要更好的理解RESTful API首先需要理解如下概念:

702
来自专栏左瞅瞅,右瞅瞅

SaltStack——配置管理(haproxy)

1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法 2.balance static-rr # 根据权重,建议使用 3.ba...

1533
来自专栏Golang语言社区

Go微服务 - 构建我们的第一个服务

虽然通过HTTP提供JSON服务不是内部服务和外部服务的唯一选择,但本文聚焦的是HTTP和JSON. 使用RPC机制和二进制消息格式(例如Protocol Bu...

1144
来自专栏企鹅号快讯

前端性能优化——桌面浏览器前端优化策略

作者:ouven https://my.oschina.net/zhangstephen/blog/1601382 摘要: 前端性能优化是一个很宽泛的概念,本书...

1976
来自专栏linux驱动个人学习

Android external扩展工程

2724
来自专栏FreeBuf

网站后台”空降”了一个管理员

新的一年开始了,发点小福利。无意间发现了一个影响phpcms最新版本的漏洞。最近我一个使用phpcms框架搭建的系统,无故多出了一个超级管理员。确定不是出于本意...

1867
来自专栏ThoughtWorks

从URL开始,定位世界 | 洞见

从我们输入URL并按下回车键到看到网页结果之间发生了什么?换句话说,一张网页,要经历怎样的过程,才能抵达用户面前?下面来从一些细节上面尝试一下探寻里面的秘密。 ...

3225
来自专栏梦里茶室

【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?

安全浏览 浏览保护 启动安全浏览后,在允许内容开始加载前,所有的URL都会被检查。URL通过两个列表进行检查:恶意软件和钓鱼网站。根据匹配到的列表,我们会在一个...

1765
来自专栏重庆的技术分享区

Vim定制化简介

Vim是几乎所有Unix系统中都会存在的少数文本编辑器之一。虽然最初的学习曲线是不可避免的,但Vim的目标是成为一个高效的文本编辑器,并提供一个根据用户喜好可配...

722

扫描关注云+社区