PHP安全模式详解(PHP5.4安全模式将消失)

php安全模式详解(黄龟素)

这是之前的笔记,随笔分享。请注意,PHP安全模式在PHP 5.4版本中已不再支持。查看官方说明:

安全模式不再被支持。依赖安全模式的应用可能需要进行安全方面的调整。

安全模式

一直未使用过PHP的safe_mode安全模式,此笔记供日后参考。

PHP的安全模式旨在解决共享服务器(shared-server)的安全问题。尽管在结构上尝试在PHP层面上解决这个问题是不合理的,但修改Web服务器层和操作系统层显得不切实际。因此,许多人,尤其是ISP,目前采用安全模式。

立即学习“PHP免费学习笔记(深入)”;

safe_mode是唯一具有PHP_INI_SYSTEM属性的设置,必须通过php.ini或httpd.conf来配置。要启用safe_mode,只需在php.ini中修改:safe_mode = On,或者在httpd.conf中定义目录:Options FollowSymLinks php_admin_value safe_mode 1,然后重启Apache,safe_mode即生效。

启用safe_mode后,将对许多PHP函数进行限制,特别是与系统相关的文件操作和命令执行函数。所有操作文件的函数只能操作与脚本UID相同的文件(脚本的UID不一定是运行Web服务器用户的UID)。

虽然safe_mode并非万能(低版本PHP可以绕过),但强烈建议开启安全模式,这在一定程度上可以避免一些未知的攻击。不过,启用safe_mode会带来许多限制,可能对应用产生影响,因此需要调整代码和配置以实现和谐。

安全模式配置指令:

名称 默认值 可修改范围 更新记录

safe_mode”0″PHP_INI_SYSTEMsafe_mode_gid”0″PHP_INI_SYSTEM自PHP 4.1.0起可用safe_mode_include_dirNULLPHP_INI_SYSTEM自PHP 4.1.0起可用safe_mode_exec_dir””PHP_INI_SYSTEMsafe_mode_allowed_env_vars”PHP_”PHP_INI_SYSTEMsafe_mode_protected_env_vars”LD_LIBRARY_PATH”PHP_INI_SYSTEMopen_basedirNULLPHP_INI_SYSTEMdisable_functions””仅php.ini自PHP 4.0.1起可用disable_classes””仅php.ini自PHP 4.3.2起可用配置选项的简要解释

safe_mode boolean

是否启用PHP的安全模式。PHP的安全模式是一个非常重要的内置安全机制,可以控制一些PHP中的函数,比如system(),同时对许多文件操作函数进行权限控制,也不允许访问某些关键文件,如/etc/passwd。然而,默认的php.ini并未启用安全模式。我们可以将其开启:safe_mode = on,或者通过代码:

ini_set("safe_mode",true);

safe_mode_gid boolean

默认情况下,安全模式在打开文件时会进行UID比较检查。如果希望放宽到GID比较,则启用safe_mode_gid。用于文件访问时使用UID(FALSE)还是GID(TRUE)进行检查。

safe_mode_include_dir string

当从此目录及其子目录包含文件时(目录必须在include_path中或使用完整路径),将越过UID/GID检查。

自PHP 4.2.0起,本指令可以接受与include_path指令类似的风格,用冒号(Windows中为分号)分隔的路径,而不只是一个目录。

指定的限制实际上是前缀,而非目录名。例如,“safe_mode_include_dir = /dir/incl”将允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果希望将访问限制在一个指定的目录,请在结尾加上斜线,例如:“safe_mode_include_dir = /dir/incl/”。

如果本指令的值为空,在PHP 4.2.3及PHP 4.3.3起,具有不同UID/GID的文件将不能被包含。在较早版本中,所有文件都能被包含。

safe_mode_exec_dir string

如果PHP使用了安全模式,system()和其他程序执行函数将拒绝启动不在此目录中的程序。必须使用/作为目录分隔符,包括Windows中。

safe_mode_allowed_env_vars string

设置某些环境变量可能是潜在的安全漏洞。本指令包含一个逗号分隔的前缀列表。在安全模式下,用户只能改变那些名称具有此处提供的前缀的环境变量。默认情况下,用户只能设置以PHP_开头的环境变量(例如PHP_FOO = BAR)。

safe_mode_protected_env_vars string

沉浸式翻译 沉浸式翻译

沉浸式翻译:全网口碑炸裂的双语对照网页翻译插件

沉浸式翻译 83 查看详情 沉浸式翻译

本指令包含一个逗号分隔的环境变量列表,最终用户不能用putenv()来改变这些环境变量。即使在safe_mode_allowed_env_vars中设置了允许修改,也不能改变这些变量。

open_basedir string

将PHP能够打开的文件限制在指定的目录树中,包括文件本身。本指令不受安全模式启用或关闭的影响。

