前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP网络技术(二)——模拟网络灌水攻防

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

作者头像
用户1327360
发布2018-03-07 15:00:15
1.2K0
发布2018-03-07 15:00:15
举报
文章被收录于专栏:决胜机器学习决胜机器学习

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页面,用于发送垃圾评论。代码如下:

代码语言:javascript
复制
<?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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档