一、常见的PHP框架

1、zendframwork: (ZF)是Zend公司推出的一套PHP开发框架

  功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现。 ZF 的组件结构独一无二,每个组件几乎不依靠其他组件。这样的松耦合结构可以让开发者独立使用组件。 我们常称此为 “use-at-will”设计。

2、Yii由国人开发的重量级的框架

这个框架把代码的可重用性发挥到极致。Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。

3、CakePHP是国外的框架

  CakePHP是一个运用了诸如ActiveRecord、Association DataMapping、Front Controller和MVC等着名设计模式的快速开发框架。

  该项目主要目标是提供一个可以让各种层次的PHP开发人员快速地开发出健壮的Web应用,而又不失灵活性

4.Symfony,是一套国外的PHP开源框架

  简单的模板功能symfony是一个开源的PHP Web框架。基于最佳Web开发实践,已经有多个网站完全采用此框架开发,symfony的目的是加速Web应用的创建与维护。 它的特点如下:缓存管理 、自定义URLs、搭建了一些基础模块、多语言与I18N支持、采用对象模型与MVC分离、Ajax支持、适用于企业应用开发。

5、CodeIgniter(CI)轻量级框架,运行速度快

  CodeIgniter 是一个简单快速的PHP MVC 框架。

  它为组织提供了足够的自由支持,允许开发人员更迅速地工作。使用 CodeIgniter 时,您不必以某种方式命名数据库表,也不必根据表命名模型。这使 CodeIgniter 成为重构遗留 PHP 应用程序的理想选择,在此类遗留应用程序中,可能存在需要移植的所有奇怪的结构。

6、CanPHP框架是一个简洁,实用,高效,遵循apache协议的php开源框架

  它既可以完美的支持MVC模式,又可以不受限制的支持传统编程模式。它是一个轻量级的php框架,同时也是一个实用的php工具 包。以面向应用为主,不纠结于OOP,不纠结于MVC,不纠结于设计模式,不拘一格,力求简单快速优质的完成项目开发,是中小型项目开发首选。

7、Laravel 是一个简单优雅的 PHP web 开发框架

  在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。

8、SlimFramework是一个简单的 PHP5 框架用来创建 RESTful 的 Web 应用

  可以帮助你快速编写简单功能强大的 RESTful 风格的web应用程序 和APIs。Slim很简单,可以让新手和专业人士使用。

9、ThinkPHP是一个快速、简单、面向对象的轻量级PHP开发框架

  遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。

10、PHPUnit是一个轻量级的PHP测试框架

  它是在PHP5下面对JUnit3系列版本的完整移植。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。

11、KYPHP支持多数据库,多语言,多模版,多app,多缓存,多编码格式,模板布局,自定义类,自动加载公共类库

  KYPHP已应用于许多大项目中,在同一程式中可同时管理多个数据库源,管理多个缓存,并支持复杂的目录结构。从2.1开始kyphp又极大的增强了安全性,可有效防止sql注入,xss等常见安全问题。

12、initPHP是一款轻量级的php开发框架

  采用分层体系架构,适合大中型网站架构。提供丰富的library类库,以及简单的框架扩展机制,InitPHP还提供详细的开发文档,可以让您在使用该框架的时候更加简单实用。 InitPHP实现了抽象DB层、分层体系架构、缓存无缝切换机制、简单模板机制、多模型部署机制、强大的安全体系,是快速开发php应用的利器。

13、SpeedPHP是一款全功能的国产PHP应用框架系统

  SpeedPHP框架是从实际运行的商业系统中取其精华而成的,在稳定性和运行速度上都非常出色;同时有着清晰的架构,更有利于提高团队开发效率,教程众多,入门容易,号称最适合初学者的PHP框架,快速带你进入PHP高手的行列。

二、审计思路

0x01.通读全文

1. 函数集文件

网站目录结构:主目录、模块目录、插件目录、上传目录、模版目录、数据目录、配置目录

2. 配置文件

3. 安全过滤文件

公共函数文件、安全过滤文件

4. Index(入口)文件

