文档章节

关于安全:

 蜗牛奔跑
发布于 2017/02/28 15:47
字数 1726
阅读 1
收藏 0
点赞 0
评论 0

关于安全:

  • WEB安全在现在的WEB应用中越来越体现他自身的重要性。
  • InitPHP框架提供了一套WEB安全基础的实现方式。

全局Filter机制:

  • InitPHP框架内置了filter()函数对$_GET、$_PSOT、$_COOKIE、$_SERVICE等容易被攻击的全局变量进行了过滤
  • filter()函数在框架运行的时候会自动加载执行
  • Filter安全类: core/controller/filter.init.php
/**
 * 安全过滤类-全局变量过滤
 * 在Controller初始化的时候已经运行过该变量,对全局变量进行处理
 *  Controller中使用方法:$this->controller->filter()
 * @return
 */
public function filter() {
	if (is_array($_SERVER)) {
		foreach ($_SERVER as $k => $v) {
			if (isset($_SERVER[$k])) {
				$_SERVER[$k] = str_replace(array('<','>','"',"'",'%3C','%3E','%22','%27','%3c','%3e'), '', $v);
			}
		}
	}
	unset($_ENV, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS, $HTTP_ENV_VARS);
	self::filter_slashes($_GET);
	self::filter_slashes($_POST);
	self::filter_slashes($_COOKIE);
	self::filter_slashes($_FILES);
	self::filter_slashes($_REQUEST);
}

/* 运行的时候执行 */
/**
 * 初始化控制器,
 */
public function __construct() {
	$this->filter();
	$this->set_token(); //生成全局TOKEN值,防止CRsf攻击
}

丰富的过滤函数:

  • InitPHP框架提供了丰富的数据过滤函数
  • 过滤类: core/controller/filter.init.php
/* 一部分类 */
/**
 * 安全过滤类-加反斜杠,放置SQL注入
 *  Controller中使用方法:$this->controller->filter_slashes(&$value)
 * @param  string $value 需要过滤的值
 * @return string
 */
public static function filter_slashes(&$value) {
	if (get_magic_quotes_gpc()) return false; //开启魔术变量
	$value = (array) $value;
	foreach ($value as $key => $val) {
		if (is_array($val)) {
			self::filter_slashes($value[$key]);
		} else {
			$value[$key] = addslashes($val);
		}
	}
}

/**
 * 安全过滤类-过滤javascript,css,iframes,object等不安全参数 过滤级别高
 *  Controller中使用方法:$this->controller->filter_script($value)
 * @param  string $value 需要过滤的值
 * @return string
 */
public function filter_script($value) {
	$value = preg_replace("/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dblclick|move|reset|resize|submit)/i","&111n\\2",$value);
	$value = preg_replace("/(.*?)<\/script>/si","",$value);
	$value = preg_replace("/(.*?)<\/iframe>/si","",$value);
	$value = preg_replace ("//iesU", '', $value);
	return $value;
}

统一的get_gp函数,获取GET或者POST数据:

  • 不建议用户使用$_GET和$_POST的方法获取GET或者POST数据
  • get_gp函数默认会过滤数据
  • 该函数还提供数组获取方法,可以获取多个数据
  • 如果你使用InitPHP框架,请强制使用该函数
/**
 * 安全过滤类-获取GET或者POST的参数值,经过过滤
 * 如果不指定$type类型,则获取同名的,POST优先
 * $isfilter 默认开启,强制转换请求的数据
 * 该方法在Controller层中,获取所有GET或者POST数据,都需要走这个接口
 *  Controller中使用方法:$this->controller->get_gp($value, $type = null,  $isfilter = true)
 * @param  string|array $value 参数
 * @param  string|array $type 获取GET或者POST参数,P - POST , G - GET
 * @param  bool         $isfilter 变量是否过滤
 * @return string|array
 */
public function get_gp($value, $type = null,  $isfilter = true) {
	if (!is_array($value)) {
		if ($type === null) {
			if (isset($_GET[$value])) $temp = $_GET[$value];
			if (isset($_POST[$value])) $temp = $_POST[$value];
		} else {
			$temp = (strtoupper($type) == 'G') ? $_GET[$value] : $_POST[$value];
		}
		$temp = ($isfilter === true) ? $this->filter_escape($temp) : $temp;
		return $temp;
	} else {
		$temp = array();
		foreach ($value as $val) {
			if ($type === null) {
				if (isset($_GET[$val])) $temp[$val] = $_GET[$val];
				if (isset($_POST[$val])) $temp[$val] = $_POST[$val];
			} else {
				$temp[$val] = (strtoupper($type) == 'G') ? $_GET[$val] : $_POST[$val];
			}
			$temp[$val] = ($isfilter === true) ? $this->filter_escape($temp[$val]) : $temp[$val];
		}
		return $temp;
	}
}