当脚本试图使用例如fopen()或gzopen()打开文件时,该文件的位置将被检查。如果文件在指定的目录树之外,PHP将拒绝打开它。所有符号链接都会被解析,因此不可能通过符号链接来避开此限制。

特殊值.指明脚本的工作目录将被作为基准目录。但这有些危险,因为脚本的工作目录可以轻易被chdir()改变。

在httpd.conf文件中,open_basedir可以通过“php_admin_value open_basedir none”的方法关闭,例如某些虚拟主机中:

  php_admin_value open_basedir /docroot

在Windows中,用分号分隔目录。在其他系统中用冒号分隔目录。作为Apache模块时,父目录中的open_basedir路径自动被继承。

用open_basedir指定的限制实际上是前缀,不是目录名。也就是说,“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。

默认是允许打开所有文件。

disable_functions string

本指令允许您基于安全原因禁止某些函数。接受逗号分隔的函数名列表作为参数。disable_functions不受安全模式的影响。

本指令只能在php.ini中设置。例如,不能在httpd.conf中设置。

disable_classes string

本指令可以使您出于安全的理由禁用某些类。用逗号分隔类名。disable_classes不受安全模式的影响。

本指令只能在php.ini中设置。例如,不能在httpd.conf中设置。

expose_php = On/Off string

Server Apache/2.2.19 (Win32) PHP/5.3.8

PHP安全模式详解(PHP5.4安全模式将消失)

实战演示

当safe_mode设置为on时,PHP将通过文件函数或其目录检查当前脚本的拥有者是否与将被操作的文件的拥有者相匹配。例如:

4 -rw-r--r-- 1 httpd root    72 2012-04-16 00:51 test.php4 -rw-r--r-- 1 root root 1853 2012-03-28 16:20 /etc/passwd

运行test.php:


如果安全模式被激活,则将会导致以下错误:

Warning: fopen() [function.fopen]: SAFE MODE Restriction in effect. The script whose uid is 1003 is not allowed to access /etc/passwd owned by uid 0 in /usr/local/httpd/htdocs/test.php on line 2Warning: fopen(/etc/passwd) [function.fopen]: failed to open stream: Inappropriate ioctl for device in /usr/local/httpd/htdocs/test.php on line 2Warning: readfile() [function.readfile]: SAFE MODE Restriction in effect. The script whose uid is 1003 is not allowed to access /etc/passwd owned by uid 0 in /usr/local/httpd/htdocs/test.php on line 3Warning: readfile(/etc/passwd) [function.readfile]: failed to open stream: Inappropriate ioctl for device in /usr/local/httpd/htdocs/test.php on line 3

也可以单独地屏蔽某些函数。请注意disable_functions选项不能在php.ini文件外部使用,也就是说无法在httpd.conf文件的按不同虚拟主机或不同目录的方式来屏蔽函数。如果将如下内容加入到php.ini文件:

disable_functions readfile,system

则会得到如下的输出:

Warning: readfile() has been disabled for security reasons in /usr/local/httpd/htdocs/test.php on line 3

安全模式限制函数

函数名 限制

dbmopen()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。dbase_open()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。filepro()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。filepro_rowcount()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。filepro_retrieve()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。ifx_*sql_safe_mode限制,(!= safe mode)ingres_*sql_safe_mode限制,(!= safe mode)mysql_*sql_safe_mode限制,(!= safe mode)pg_loimport()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。posix_mkfifo()检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。putenv()遵循ini设置的safe_mode_protected_env_vars和safe_mode_allowed_env_vars选项。请参考putenv()函数的有关文档。move_uploaded_file()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。chdir()检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。dl()本函数在安全模式下被禁用。backtick operator本函数在安全模式下被禁用。shell_exec()本函数在安全模式下被禁用。exec()只能在safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用..。escapeshellcmd()将被作用于此函数的参数上。system()只能在safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用..。escapeshellcmd()将被作用于此函数的参数上。passthru()只能在safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用..。escapeshellcmd()将被作用于此函数的参数上。popen()只能在safe_mode_exec_dir设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用..。escapeshellcmd()将被作用于此函数的参数上。fopen()检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。mkdir()检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。rmdir()检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。rename()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。unlink()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。copy()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。(源文件和目标文件)chgrp()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。chown()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。chmod()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。另外,不能设置SUID、SGID和sticky bits。touch()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。symlink()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。(注意:仅测试目标)link()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。(注意:仅测试目标)apache_request_headers()在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。header()在安全模式下,如果设置了WWW-Authenticate,当前脚本的UID将被添加到该标头的realm部分。PHP_AUTH变量在安全模式下,变量PHP_AUTH_USER、PHP_AUTH_PW和PHP_AUTH_TYPE在$_SERVER中不可用。但无论如何,您仍然可以使用REMOTE_USER来获取用户名称(USER)。(注意:仅PHP 4.3.0以后有效)highlight_file(), show_source()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。(注意,仅在4.2.1版本后有效)parse_ini_file()检查被操作的文件或目录是否与正在执行的脚本有相同的UID(所有者)。检查被操作的目录是否与正在执行的脚本有相同的UID(所有者)。(注意,仅在4.2.1版本后有效)set_time_limit()在安全模式下不起作用。max_execution_time在安全模式下不起作用。mail()在安全模式下,第五个参数被屏蔽。(注意,仅自PHP 4.2.3起受影响)

