制作安全性高的PHP网站的几个实用要点


Posted in PHP onDecember 30, 2014

大家都知道PHP已经是当前最流行的Web应用编程语言了。但是也与其他脚本语言一样,PHP也有几个很危险的安全漏洞。所以在这篇教学文章中,我们将大致看看几个实用的技巧来让你避免一些常见的PHP安全问题。

技巧1:使用合适的错误报告

一般在开发过程中,很多程序员总是忘了制作程序错误报告,这是极大的错误,因为恰当的错误报告不仅仅是最好的调试工具,也是极佳的安全漏洞检测工具,这能让你把应用真正上线前尽可能找出你将会遇到的问题。
当然也有很多方式去启用错误报告。比如在 php.in 配置文件中你可以设置在运行时启用

启动错误报告
error_reporting(E_ALL);

停用错误报告
error_reporting(0);

技巧2:不使用PHP的Weak属性

有几个PHP的属性是需要被设置为OFF的。一般它们都存在于PHP4里面,而在PHP5中是不推荐使用的。尤其最后在PHP6里面,这些属性都被移除了。

注册全局变量
当 register_globals 被设置为ON时,就相当于设置Environment,GET,POST,COOKIE或者Server变量都定义为全局变量。此时你根本不需要去写 $_POST[‘username']来获取表单变量'username',只需要'$username'就能获取此变量了。
那么你肯定在想既然设置 register_globals 为 ON 有这么方便的好处,那为什么不要使用呢?因为如果你这样做将会带来很多安全性的问题,而且也可能与局部变量名称相冲突。
比如先看看下面的代码:

if( !empty( $_POST[‘username'] ) && $_POST[‘username'] == ‘test123′ && !empty( $_POST[‘password'] ) && $_POST[‘password'] == “pass123″ )

{

$access = true;

}

如果运行期间, register_globals 被设置为ON,那么用户只需要传输 access=1 在一句查询字符串中就能获取到PHP脚本运行的任何东西了。
在.htaccess中停用全局变量

php_flag register_globals 0

在php.ini中停用全局变量

register_globals = Off

停用类似 magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase 这些Magic Quotes
在.htaccess文件中设置

php_flag magic_quotes_gpc 0

php_flag magic_quotes_runtime 0

在php.ini中设置

magic_quotes_gpc = Off

magic_quotes_runtime = Off

magic_quotes_sybase = Off

技巧3:验证用户输入

你当然也可以验证用户的输入,首先必须知道你期望用户输入的数据类型。这样就能在浏览器端做好防御用户恶意攻击你的准备。

技巧4:避免用户进行交叉站点脚本攻击

在Web应用中,都是简单地接受用户输入表单然后反馈结果。在接受用户输入时,如果允许HTML格式输入将是非常危险的事情,因为这也就允许了JavaScript以不可预料的方式侵入后直接执行。哪怕只要有一个这样漏洞,cookie数据都可能被盗取进而导致用户的账户被盗取。

技巧5:预防SQL注入攻击

PHP基本没有提供任何工具来保护你的数据库,所以当你连接数据库时,你可以使用下面这个mysqli_real_escape_string 函数。

$username = mysqli_real_escape_string( $GET[‘username'] );

mysql_query( “SELECT * FROM tbl_employee WHERE username = '”.$username.“‘”);

好了,在这篇简短的文章中,我们阐述了几个开发过程中不能忽视的PHP安全性问题。但是最终是否使用,如何使用还是开发人员来决定的。希望这篇文章能帮助到你们。

PHP 相关文章推荐
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
Yii2 批量插入、更新数据实例
Mar 15 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
PHP数组array类常见操作示例
May 15 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 #PHP
php实现Linux服务器木马排查及加固功能
Dec 29 #PHP
php连接oracle数据库及查询数据的方法
Dec 29 #PHP
php查询mssql出现乱码的解决方法
Dec 29 #PHP
php+mysql大量用户登录解决方案分析
Dec 29 #PHP
php从memcache读取数据再批量写入mysql的方法
Dec 29 #PHP
php操作mongoDB实例分析
Dec 29 #PHP
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
隐藏你的.php文件的实现方法
2007/03/19 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
python 实现归并排序算法
2012/06/05 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
医药类个人求职的自我评价
2014/02/12 职场文书
给全校老师的建议书
2014/03/13 职场文书
歌唱比赛主持词
2014/03/18 职场文书
个人自我剖析材料
2014/09/30 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
如何撰写创业策划书
2019/06/27 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书