CSRF风险控制:

  • CSRF(跨站请求伪造)是很多开发者容易遗漏的一个安全问题。
  • InitPHP框架内置了公用的TOKEN机制,在框架运行的时候就能生成用户的唯一TOKEN,用户每次打开浏览器访问网站的TOKEN都是不同的
  • 你需要做的是:在你的POST和GET请求的地方,添加上TOKEN,然后在你的Action中验证TOKEN是否正确
/* TOKEN实现 */
/**
 *	类加载-获取全局TOKEN,防止CSRF攻击
 *  Controller中使用方法:$this->controller->get_token()
 *  @return 
 */
public function get_token() {
	return $_COOKIE['init_token'];
}

/**
 *	类加载-检测token值
 *  Controller中使用方法:$this->controller->check_token($ispost = true)
 *  @return 
 */
public function check_token($ispost = true) {
	if ($ispost && !$this->is_post()) return false;
	if ($this->get_gp('init_token') !== $this->get_token()) return false;
	return true;
}

/**
 *	类加载-设置全局TOKEN,防止CSRF攻击
 *  Controller中使用方法:$this->controller->set_token()
 *  @return 
 */
private function set_token() {
	if (!$_COOKIE['init_token']) {
		$str = substr(md5(time(). $this->get_useragent()), 5, 8);
		setcookie("init_token", $str);
		$_COOKIE['init_token'] = $str;	
	}
}

/* 框架运行的时候生成TOKEN 和 模板赋值TOKEN */
/**
 * 初始化控制器,
 */
public function __construct() {
	$this->filter();
	$this->set_token(); //生成全局TOKEN值,防止CRsf攻击
}
/**
 * 初始化
 */
public function __construct() {
	global $InitPHP_conf;
	$this->controller = $this->load('controller', 'c'); //导入Controller
	$this->view       = $this->load('view', 'v'); //导入View	
	$this->view->set_template_config($InitPHP_conf['template']); //设置模板
	$this->view->assign('init_token', $this->controller->get_token()); //全局输出init_token标记
}

/* 如何使用:*/
GET方式提交-在URL或者GET提交上面,添加init_token=
http://127.0.0.1/?init_token=
POST的方法,用一个隐藏表单 表单名称init_token 值:
然后在Action中
$this->controller->check_token(); 
来验证token是否一致

XSS风险控制:

  • XSS的问题是一个头大的问题,很多大型网站也经常会爆出这样的漏洞。
  • XSS防范主要是输出过滤。将输出到模板上的PHP变量都进行HTML过滤
  • InitPHP开发框架提供两种方式:模板输出的时候对全局进行过滤;提供InitPHP::output()输出过滤函数
  • 采用全局变量输出过滤的方式,需要开启配置:$InitPHP_conf['isviewfilter']
  • InitPHP::output()函数也可以还原已经被HTML过滤过的变量
/* 全局输出过滤 */
/**
 * 模板-显示视图
 * 1. 在Controller中需要显示模板,就必须调用该函数
 * 2. 模板解析可以设置 $InitPHP_conf['isviewfilter'] 值,对变量进行过滤
 * Controller中使用方法:$this->view->display();
 * @return array
 */
public function display() {
	global $InitPHP_conf;
	if (is_array($this->view)) {
		if ($InitPHP_conf['isviewfilter']) $this->out_put($this->view); //输出过滤
		foreach ($this->view as $key => $val) {
			$$key = $val;
		}
	}
	$this->template_arr = $this->parse_template_arr($this->template_arr); //模板设置
	foreach ($this->template_arr as $file_name) {
		if (in_array($file_name, $this->remove_tpl_arr)) continue;
		$complie_file_name = $this->template_run($file_name); //模板编译
		if (!file_exists($complie_file_name)) InitPHP::initError($complie_file_name. ' is not exist!');
		include_once($complie_file_name);
	}
}

/* 手工输出InitPHP::output函数 */
/**
 * 【静态】XSS过滤,输出内容过滤
 * 1. 框架支持全局XSS过滤机制-全局开启将消耗PHP运行
 * 2. 手动添加XSS过滤函数,在模板页面中直接调用
 * 全局使用方法:InitPHP::output($string, $type = 'encode');
 * @param string $string  需要过滤的字符串
 * @param string $type    encode HTML处理 | decode 反处理
 * @return string
 */
