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'.'rn'
.'Content-Length:'.strlen($data).'rn'
.'User-Agent:Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0'.'rn'
.'Referer:http://127.0.0.1/phpnet/remark.html'.'rn',
'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
- objective-C 的OOP(上)--类定义、继承及方法调用
- jQuery打造智能提示插件二(可编辑下拉框)
- Nicholas Christakis:朋友多是由基因决定的?
- WPF中的MatrixTransform
- kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)
- ruby学习笔记(3)--语法层面的先见之明
- jQuery操作Select
- ruby学习笔记(11)--symbol与hash参数
- zabbix监控-基本原理介绍
- OpenStack构架知识梳理
- mysql操作命令梳理(4)-grant授权和revoke回收权限
- 问未来
- ruby on rails + mysql 开发环境搭建
- CentOS 7.2下安装Mono 5.0
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Android实现新浪微博一键分享的实例代码
- Android实现常见的验证码输入框实例代码
- Android实现加载状态视图切换效果
- Retrofit + OkHttp缓存处理的示例代码
- Android图片实现压缩处理的实例代码
- Windows10安装linux子系统的两种方式(图文详解)
- Android 图片处理避免出现oom的方法详解
- session登陆成功第四篇4
- Android编程使用pull方式解析xml格式文件的方法详解
- Android中ActionBar和ToolBar添加返回箭头的实例代码
- Android自定义双向进度条的实现代码
- android视频截屏&手机录屏实现代码
- Android自定义组件跟随自己手指主动画圆
- Android RecyclerView 实现快速滚动的示例代码
- Android的八种对话框的实现代码示例