热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析PHP中的安全模式(safe_mode)

php的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的php开放的web服务器上。当一个web服务器上运行的php打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。

什么是PHP安全模式:safe_mode

简单说,PHP安全模式就是以安全模式运行php。

php的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的php开放的web服务器上。当一个web服务器上运行的php打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。

在安全模式下,一些尝试访问文件系统的函数功能将被限制。运行web服务器用户id,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权 限,实现这个限制功能对于php来说是没有问题的。

在安全模式开启的时候,尝试读取或者写入一个本地文件的时候,php将检查当前访问用户是否是该目标文 件的所有者。如果不是所有者,则该操作会被禁止。

(写入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过php的安全 模式实现了防止你操作另外一个用户文件的操作。当然,一个web服务器可能能够访问一个具有全局写入权限的任意文件。)

当安全模式打开的时候,以下函数列表的功能将会受到限制:

chdir, move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink

同样的,一些php扩展中的函数也将会受到影响。(加载模块:在安全模式下dl函数将被禁止,如果要加载扩展的话,只能修改php.ini中的扩展选项,在php启动的时候加载)

在php安全模式打开的时候,需要执行系统程序的时候,必须是在safe_mode_exec_dir选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给escapeshellcmd函数进行过滤。

以下执行命令的函数列表将会受到影响:

exec,shell_exec,passthru,system,popen