0x02.敏感关键字回溯参数(常用)

优点:可以快速高效的挖掘出想要的漏洞,最常用的方法;判断敏感触发点的位置以及上下文,追踪参数源头。

缺点:覆盖不到逻辑漏洞的挖掘;不能了解整个程序的基本框架。

0x03.查找可控变量

0x04.功能点定向审计(推荐)

针对目标网站的功能点进行有针对性的代码审计,可以利用思维导图捋清目标站点的大概功能点及其位置,如:

  • 程序安装

  • 文件上传

  • 文件管理

  • 登陆验证

  • 备份恢复

  • 找回密码

三、php.ini安全配置

0x01.语法

  • 大小写敏感

  • 运算符

  • 空值的表达式

0x02.安全模式

  • 禁用函数

为了更安全的运行PHP,可以用此指令来禁止一些敏感函数的使用,当你想用本指令禁止一些危险函数时,切忌把dll()函数也加到禁止列表,攻击者可以利用dll()函数加载自定义的php扩展来突破disable_function。

  • com组件

0x03.远程文件

  • 是否允许包含远程文件

该配置为On的情况下,可以直接包含远程文件,若包含的变量为可控的情况下,可以直接控制变量来执行PHP代码

  • 是否允许打开远程文件

允许本地PHP文件通过调用URL重写来打开和关闭写权限,默认的封装协议提供的ftp和http协议来访问文件。

0x04.目录权限

  • HTTP头部版本信息

防止通过http头部泄露的php版本信息

  • 文件上传临时目录

  • 用户可访问目录

能控制PHP脚本只能访问指定的目录,这样能避免PHP脚本访问。

0x05.错误信息

  • 内部错误选项

表明显示PHP脚本的内部错误,网站调试的时候通常把php错误显示打开,在网站发布后,建议关闭PHP的错误回显。

  • 错误报告级别

四、审计过程中涉及的超全局变量

PHP中有9个超全局变量:

0x01.$GLOBALS

  • global

作用:定义全局变量,只应用于当前网页(包括include和require的所有文件)而不是整个网站。

  • $GLOBALS

作用:用于在PHP脚本中的任意位置访问全局变量(从函数或方法中均可)。

// 代码1:
<?php
$name = 123;
function test(){
global $name; //实现参数传递
$name = 456;
}
test();
echo $name;

// 代码2:
<?php
$name = 123;
function test(){
$GLOBALS['name'] = 4567; //变量的作用域设置为全局
}
test();
echo $name;

// 代码3:
<?php
$var1 = 1;
$var2 = 2;
function test(){
global $var1,$var2;
$var1 = $var2;
}
test();
echo $var1;

// 代码4:
<?php
$var1 = 3;
$var2 = 4;
function test(){
$GLOBALS['var1'] = $GLOBALS['var2']; //注意这里中括号内只引用变量名,不带$
}
test();
echo $var1;

0x02. $_POST和$_GET

  • $_POST(隐藏传参)

$_POST向服务器传送数据。将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

  • $_GET(URL传参)

$_GET从服务器上获取数据。把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。

0x03.$_REQUEST

php中$_REQUEST可以获取以POST方法和GET方法提交的数据,但处理速度比较慢



尽量不要使用$_REQUEST,应该从$_GET, $_POST, $COOKIE, $_ENV, $_SERVER等变量中取出需要的值。

0x04.$_FILES

$_FILES['file']['name']        //显示客户端文件的原名称
$_FILES['file']['type'] //文件的 MIME 类型,例如"image/gif"
$_FILES['file']['size'] //已上传文件的大小,单位为字节
$_FILES['file']['tmp_name'] //储存的临时文件名,一般是系统默认
$_FILES['file']['error'] //该文件上传相关的错误代码

首先,先打印变量$_FILES的内容,为空

然后访问upload.html文件,上传文件



0x05.$_SERVER

这种超全局变量保存关于报头、路径和脚本位置的信息等。

0x06.$_SESSION

在Web编程中Session代表服务器与客户端之间的“会话”,意思是服务器与客户端在不断的交流。

