PHP安全的一些想法

         如果你是一个PHP程序员,那你肯定不想看到你的程序被黑客破坏,甚至你的运营人员经常抱怨,哪里哪里被人搞了。

         当然,很多时候我们都说开发用框架比较好。之前我学习框架的时候,一样,觉得框架学习成本高,不好学,宁可自己弄几个类库写写。但是这样的类库,本身对于项目没有开发10个以上的开发人员来说,你的代码安全吗?所以,很多时候,很多人在论坛讨论为什么要用框架开发是有原因的,框架将我们最基本的安全给处理了,让你省心了。

PHP的安全掌握点看似很多,其实也不多,结合我的InitPHP开源框架来整理下PHP的安全点:

  • 全局变量安全。例如$_GET,$_POST,$_COOKIE,$_SERVICE之类的PHP全局变量是否过滤了?要记住一句话,所有外部获取的数据都是不可信任的。
 /**
  * 安全过滤类-全局变量过滤
  * 
  * @return
  */
 public function fliter() {
  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::fliter_slashes($_GET);
  self::fliter_slashes($_POST);
  self::fliter_slashes($_COOKIE);
  self::fliter_slashes($_FILES);
  self::fliter_slashes($_REQUEST);
  if ($GLOBALS['InitPHP_conf']['isuri']) $this->uri(); //是否开启URI访问模式
 }
 /**
  * 安全过滤类-获取GET或者POST的参数值,经过过滤
  * 
  * @param  string|array $value 参数
  * @param  bool         $isfliter 变量是否过滤
  * @return string|array
  */
 public function get_gp($value, $isfliter = true) {
  if (!is_array($value)) {
   if (isset($_GET[$value])) $temp = $_GET[$value];
   if (isset($_POST[$value])) $temp = $_POST[$value];
   $temp = ($isfliter === true) ? $this->fliter_escape($temp) : $temp;
   return $temp;
  } else {
   $temp = array();
   foreach ($value as $val) {
    if (isset($_GET[$val])) $temp[$val] = $_GET[$val];
    if (isset($_POST[$val])) $temp[$val] = $_POST[$val];
    $temp[$val] = ($isfliter === true) ? $this->fliter_escape($temp[$val]) : $temp[$val];
   }
   return $temp;
  }
 }

 

  • SQL注入安全。如果你还在暴力得写你的SQL语句,那么很危险,SQL语句组装一定要对外部未知变量进行下划线添加,防止恶意数据注入。
	/**
	 * SQL组装-私有SQL过滤
	 * 
	 * @param  string $val 过滤的值
	 * @param  int    $iskey 0-过滤value值,1-过滤字段
	 * @return string
	 */
	private function build_escape_single($val, $iskey = 0) {
		if ($iskey === 0) {
			if (is_numeric($val)) {
				return " '" . $val . "' ";
			} else {
				return " '" . addslashes(stripslashes($val)) . "' ";
			}
		} else {
			$val = str_replace(array('`', ' '), '', $val);
			return ' `'.addslashes(stripslashes($val)).'` ';
  		}
	}

 

  • XSS攻击防范。XSS攻击防范,最主要的就是输出数据过滤,对输出的数据进行JAVASCRIPT过滤,这个是必须的。现在网上很多程序在XSS防范上做得不是很到位。

 

	/**
	 *	InitPHP 输出处理函数
	 *
	 *  @param  array  $value  需要过滤的变量
	 *  @return object
	 */
	public static function output($value, $type = 'encode') {
		if ($type == 'encode') {
			if (function_exists('htmlspecialchars')) return htmlspecialchars($value);
			return str_replace(array("&", '"', "'", "<", ">"), array("&", """, "'", "<", ">"), $value);
		} else {
			if (function_exists('htmlspecialchars_decode')) return htmlspecialchars_decode($value);
			return str_replace(array("&", """, "'", "<", ">"), array("&", '"', "'", "<", ">"), $value);
		}
	}

 

  • CSRF攻击。CSRF攻击看是不起眼,但是威力非常大。至于CSRF的概念,自己百度吧。主要防御就是用户进入你的网站,生成一个全局的token,每次操作都验证这个token。
 /**
  * 类加载-获取全局TOKEN,防止CSRF攻击
  *  @return 
  */
 public function get_token() {
  return $_COOKIE['init_token'];
 }
 
 /**
  * 类加载-检测token值
  *  @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攻击
  *
  *  @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; 
  }
 }

 

  • 程序安全。
    1.  检查你的变量中是否大量使用PHP禁止的危险变量。
    2. review你的程序代码,是否没有做到程序过滤,比如只进行JS的过滤,不做PHP端的过滤。
    3. 权限是否到位。比如你的每个页面是否需要一定用户权限来访问,而恶意用户经过URL就能来操控。
    4. 你的INT类型之类的数据是否强制转换?
    5. 上传文件是一个很危险的过程,是否限制了上传文件的类型,做了简单的文件检查?

以上大概就是常用的PHP安全方面的知识,一般情况下,只要记住,外部进来的数据,都是不可信任的、需要过滤的。包括你的url中的分页page参数,你不进行转化,也会成为xss的攻击入口!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值