PHP安全的一些想法
2011-09-19 11:58
92 查看
如果你是一个PHP程序员,那你肯定不想看到你的程序被黑客破坏,甚至你的运营人员经常抱怨,哪里哪里被人搞了。
当然,很多时候我们都说开发用框架比较好。之前我学习框架的时候,一样,觉得框架学习成本高,不好学,宁可自己弄几个类库写写。但是这样的类库,本身对于项目没有开发10个以上的开发人员来说,你的代码安全吗?所以,很多时候,很多人在论坛讨论为什么要用框架开发是有原因的,框架将我们最基本的安全给处理了,让你省心了。
PHP的安全掌握点看似很多,其实也不多,结合我的InitPHP开源框架来整理下PHP的安全点:
全局变量安全。例如$_GET,$_POST,$_COOKIE,$_SERVICE之类的PHP全局变量是否过滤了?要记住一句话,所有外部获取的数据都是不可信任的。
SQL注入安全。如果你还在暴力得写你的SQL语句,那么很危险,SQL语句组装一定要对外部未知变量进行下划线添加,防止恶意数据注入。
XSS攻击防范。XSS攻击防范,最主要的就是输出数据过滤,对输出的数据进行JAVASCRIPT过滤,这个是必须的。现在网上很多程序在XSS防范上做得不是很到位。
CSRF攻击。CSRF攻击看是不起眼,但是威力非常大。至于CSRF的概念,自己百度吧。主要防御就是用户进入你的网站,生成一个全局的token,每次操作都验证这个token。
程序安全。
检查你的变量中是否大量使用PHP禁止的危险变量。
review你的程序代码,是否没有做到程序过滤,比如只进行JS的过滤,不做PHP端的过滤。
权限是否到位。比如你的每个页面是否需要一定用户权限来访问,而恶意用户经过URL就能来操控。
你的INT类型之类的数据是否强制转换?
上传文件是一个很危险的过程,是否限制了上传文件的类型,做了简单的文件检查?
以上大概就是常用的PHP安全方面的知识,一般情况下,只要记住,外部进来的数据,都是不可信任的、需要过滤的。包括你的url中的分页page参数,你不进行转化,也会成为xss的攻击入口!
当然,很多时候我们都说开发用框架比较好。之前我学习框架的时候,一样,觉得框架学习成本高,不好学,宁可自己弄几个类库写写。但是这样的类库,本身对于项目没有开发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; } }
程序安全。
检查你的变量中是否大量使用PHP禁止的危险变量。
review你的程序代码,是否没有做到程序过滤,比如只进行JS的过滤,不做PHP端的过滤。
权限是否到位。比如你的每个页面是否需要一定用户权限来访问,而恶意用户经过URL就能来操控。
你的INT类型之类的数据是否强制转换?
上传文件是一个很危险的过程,是否限制了上传文件的类型,做了简单的文件检查?
以上大概就是常用的PHP安全方面的知识,一般情况下,只要记住,外部进来的数据,都是不可信任的、需要过滤的。包括你的url中的分页page参数,你不进行转化,也会成为xss的攻击入口!
相关文章推荐
- PHP安全有帮助的一些函数
- php关于网站安全的一些注意事项
- PHP安全编程:网站安全设计的一些原则
- PHP 安全手册 第八条 保护一些重要的文件,拒绝其它人进行访问
- 保证PHP网站安全的一些编程技巧
- PHP网站的一些常见安全措施
- 对客户端安全的一些想法
- 技术文章 | 谈谈关于PHP的代码安全相关的一些致命知识
- 关于煤矿安全管理的一些想法
- 关于PHP安全配置绕过问题的一些说明
- 整理一些PHP开发安全问题
- 通过对php一些服务器端特性的配置加强php的安全
- 关于php 定时执行的一些想法
- PHP 一些安全设置
- 对PHP安全有帮助的一些函数
- 通过对php一些服务器端特性的配置加强php的安全
- 整理一些PHP开发安全问题
- 谈谈关于PHP的代码安全相关的一些致命知识
- 对PHP安全有帮助的一些函数
- 对PHP安全有帮助的一些函数