在PHP中,使用$_SESSION[]可以存储特定用户的Session信息。并且每个用户的Session信息都是不同的。

当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的SessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。

Session信息的存储与读取

session_start(); 	//开启Session功能
session_id(); //获取用户Session ID值,如需修改在括号中传值即可

利用Session变量存储信息:

$_SESSION["Session名称"]=变量或字符串信息;

读取Session变量信息(可赋值给一个变量或者直接输出):

变量=$_SESSION["Session名称"];

说明:

(1)使用Session前都需要在页面开头用session_start()方法开启Session功能。

(2)session_start()函数前不能有任何代码输出到浏览器,最好加在页面头部,或者先用ob_start()函数打开输出缓冲区。

(3)对于一个不存在的Session变量赋值,将自动创建该变量;给一个已经存在的Session变量赋值,将修改其中的值。

(4)如果新打开一个浏览器,则无法获取之前保存的Session信息。因为新打开一个浏览器相当于一个新的用户在访问。

(5)只要创建了Session变量,该Session变量就能被网站中所有页面访问。

(6)最好不要把大量的信息存入Session变量中,或者创建很大Session变量。如果Session变量保存的信息太多,同时访问网站的用户又很多会非常占用服务器资源。

实例代码:

//session.php
<?php
session_start();
$_SESSION['name']="admin";
$_SESSION['password']=123456;
echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?> //c_session.php
<?php
session_start();
echo "所在文件:".$_SERVER["PHP_SELF"]."<br/>";
echo "用户名:{$_SESSION['name']} <br/>密码:{$_SESSION['password']}";
?>



Session的生命期

Session对象的生命期:是从用户在Session有效期内第一次访问网站直到不再访问网站为止的这段时间。

设置Session有效期:

ini_set('session_save_path','/tmp/');	//设置保存路径
ini_set('session.gc_maxlifetime',60); //保存1分钟
setcookie(session_name(),session_id(),time()+6,"/"); //设置会话cookie的过期时间

说明:

(1)关闭浏览器不会使一个Session结束,但会使这个Session永远无法访问。因为当用户打开新的浏览器窗口又会产生一个新的Session。

(2)Session对象不是一直有效,默认有效期为24分钟。

(3)增加Session的有效期会导致Web服务器保存用户Session的信息的时间增长,如果访问的用户很多,会加重服务器负担。

(4)不能单独对某个用户的Session设置有效期。

删除和销毁Session

删除Session常用来实现用户注销的功能,使得用户能够安全退出网站。

session_unset();//删除$_SESSION中所有session变量
session_destroy();//清除Session ID

说明:

(1)session_unset函数只能删除$_SESSION[]中的所有元素,不能删除对应的Session ID,也不能删除保存Session ID的文件。

(2)session_destroy函数只能删除Session ID,并销毁Session文件,但是不能删除$_SESSION[]中的所有元素。

(3)unset()方法也可以删除单个Session变量。

示例:利用Session限制未登入用户访问

//login.php
<html>
<head>
<title>登入</title>
</head>
<body>
<?php
session_start();
if(!isset($_POST["login"])){
echo '
<form action="#" method="post">
<p>帐号:<input type="text" name="name"/></p>
<p>密码:<input type="password" name="pw"/></p>
<p><input type="submit" name="login" value="登入"/>
</form> ';
}
else{
$name=$_POST["name"];
$pw=$_POST["pw"];
if($name=="admin"&&$pw==123456)
{
$_SESSION["name"]=$name;
$_SESSION["pw"]=$pw;
echo '登入成功,<a href="user.php">查看个人信息</a>';
}
else{
echo '帐号或密码错误!<a href="JavaScript:history.back()">返回登入</a>';
}
}
?>
</body>
</html> //user.php
<?php
session_start();
if(isset($_SESSION['name'])){
echo "帐户信息:<br/>";
echo "用户名:".$_SESSION["name"]."<br/>";
echo "密码:".$_SESSION["pw"]."<br/>";
echo '<a href="logout.php?action=logout">注销</a>';
}else{
echo '未登入用户不允许访问,<a href="login.php">请登入</a>';
}
?> //logout.php
<?php
if($_GET['action']=="logout"){
header('Refresh:3; url="login.php"');
session_start();
setcookie("cookiename", NULL);
session_unset();
session_destroy();
echo "三秒后返回登入页面";
}
?>