public static function output($string, $type = 'encode') {
	$html = array("&", '"', "'", "<", ">");
	$html_code = array("&", """, "'", "<", ">");
	if ($type == 'encode') {
		if (function_exists('htmlspecialchars')) return htmlspecialchars($string);
		return str_replace($html, $html_code, $string);
	} else {
		if (function_exists('htmlspecialchars_decode')) return htmlspecialchars_decode($string);
		return str_replace($html_code, $html, $string);
	}
}

SQL安全:

  • SQL的安全是非常重要的一个环节,如果你的SQL语句出现了问题,那么黑客很容易攻破你的网站
  • InitPHP框架提供了一整套SQL安全机制:sql_build和常用DB操作函数
  • 一般情况下你的DB操作我们提供的DB操作函数能满足你的需求了
  • 如果你自己写SQL语句,并且SQL语句中包含变量,请用sql_build提供的相关函数组装SQL语句
public function get_one($id, $table_name, $id_key = 'id') {
	$id = (int) $id;
	if ($id < 1) return array(); 
	$where = $this->build_where(array($id_key=>$id)); //组装函数
	$sql = sprintf("SELECT * FROM %s %s LIMIT 1", $table_name, $where);
	$result = $this->query($sql, false);
	if (!$result) return false;
	$r = $this->fetch_assoc($result);
	$this->set_default_link_id(); //设置默认的link_id
	return $r;
}

其他安全问题:

  • 项目安全还包括业务逻辑是否正确,是否会被用户钻空子
  • 类型的转换,INT类型的一定要强制转换

本文转载自:

共有 人打赏支持
粉丝 34
博文 596
码字总数 114025
作品 0
海淀
2018哪些行业需开展等级保护工作|等级测评

1、电子政务外网等级保护政策要求 《关于加强国家电子政务工程建设项目信息安全风险评估工作的通知》(发改高技〔2008〕2071 号) 《国家发展改革委关于进一步加强国家电子政务工程建设项目管...

zancun ⋅ 06/19 ⋅ 0

运维规章文档初稿

1.信息与数据安全整体策略 Skip to end of metadata Go to start of metadata 信息总体安全策略 关于敏感数据失效后处理原则与操作方法 关于数据安全管理员与数据安全策略执行规章制度 关于限...

Bruceweien ⋅ 2017/06/05 ⋅ 0

String,StringBuilder和StringBuffer类

今天看了一会儿关于String的一类的书,大概了解了String,StringBuilder和Stringuffer的区别。下面我就来浅谈一下关于这三部分的差别。 public class Test { int loopCount = 10000; // 执行...

laohng1995 ⋅ 2016/04/07 ⋅ 0

博览安全圈:研究人员惊现4G重大安全漏洞

  【IT168 资讯】为了响应国家号召,加强全民网络安全意识,我们会经常性的为大家奉上最具代表性的安全事件。   1.研究人员惊现4G重大安全漏洞   近年来,移动网络发展之迅猛是有目共睹...

it168网站 ⋅ 03/06 ⋅ 0

关于java Servlet,Struts,springMVC 的线程安全问题

现在主流的java的前端框架有:struts1,struts2,springmvc 还有最根本的servlet; 前些天一个朋友问我这方面的问题,就研究一番: 1.关于struts1: Struts1使用的ActionServlet是单例的,由这一个...

lifer ⋅ 2015/10/08 ⋅ 0

你所不知道的21个云服务器应用实践———云计算综合入门指南

它分为两个部分,分别是云计算基础和云计算实践。在基础篇中,我们能学习到关于云服务器远程控制搭建,数据管理使用,以及建站环境扩展等工具性内容;而在实践篇中,我们则能看到论坛、博客、...

阿里云_云栖社区 ⋅ 2017/11/30 ⋅ 0

国外PHP学习网站书籍资料汇总

PHP网站 ——PHP相关的有帮助的网站 PHP The Right Way: 一个PHP实践的快速参考指导 PHP Best Practices: PHP最佳实践指导 PHP Weekly: 一个PHP新闻周刊 PHP Security: PHP安全方面的指导 PH...

stone_ ⋅ 2015/01/07 ⋅ 0

OSC基于HTTPS+SHA1客户端哈希的登录注册上线

二月底,开源中国社区全面启用强制 HTTPS 登录 ,但是来自 @litescript 的建议关于安全登录方面还可以进一步改进的空间,@litescript 建议贴请看 明文傳輸密碼是爲了明文保存密碼 ,关于这个...

oschina ⋅ 2012/05/26 ⋅ 30

保障Web服务的安全

从基于传送的安全转移到基于信息的安全 当我给出关于Web服务的介绍的时候,不可避免的就会有来自于听众的关于安全的问题。最常见的问题是:“你是如何保障Web服务的安全的”。通常会跟随着怀疑...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

【资料整理】Security Features in the CRT

本文简要整理了 MSDN 上关于 “Security Features in the CRT” 方面的内容。详细参考官网。 许多老旧的 CRT 函数都有更新且更加安全的后续版本。在安全版本存在的情况下,老旧版本都会被标识...

摩云飞 ⋅ 2013/01/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 47分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部