PHP安全防范技巧分享


Posted in PHP onNovember 03, 2011

PHP代码安全和XSS,SQL注入等对于各类网站的安全非常中用,尤其是UGC(User Generated Content)网站,论坛和电子商务网站,常常是XSS和SQL注入的重灾区。这里简单介绍一些基本编程要点, 相对系统安全来说,php安全防范更多要求编程人员对用户输入的各种参数能更细心.

php编译过程中的安全
建议安装Suhosin补丁,必装安全补丁

php.ini安全设置
register_global = off
magic_quotes_gpc = off
display_error = off
log_error = on
# allow_url_fopen = off
expose_php = off
open_basedir =
safe_mode = on
disable_function = exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,popen,show_source,get_cfg_var
safe_mode_include_dir =

DB SQL预处理
mysql_real_escape_string (很多PHPer仍在依靠addslashes防止SQL注入,但是这种方式对中文编码仍然是有问题的。addslashes的问题在于黑客可以用0xbf27来代替单引号,GBK编码中0xbf27不是一个合法字符,因此addslashes只是将0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,具体见这篇文章)。用mysql_real_escape_string函数也需要指定正确的字符集,否则依然可能有问题。
prepare + execute(PDO)
ZendFramework可以用DB类的quote或者quoteInto, 这两个方法是根据各种数据库实施不用方法的,不会像mysql_real_escape_string只能用于mysql

用户输入的处理
无需保留HTML标签的可以用以下方法

strip_tags, 删除string中所有html标签
htmlspecialchars,只对”<”,”>”,”;”,”'”字符进行转义
htmlentities,对所有html进行转义

必须保留HTML标签情况下可以考虑以下工具:
HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
htmLawed: PHP code to purify & filter HTML

上传文件
用is_uploaded_file和move_uploaded_file函数,使用HTTP_POST_FILES[]数组。并通过去掉上传目录的PHP解释功能来防止用户上传php脚本。
ZF框架下可以考虑使用File_upload模块

Session,Cookie和Form的安全处理
不要依赖Cookie进行核心验证,重要信息需要加密, Form Post之前对传输数据进行哈希, 例如你发出去的form元素如下:

程序代码

<pre lang="php"><input type="hidden" name="H[name]" value="<?php echo $Oname?>"/>
<input type="hidden" name="H[age]" value="<?php echo $Oage?>"/>
<?php $sign = md5('name'.$Oname.'age'.$Oage.$secret); ?>
<input type="hidden" name="hash" value="<?php echo $sign?>"" />

POST回来之后对参数进行验证

程序代码

$str = ""; 
foreach($_POST['H'] as $key=>$value) { 
$str .= $key.$value; 
} 
if($_POST['hash'] != md5($str.$secret)) { 
echo "Hidden form data modified"; exit; 
}

PHP安全检测工具(XSS和SQL Insertion)
Wapiti - Web application security auditor(Wapiti - 小巧的站点漏洞检测工具) (SQL injection/XSS攻击检查工具)
安?/使用方法:
apt-get install libtidy-0.99-0 python-ctypes python-utidylib
python wapiti.py http://Your Website URL/ -m GET_XSS
Pixy: XSS and SQLI Scanner for PHP( Pixy - PHP 源码缺陷分析工具)
安?: apt-get install default-jdk
Remote PHP Vulnerability Scanner(自动化 PHP页面缺陷分析, XSS检测功能较强)
PHPIDS - PHP 入侵检测系?

PHP 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
php创建sprite
Feb 11 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
浅析php创建者模式
Nov 25 PHP
学习php开源项目的源码指南
Dec 21 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
Mar 21 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 #PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 #PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 #PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 #PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 #PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 #PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 #PHP
You might like
PHP 高级课程笔记 面向对象
2009/06/21 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
Python版微信红包分配算法
2015/05/04 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
python 如何停止一个死循环的线程
2020/11/24 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
python 对xml解析的示例
2021/02/27 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
幼师求职信
2014/06/23 职场文书
保密工作承诺书
2014/08/29 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers