制作安全性高的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 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
PHP中的流(streams)浅析
Jul 02 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
PHP多维数组排序array详解
Nov 21 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 PHP
PHP与Web页面的交互示例详解二
Aug 04 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
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
js 小数取整的函数
2010/05/10 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
Python 面试中 8 个必考问题
2018/11/16 Python
python 实现二维列表转置
2019/12/02 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
django model通过字典更新数据实例
2020/04/01 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
2014年新生军训方案
2014/05/01 职场文书
师德师风自查材料
2014/10/14 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
孔繁森观后感
2015/06/10 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python