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

相关文章

来自专栏晨星先生的自留地

#记一次对某违法网站的渗透纪实

2504
来自专栏coding

django2实战5.创建表单及发送邮件测试邮件发送创建表单页面业务逻辑搭建新建分享页面模板详情页添加分享入口结果展示

本篇要实现这样的功能:在文章详情页增加分享文章的入口,点击后跳到分享页面,提交要发送的email地址,程序将发送邮件到相应邮箱,邮件内容是文章的链接地址。

902
来自专栏后端技术探索

有赞延迟队列设计

延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢?

911
来自专栏FreeBuf

基于openresty实现透明部署动态口令功能

今天来讲讲基于openresty来实现透明部署动态口令功能,动态口令的基础概念这里就不讲了,网上的介绍很多,下面直入正题。 企业内部系统部署方案 通过在原有的业...

2247
来自专栏用户画像

3.1.4.1 基本分页存储管理方式

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式。

541
来自专栏余生开发

VS Code—插件的开发

说再多也不如做一遍,这里我们一起来一步步做一个插件。就做官网的那个demo,wordCounter,用于统计当前页单词量。 官网是TypeScript,我不会....

2621
来自专栏耕耘实录

使用awk命令批量删除指定范围的账号

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

493
来自专栏逸鹏说道

破解也进化之~分布式多线程破解压缩密码

现在各种网站架构升级,各种加密算法升级,破解工具如果还是单机多线程的好像是有点跟不上时代了? so==》Bruteforcer:分布式多线程破解RAR文件密码(...

39211
来自专栏Flutter入门到实战

Flutter学习总结系列----第一章、Flutter基础全面详解

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/2c9867e737a1

1272
来自专栏玄魂工作室

CTF实战4 HTTP协议及嗅探抓包

HTTP(Hypertext Transfer Protocol)中文<超文本传输协议>,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Int...

782

扫码关注云+社区