安全

PHP 作为一种强大的语言,无论是以模块还是 CGI 的方式安装,它的解释器都可以在服务器上访问文件、运行命令以及创建网络连接等。这些功能也许会给服务器添加很多不安全因素,但是只要正确地安装和配置 PHP,以及编写安全的代码,那么 PHP 相对于 Perl 和 C 来说,是能创建出更安全的 CGI 程序的。这部分提出一些原则,在不同环境下尽可能提高安全性。

安装

以CGI模式安装PHP时,它的设计可以用以避免访问系统文件和服务器的任意目录。在安装时配置一些选项可以有助避免这类攻击。具体见文档介绍。同理,以Apache模块安装时,权限的注意也请见官网介绍

Session安全

这部分见Session部分的安全介绍。

文件系统

PHP 被设计为以用户级别来访问文件系统,所以完全有可能通过编写一段 PHP 代码来读取系统文件如 /etc/passwd,更改网络连接以及发送大量打印任务等等。因此必须确保 PHP 代码读取和写入的是合适的文件。

由于 PHP 的文件系统操作是基于 C 语言的函数的,Null字符在 C 语言中用于标识字符串结束,一个完整的字符串是从其开头到遇见 Null 字符为止。因此,任何用于操作文件系统的字符串(特别是程序外部输入的字符串)都必须经过适当的检查。

这种安全问题也会出现在执行来自用户输入的命令。通常有两条路可以选择:1)检查所有来自外部的变量(黑名单);2)后台写死可以执行的文件名或命令有限集(白名单

数据库

由于敏感数据和机密数据通常存储在数据库中,数据库安全和保护显得尤为重要。PHP 本身并不能保护数据库的安全。这里只是讲述怎样用 PHP 脚本对数据库进行基本的访问和操作。

设计数据库时,永远不要使用数据库所有者或超级用户帐号来连接数据库,因为这些帐号可以执行任意的操作。应该为程序的每个方面创建不同的数据库帐号,并赋予对数据库对象的极有限的权限。同时,一些功能可以用视图(view)、触发器(trigger)或者规则(rule)在数据库层面完成。

连接数据库时,把连接建立在 SSL 加密技术上可以增加客户端和服务器端通信的安全性,或者 SSH 也可以用于加密客户端和数据库之间的连接。

存储模型中,可以散列一些没必要明文显示的数据,建议加盐散列,同时采用新的SHA散列算法(如SHA-2或SHA-3)以增加安全程度。

SQL注入

这部分内容是极为常见的网络安全问题,通过构造特殊的SQL语句,获取数据库信息甚至主机权限,介绍从略。

在预防措施上,永远不要信任外部输入的任何数据,包括表单里和cookie的信息

使用权限被严格限制的帐号访问数据库

检查输入的数据是否具有所期望的数据格式

减少SQL语句的拼接使用

使用数据库特定的敏感字符转义函数

还可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图

错误报告

错误报告是一把双刃剑。一方面可以提高安全性,另一方面又有利于攻击者收集服务器的信息以便寻找弱点。PHP 的独有的错误提示风格可以说明系统在运行 PHP,一个函数错误可能暴露系统正在使用的数据库,一个文件系统或者 PHP 的错误就会暴露 web 服务器具有什么权限,以及文件在服务器上的组织结构等。

有三个常用的办法处理这些问题。第一个是彻底地检查所有函数,并尝试弥补大多数错误。第二个是对在线系统彻底关闭错误报告。第三个是使用 PHP 自定义的错误处理函数创建自己的错误处理机制

可以通过error_reporting()帮助找到错误所在并使代码更安全。发布程序前,设置为E_ALL找到所有使用不当的地方;正式发布后,设为0彻底关闭错误报告或设置php.ini中的display_errors为off。

隐藏PHP

一些简单的方法可以帮助隐藏 PHP,这样做可以提高攻击者发现系统弱点的难度。在 php.ini 文件里设置expose_php = off,可以减少他们能获得的有用信息。

另一个策略就是让 web 服务器用 PHP 解析不同扩展名。无论是通过 .htaccess 文件还是 Apache 的配置文件,都可以设置能误导攻击者的文件扩展名。

更多机智的隐藏方法见官网隐藏PHP一节。

results matching ""

    No results matching ""