另外,背部标记操作符(`)也将被关闭。

当运行在安全模式下,虽然不会引起错误,但是putenv函数将无效。同样的,其他一些尝试改变php环境变量的函数set_time_limit, set_include_path也将被忽略。

如何开启PHP安全模式(请注意,PHP5.3将不再有安全模式)

打开或者关闭php的安全模式是利用php.ini中的safe_mode选项:

safe_mode=On(使用安全模式)
safe_mode=Off(关闭安全模式)

在apache的httpd.conf中VirtualHost的相应设置方法

php_admin_flag safe_mode On(使用安全模式)
php_admin_flag safe_mode Off(关闭安全模式)
或者:
php_admin_value safe_mode1(使用安全模式)
php_admin_value safe_mode0(关闭安全模式)

启用安全模式后的影响:

当函数在访问文件系统的时候将进行文件所有者的检查。缺省情况下,会检查该文件所有者的用户id,当你能够修改文件所有者的组id(gid)为safe_mode_gid选项所指定的。

如果你有一个共享库文件在你的系统上,当你碰到需要include或require的时候,那么你可以使用 safe_mode_include_dir选项来设置你的路径,保证你的代码正常工作。(包含路径:如果你想要使用 safe_mode_include_dir选项包含更多的包含路径,那么你可以象include_path选项一样,在unix/linux系统下使用 冒号进行分割,在windows下使用分号进行分割)

比如你想要在安全模式下包含/usr/local/include/php下的文件,那么你可以设置选项为:

safe_mode_include_dir=/usr/local/include/php

如果你的包含的文件是需要执行的,那么你可以设置safe_mode_exec_dir选项。

比如你需要/usr/local/php-bin路径下的文件是可以执行的,那么可以设置选项为:

safe_mode_exec_dir=/usr/local/php-bin

(可执行:如果你执行的程序在/usr/bin目录下,那么你可以把这些的二进制文件,连接到你指定选项下能够执行的路径)

如果你想设置某些环境变量,那么可以使用safe_mode_allowed_env_vars选项。这个选项的值是一个环境变量的前缀,缺省是允许php_开头的环境变量,如果你想要改变,可以设置该选项的值,多个环境变量前缀之间使用逗号进行分割。

比如下面允许时区的环境变量tz,那么修改该选项的值为:

safe_mode_allowed_env_vars=php_,tz

除了安全模式以外,php还提供了许多其他许多特征来保证php的安全。

1、[隐藏php的版本号]

你能够在php.ini里使用expose_php选项来防止web服务器泄露php的报告信息。如下:

expose_php=on

利用整个设置,你能够阻碍一些来自自动脚本针对web服务器的攻击。通常情况下,http的头信息里面包含了如下信息:

server:apache/1.3.33(unix)php/5.2.4mod_ssl/2.8.16openssl/0.9.7c

在expose_php选项打开以后,php的版本信息将不包含在上面的头信息里。

当然,用户访问网站的时候同样能够看到.php的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在httpd.conf中找到如下这行:

addtype application/x-httpd.php

你就可以修改.php为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用php来解析.html和.htm文件的时候,那么你设置选项如下:

addtype application/x-httpd.html.htm

(解析html:配置你的web服务器使用php去解析所有的html文件,但是如果非服务器端代码也需要php去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对php脚本引擎的依赖,增强性能。)

2、[文件系统安全]

安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用open_basedir选现来指定一个你必须访问的目录。如果你指定了一个目录,php将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir选项能够工作在安全模式之外。

限制文件系统只能访问/tmp目录,那么设置选项为:

open_basedir=/tmp

3、[函数访问控制]

你能够在disable_functions选项中使用逗号分割来设定函数名,那么这些函数将在php脚本中被关闭。这个设置能够工作在安全模式之外。

disable_functiOns=dl

当然,同样的你能够使用disable_classes选项来关闭对一些类的访问。

4、[数据库安全]

假设你的php脚本中包含一个基于表单值来执行的mysql查询:

$sql=”update mytable set col1=”.$_post[“value”].”where col2=’somevalue'”;
$res=mysql_query($sql,$db);

你希望$_post[“value”]包含一个整数值来更新你的列col1。可是,一个恶意用户能够输入一个分号在表单字段里,接着,是一段他/她想被任意执行的sql语句。

举例,假设下面是$_post[“value”]提交的值:

0;insert into admin_users(username,password) values (‘me’,’mypassword’);

那么当这个查询发送给mysql查询的时候,那么就变成了下面这条sql:

update mytable set col1=0;
insert into admin_users(username,password) values (‘me’,’mypassword’);
where col2=’somevalue';

这明显是一个有害的查询!首先这个查询会在mytable表里更新col1。这个并没有什么麻烦的,但是第二个表达式,它将执行insert表达式 来插入一个能登陆的新管理员。第三个表达式就废弃了,但同时sql解析器将抛出一个错误,这个有害的查询才完成。这个攻击就是大家常说的sql injection(注:sql注入)。

当然,sql injection存在一个问题,对方必须了解你的数据库结构。在这个例子中,攻击者是知道你有一个表admin_users,并且知道包含username和password字段,同时,存储的密码是没有加密的。

除了你自己,一般的网站访问者是不知道这些关于数据库的信息。可是,如果你使用了一个开发源代码的在线电子商务程序,或者使用一个自由的讨论版程序,这些数据表的定义都是已知的,或者有一些用户能够访问到你的数据库。

此外,你的脚本输出会提示一个查询错误,这些信息里包含了很多关于数据库结构的重要信息。在一个正常工作的网站上,你应该考虑设置 display_errors选项为off,并且使用log_errors来代替display_errors,把警告和错误信息插入到文件中。

(数据库权限:它是一个非常重要的东西,你只有正确的权限,才能通过脚本正确的连接数据库。你应该不要在脚本中使用管理员去连接数据库。如果你这么 做,那么一个攻击者将可能获取全部的数据库权限,并且包括其他相同服务器的权限。攻击者将可能运行grant或create user命令来获取更多的访问权限。)

如果你要防止sql injection攻击,你必须保证用户表单里提交的内容不是一个能够执行的sql表达式。

前一个例子中,我们使用一个整型值来进行更新。如果在单引号后面跟上一个字符串,这个攻击者在分号之前必须提交一个闭合的引用在整个sql表达式中。可是,当magic_quotes_gpc选项是开启的时候,在web表单中提交的引号将自动被转义。

为了防止被恶意的攻击者进行sql injection攻击,你应该总是确认提交的数据是合法的。如果你需要的是一个整数值,那么你可以使用is_numeric函数来测试这个表达值,或者使用settype函数来转换为一个数字,清除任何一个傻傻的sql语句。

如果你开发的程序需要几个提交的值在一个sql表达式里,你能够使用sprintf函数来构建一个sql字符串,使用格式化字符来指示数据类型的每个值。看下面的例子:

$sql=sprintf(“update mytable set col1=%d where col2=’%s'”, $_post[“number”], mysql_escape_string($_post[“string”]));

在上一个例子中,整个mysql的数据已经被使用,所以这个字符串已经通过mysql_escape_string函数进行过滤。对于其他数据库,你可以使用addslashes函数进行转义,或者使用其他方法。

更多php相关知识,请访问php教程!

以上就是解析PHP中的安全模式(safe_mode)的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
author-avatar
海豚青春_407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有