0x07.$_COOKIE

Cookie实际上是一个很小的文本文件,网站通过向用户硬盘中写入一个Cookie文件来标识用户。当用户下次再访问该网站时,浏览器会将Cookie信息发送给网站服务器,服务器通过读取以前写入的Cookie文件中的信息,就能识别该用户。

Cookie的两种形式:

(1)会话Cookie。临时性的,只在浏览器打开时存在,主要用来实现Session技术。

(2)永久Cookie。永久性的,保存在用户硬盘上并在有效期内一直可用。

创建和修改Cookie

在PHP中,利用setcookie()函数可以创建和修改Cookie,以及设置Cookie的有效期;而使用$_COOKIE[]数组可以读取Cookie变量的值。

setcookie(name,value[,exprie,path,domain,secure]);		//创建Cookie

参数:

name:Cookie的变量名

value:Cookie的变量值

expire:Cookie的有效期

path:Cookie的服务器路径

domain:Cookie的有效域名

secure:是否采用HTTPS来传输Cookie

说明:

(1)除了name和value是必需参数外,其他参数都是可选的。

(2)没有设置有效期的Cookie为会话Cookie。

(3)修改永久Cookie时若没设置有效期,该Cookie将被修改为会话Cookie。

(4)在使用setcookie()函数前,不要有任何HTML内容输出到浏览器,否则setcookie()创建Cookie将失败。因为Cookie也是作为HTTP协议头的一部分。

(5)Cookie变量的值总时字符串数据类型。

使用header设置Cookie:

header('Set-Cookie:name=value;expires=".gmstrftime("%A,%d-%b-%Y %H:%M:%S GMT",time()+10)');

删除Cookie的方法:

(1)将Cookie的变量值设置为空,并且不设置有效期,不设置有效期将删除Cookie文件中的Cookie变量。

(2)将Cookie的有效期设置为过去的某个时刻。

无论哪种方法,浏览器收到这样的Cookie响应头信息后,将自动删除用户硬盘中的Cookie文件和内存中的Cookie信息。

示例:使用setcookie()函数创建及删除Cookie数组

//test1.php
<?php
setcookie("user[name]","admin",time()+600);
setcookie("user[pw]","123456",time()+600);
setcookie("user[city]","china",time()+600);
echo '创建Cookie信息成功,<a href="test2.php">点击查看Cookie信息</a>';
?> //test2.php
<?php
echo "Cookie信息:<br/>";
if(isset($_COOKIE['user'])){
foreach($_COOKIE['user'] as $key=>$value){
echo $key."=>".$value."<br/>";
}
echo '<a href="test3.php">删除Cookie信息</a>';
}
else{
var_dump($_COOKIE);
}
?> //test3.php
<?php
setcookie('user[name]',"");
setcookie('user[pw]',"123456",time()-1);
setcookie('user[city]',"china",time()-1);
echo '已清空Cooike信息,<a href="test2.php">返回查看Cookie信息</a>';
?>

注意:cookie & session的联系与区别

联系:

  1. session是通过cookie来工作的。

  2. session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的。

  3. 通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。

区别:

  1. cookie数据存储在浏览器客户端上,session数据存放在服务器上。

  2. cookie中只能存储ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据,而session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。

  3. cookie不是很安全,黑客可以分析存放在本地的COOKIE并进行COOKIE欺骗,从安全性出发应当使用session。

  4. session会在一定时间内保存在服务器上。当访问增多,会占用服务器的性能,考虑到优化服务器性能方面,应当使用COOKIE。

  5. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

  6. cookie支持跨域名访问,而session不支持。