以上就是PHP安全模式详解(PHP5.4安全模式将消失)的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/473349.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 08:27:32
下一篇 2025年11月8日 08:28:53

相关推荐

  • 响应式图片上叠加精确位置标记的CSS指南

    针对使用bootstrap `img-fluid`等类实现的响应式图片,本教程详细阐述了如何通过css的相对定位容器和绝对定位标记,实现标记在图片上的精确叠加。文章将指导您如何构建合适的容器、应用正确的定位属性,并利用`calc()`函数进行精细的坐标调整,确保标记在图片尺寸动态变化时依然能准确无误…

    2025年12月23日 好文分享
    000
  • JavaScript实现自定义WordPress导航栏点击外部关闭功能

    本教程详细介绍了如何为自定义wordpress导航栏实现点击外部区域自动关闭的功能。通过引入一个css覆盖层(overlay)并结合javascript事件监听,可以有效捕获页面点击事件,从而在用户点击导航栏外部时,平滑地关闭导航菜单,提升用户体验。 在开发自定义WordPress主题时,常常需要构…

    2025年12月23日 好文分享
    000
  • CSS定位技巧:在文本下方优雅地放置装饰性图形

    本教程详细阐述了如何利用css的定位属性在文本内容下方放置装饰性图形,无论是通过css伪元素创建圆形/椭圆,还是定位现有图片。核心在于父元素使用position: relative,子元素或伪元素使用position: absolute并结合z-index: -1实现层叠效果。同时,文章也强调了使用…

    2025年12月23日
    000
  • Flask 应用中 HTML 文本显示的最佳实践

    本文旨在解决 Flask 应用中 HTML 页面文本内容无法正常显示的问题,尤其是在 CSS 和 Favicon 均正常加载的情况下。核心原因在于将文本直接置于 标签内不符合 HTML 规范及最佳实践。教程将详细阐述如何通过使用 或 等语义化标签来正确包裹文本内容,确保在各类浏览器中实现稳定、可控的…

    2025年12月23日
    000
  • Windows Git如何追踪HTML和CSS修改提交版本

    初始化仓库后添加HTML和CSS文件,通过git add与git commit提交更改,用git status、git diff和git log查看状态与历史,最后git push同步到远程,确保每次修改被完整记录。 在 Windows 上使用 Git 追踪 HTML 和 CSS 文件的修改并提交版…

    2025年12月23日
    000
  • 如何设置滚动条只在内容溢出时显示_html滚动条按需显示控制方法

    使用 overflow: auto 可实现内容溢出时才显示滚动条,提升界面整洁度;通过设置容器 overflow 为 auto,浏览器会自动判断是否显示滚动条,内容未溢出时不显示,溢出时自动出现,适用于垂直或水平滚动场景。 当页面内容超出容器高度时才显示滚动条,这种按需显示的滚动条能提升界面整洁度。…

    2025年12月23日
    000
  • html在线布局技巧有哪些 html在线页面结构的优化方法

    合理使用语义化标签如、、等替代div,控制嵌套层级在3-4层内,利用Flex或Grid布局实现结构扁平化,提升可读性与性能;将CSS置于中,JS脚本放底部或使用defer/async,关键CSS内联以优化加载顺序;通过模块化设计拆分公共区域,采用BEM命名规范类名,结合模板引擎或组件化框架增强复用性…

    2025年12月23日
    000
  • html代码转换网站_html代码转换网页版平台

    html代码转换网页版平台是https://www.toptal.com/developers/html-minifier,支持HTML压缩格式化、反向解压及与CSS、JavaScript同步处理;操作便捷,界面简洁,实时预览且数据本地处理保障隐私;适用于前端优化、教学示例、团队协作和快速测试场景。…

    2025年12月23日
    000
  • Linux Conky监控本地服务器HTML+CSS加载时间

    使用curl脚本测量本地服务器HTML/CSS加载时间,并通过Conky周期性显示。1. 编写bash脚本调用curl获取time_total等指标;2. 在~/.conkyrc中用${execi 10 ~/scripts/load_time.sh}每10秒执行;3. 可分离监控HTML与CSS文件…

    2025年12月23日
    000
  • WSL2里写HTML+CSS,Windows秒变Linux开发机!

    使用WSL2可在Windows中高效进行Linux环境下的HTML与CSS开发。首先启用WSL2并安装Ubuntu 22.04,确保运行版本为2;接着安装Visual Studio Code及Remote – WSL插件,将项目存于Linux文件系统以实现编辑同步;通过Python内置服…

    2025年12月23日
    000
  • Windows用Anki制作HTML5标签记忆卡片背诵

    答案:通过Anki的HTML编辑功能创建“HTML5标签记忆”牌组,利用字段区分标签名与示例代码,使用pre和code标签增强可读性,并在CSS中设置颜色样式以提升记忆效果,最后可通过CSV批量导入带HTML格式的数据完成高效录入。 如果您希望通过Anki在Windows系统上创建HTML5标签的记…

    2025年12月23日
    000
  • 如何通过云编辑器处理HTML与CSS联动的详细步骤

    在云编辑器中创建HTML结构并正确引入CSS文件;2. 编写与HTML元素匹配的CSS选择器;3. 利用实时预览检查效果,确保路径、拼写和语法无误;4. 通过开发者工具调试样式应用问题。只要步骤清晰,路径正确,选择器匹配,即可实现HTML与CSS联动。 在云编辑器中实现HTML与CSS的联动,核心在…

    2025年12月23日
    000
  • Windowsengine Windows11记事本如何启用HTML语法着色插件?

    使用第三方编辑器如VS Code或Notepad++可实现HTML语法高亮,Notepad++通过“语言”菜单选择HTML模式,VS Code可通过安装扩展增强着色功能。 如果您尝试在Windows 11的记事本中编辑HTML文件,但发现没有语法高亮功能,这可能是因为系统自带的记事本不支持插件或语法…

    2025年12月23日
    000
  • Linux SELinux阻止HTML服务器启动怎么临时关闭?

    1、通过setenforce 0可临时将SELinux设为宽容模式,允许HTML服务器启动;2、修改GRUB引导参数添加selinux=0可绕过SELinux初始化;3、编辑/etc/selinux/config文件并设SELINUX=permissive可使下次启动生效。 如果您尝试在Linux系…

    2025年12月23日
    000
  • 从IE11迁移至Edge:调用.NET程序集的现代策略

    本文旨在指导开发者如何将原先在ie11中通过“标签直接调用.net程序集的功能,迁移至microsoft edge等现代浏览器。由于安全和技术架构的演进,edge不再支持此类直接调用。文章将详细介绍两种主要的替代方案:利用blazor将c#代码运行于webassembly环境,以及通过clicko…

    2025年12月23日
    000
  • JavaScript条件逻辑优化:解决多重if语句冲突与提升代码效率

    本文旨在解决JavaScript中多重`if`语句可能导致的逻辑冲突和输出覆盖问题。通过分析常见错误模式,我们将探讨两种核心解决方案:使用函数提前`return`来中断后续执行,以及采用`if/else if/else`结构来确保条件互斥。文章还将提供代码示例和性能优化建议,帮助开发者编写更健壮、高…

    好文分享 2025年12月23日
    000
  • 怎么集成HTML在线富文本编辑_HTML在线富文本编辑器集成与功能配置

    选择合适富文本编辑器并正确引入配置,如TinyMCE通过CDN引入并初始化,设置中文、图片上传、工具栏等功能,再获取内容提交,即可完成集成。 集成HTML在线富文本编辑器并不复杂,关键是选型合适、引入正确、配置到位。主流的编辑器如TinyMCE、CKEditor、Quill、wangEditor等都…

    2025年12月23日
    000
  • html转excel工具_html转excel网页版转换器

    答案:html转excel工具可在Convertio官网使用。该平台支持在线将HTML表格转换为Excel,无需安装软件,提供批量上传、保留格式、智能识别等功能,适用于多场景数据整理,操作简单且保障隐私安全。 html转excel工具_html转excel网页版转换器在哪里?这是不少网友都关注的,接…

    2025年12月23日
    000
  • 如何使用Komodo Edit处理HTML多文件项目的解决办法

    通过合理使用文件浏览器、快速打开和全局搜索功能,Komodo Edit 能高效处理 HTML 多文件项目:1. 添加项目文件夹到侧边栏实现文件集中管理;2. 使用 Ctrl+O 快速模糊搜索并打开文件;3. 用 Ctrl+Shift+F 在指定范围内跨文件查找替换文本;4. 每次启动后重新加载项目文…

    2025年12月23日
    000
  • Linux grep秒杀项目里700个无用CSS类!

    首先通过grep提取CSS类生成列表,再扫描模板文件收集使用类,利用comm找出未引用类,结合sed安全删除,并封装为可复用脚本实现自动化清理。 如果您在项目中发现大量无用的CSS类影响代码整洁和性能,可以通过Linux命令快速定位并清理这些冗余样式。grep命令结合其他文本处理工具能高效扫描源码与…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信