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 条评论
登录 后参与评论

相关文章

来自专栏zaking's

走近webpack(5)--devtool及babel的使用

  这一章咱们来说一下如何使用babel以及如何用webpack调试代码。这是基础篇的最后一章,这些文章只是罗列的给大家讲解了在一些场景中webpack怎样使用...

2937
来自专栏Android机动车

使用Fiddler抓取bilibili安卓客户端口数据并分析http、https

经过了一个多星期的时间(自2017/10/16开始),到目前(2017/10/24)为止,项目框架的搭建已基本完成、还完成了首页中「直播」与「推荐」Fragme...

871
来自专栏抠抠空间

Node.js基础

1690
来自专栏网站那些事

利用MailChimp发送邮件加调取API开发落地页分享

基于平时爱好关注各类技术社区及众多技术微信号,经常看到很多有用有意思的内容,朋友总是让分享出来,索性就抽空做了个邮件订阅页面

41114
来自专栏Python研发

Autopep8的使用

在python开发中, 大家都知道,python编码规范是PEP8,但是在市级开发中有的公司严格要求PEP8规范开发, 有的公司不会在乎那些,在我的理解中,程序...

1115
来自专栏Jerry的SAP技术分享

最简单的教程:在Ubuntu操作系统里安装Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容...

764
来自专栏我就是马云飞

Android Studio 3.2新功能特性

2681
来自专栏性能与架构

Restfull API

什么是Restfull API Restfull API 从字面就可以知道,他是rest式的接口,所以就要先了解什么是rest rest 不是一个技术,也不...

2699
来自专栏ThoughtWorks

OpenShift中的持续交付 | 洞见

持续交付 如果要打造一个持续交付的流水线,首先要考虑多环境的问题。一般一个应用程序会有多个环境,比如开发环境、集成测试环境、系统测试环境、用户验收测试环境、类生...

3418
来自专栏游戏开发那些事

python+pygame游戏开发之使用Py2exe打包游戏

最近在用python+pygame 开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本。

692

扫码关注云+社区