0x08.$_ENV

  • $_ENV包含服务器端的环境变量数组,可在PHP程序的任何地方直接访问

  • $_ENV只是被动的接受服务器端的环境变量转换为数组元素

PHP代码审计(初级篇)的更多相关文章

  1. PHP代码审计基础-初级篇

    对于php代码审计我也是从0开始学的,对学习过程进行整理输出沉淀如有不足欢迎提出共勉.对学习能力有较高要求,整个系列主要是在工作中快速精通php代码审计,整个学习周期5天 ,建议花一天时间熟悉php语 ...

  2. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  3. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  4. 25个增强iOS应用程序性能的提示和技巧(初级篇)

    25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  5. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

    ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇   阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET ...

  6. python_way ,day7 面向对象 (初级篇)

    面向对象 初级篇   python支持 函数 与 面向对象   什么时候实用面向对象? 面向对象与函数对比 类和对象 创建类 class 类名 def 方法名(self,xxxx) 类里面的方法,只能 ...

  7. Entity Framework 学习初级篇--基本操作:增加、更新、删除、事务(转)

    摘自:http://www.cnblogs.com/xray2005/archive/2009/05/17/1458568.html 本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作 ...

  8. NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者

    NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者 作者: raindy 来源:http://bbs.hanzify.org/index.php?showtopic=30029 时间: ...

  9. Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)

    Python 面向对象(初级篇)   51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  10. (转)[jQuery]使用jQuery.Validate进行客户端验证(初级篇)——不使用微软验证控件的理由

    以前在做项目的时候就有个很大心病,就是微软的验证控件,虽然微软的验证控件可以帮我们完成大部分的验证,验证也很可靠上手也很容易,但是我就是觉得不爽,主要理由有以下几点: 1.拖控件太麻烦,这个是微软控件 ...

随机推荐

  1. linux入门系列19--数据库管理系统(DBMS)之MariaDB

    前面讲完Linux下一系列服务的配置和使用之后,本文简单介绍一款数据库管理系统(MySQL的兄弟)MariaDB. 如果你有MySQL或其他数据的使用经验,MariaDB使用起来将非常轻松. 本文讲解 ...

  2. R之Shiny学习笔记

    官方教程:https://shiny.rstudio.com/tutorial/ 中文教程:http://yanping.me/shiny-tutorial/ 英文教程:https://deanatt ...

  3. Spring03——有关于 Spring AOP 的总结

    本文将为各位带来 Spring 的另一个重点知识点 -- Spring AOP.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 什么是 AOP 面向切面编程 ...

  4. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 在机器学习中,离散化(Discretiza ...

  5. OS第1次实验报告:熟悉使用Linux命令和剖析ps命令

    零.个人信息 姓名:陈韵 学号:201821121053 班级:计算1812 一.实验目的 熟悉Linux命令行操作 二.实验内容 使用man查询命令使用手册 基本命令使用 三.实验报告 1. 实验环 ...

  6. ICPC训练周赛 Benelux Algorithm Programming Contest 2019

    D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...

  7. Java项目集成Redis

    1.项目pom.xml中添加Jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId ...

  8. 读者来信 | 如何判断HBase Major Compact是否执行完毕?(已解决)

    前言:之前有朋友加好友与我探讨一些问题,我觉得这些问题倒挺有价值的:于是就想在本公众号开设一个问答专栏,方便技术交流与分享,专栏名就定为:<读者来信>.欢迎关注本人微信公众号<HBa ...

  9. java对象clone

    java克隆 为什么需要克隆 我们在很多时候需要使用一个对象去记录另外一个对象的当前状态,对象中可能会有很多属性,如果我们一个一个去设置,不仅不方便,而且效率很低,我们看一个初学者可能遇到的问题 cl ...

  10. 国内 Java 开发者必备的两个装备,你配置上了么?

    虽然目前越来越多的国产优秀技术产品走出了国门,但是对于众领域的开发者来说,依然对于国外的各种基础资源依赖还是非常的强.所以,一些网络基本技能一直都是我们需要掌握的,但是速度与稳定性问题一直也都有困扰着 ...