0

0

理解PHP及其安全问题的入门知识

php中文网

php中文网

发布时间:2016-06-21 09:06:11

|

1027人浏览过

|

来源于php中文网

原创

安全|问题


  有时候,您的业务可能涉及到 php 应用程序的安全性。当您遇到审计任务时,您知道如何执行查找吗?本系列将带您进入 php,并帮您在一定程序上了解它,让您在进行安全审计时知道查找什么。第 1 部分向您介绍 register_globals 设置。
  
  入门知识
  
  我在此假定您对 php 的语法有一个大致的了解,至少能够编写“hello world”之类的程序。如果您不具备基础知识,则请首先学习 php 手册和某些基本的 php 教程(参阅 参考资料)。很多出版商都有关于 php 的好书。建议初学者一开始先看看入门书籍或食谱形式的书籍。
  
  在生产环境的准确副本上执行审计。您不需要复制硬件,但是需要确保软件版本尽量和实际的完全一样。php 配置必须精确匹配,这一点在 php.ini 文件中、在 .htaccess 文件的 apache 指令中或在 httpd.conf 中已经指定。您需要准备一个单独的环境,因为您将显示和记录可能包含敏感的密码及其他信息的错误。此外,您将尝试中断站点的安全性,这一点是您在活动应用程序中极力避免的。
  
  第一步是将 php 的 error_reporting 设置更改为 e_all。设置更改后,每当使用未初始化的变量、进行错误的文件访问及发生其他(大多数)无害错误时,php 都会报告一条警告消息,但也存在这是一个潜在攻击矢量的可能性。这些错误一般情况下只是表明编程草率,所以如果这是您的代码,您把它们清除掉即可。
  
  该设置如下所示:
  
  error_reporting = e_all
  
  如果您不知道 php.ini 文件在哪里,则可以通过创建包含以下文本的 .php 脚本来查找:
  
    
  phpinfo();
  
  输出的上面部分有一行列出了 php 查找 php.ini 的位置:
  
  
图 1. php 查找 php.ini 的位置

  
[[The No.1 Picture.]]

  值可能会有些变化,但 /usr/local/lib/php.ini 是大多数 UNIX? 系统上的公共位置,C:\php\php.ini 或 C:\WINDOWS\php.ini 是大多数 Microsoft? Windows? 系统上的公共位置。如果该文件不存在,则创建一个并在文件中键入上面的 error_reporting 行即可。修改 php.ini 文件后,需要重启 Web 服务器,PHP 才能启用新设置。
  
  如果您以前没有创建 phpinfo() 页面,则可以现在创建。第二个主要部分的标签是“配置”,它包含许多关于如何设置 PHP 的有用信息。该部分包括三列:设置名称、本地值 和 xmaster 值。主值是通过 php.ini 指令为您机器上的所有 PHP 脚本全局设置的值。本地值是对当前脚本生效的值。对它有影响的有:.htaccess 设置、httpd.conf 的 部分中的设置和 PHP 脚本中的 ini_set 调用。在运行时,只有某些设置是可更改的。请参阅 参考资料中的 PHP 手册以获取详细信息。
  
  还需要自定义的另外两种设置是 display_errors 和 log_errors。您至少需要启用这两种设置中的一种,或者两种都启用。log_errors 通知 PHP 将注意、警告或错误记录在文件中,display_errors 将这些被记录下来的注意、警告和错误显示在屏幕上。它们不互相排斥。至少启用它们中的一个,可以有效地发现可能导致安全漏洞的编程错误。
  
  应该查找哪些种类的安全问题?
  
  值得庆幸的是,导致安全漏洞的很多编程错误在 PHP 中不可能存在。堆栈和缓冲溢出是 C 和 C++ 环境中两个常见的问题。因为 PHP 可以为您管理记忆,所以 PHP 代码不会导致堆栈和缓冲溢出。
  
  然而,PHP 本身也是使用 C 语言编写的,有时记忆问题深至 PHP 的核面。因此,您需要时时关注安全公报和更新。PHP 在其 Web 站点(参见 参考资料)公布新 PHP 版本并说明是否包含安全修补程序。
  
  PHP 应用程序中的大多数问题与使用用户提供的数据有关,在使用它和对它执行操作前未曾预先验证和消毒。您可能听说过称为 cross-site scripting (XSS) 的漏洞。XSS 通过提供程序不期望的输入,然后利用程序对无赖输入的处理方式发动进攻。编写良好的程序可以避免这些假定。在机场安全方面,PHP 程序用于检查旅客的行李。
  
  其他问题是一些细微的逻辑错误。例如,检查一系列参数,看看是否批准某个用户访问某种资源、是否把括弧放错位置以至于某些用户进入了他们原本不该到的地方。我们希望您的应用程序组织良好并具有这种集中式逻辑。
  
  识别用户输入
  
  最棘手的一件事情是如何从外部源(如某个用户、别的 Web 站点或某些其他资源)和已经验证的数据中区分出不受信任的输入。有人提出了“不相信一切”的观点,即不管来自何处,对于所有函数都要验证其数据。这一做法会牵涉到以下几件事情:第一,验证在不同的上下文中意味着不同的事情;第二,在应用程序的所有级别上快速执行验证是一件枯燥乏味和易于出错的事情;第三,您是在审计应用程序而不是在从头重新编写它。您需要通过现有代码来跟踪用户输入,而不能用验证函数包装您看到的每个变量。
  
  不期望的用户输入
  
  用户输入从何而来?第一个源是 GET、POST 和 COOKIE 数据。一般称为 GPC 数据。此数据的可识别程序依赖于一个有争议的 php.ini 设置:register_globals。在 PHP V4.3.0 以后,register_globals 默认情况下被设置为 Off。但是几年前,在 PHP 中,register_globals 的默认值是打开的,所以存在很多需要它的代码。
  
  register_globals 本身并非安全风险。但是,它为跟踪用户输入和确保应用程序安全增加了难度。为什么会这样?因为如果打开 register_globals,在全局名称空间和 $_GET、$_POST 或 $_COOKIE 数组中,将创建 GET、POST 和 COOKIE 传递到 PHP 脚本的所有变量。
  
  下面是工作方式及其重要性的示例:
  
  清单 1. COOKIE 的安全性
  
  1   2
  3 // See if the user has the secret cookie.
  4 if (!empty($_COOKIE['secret'])) {
  5  $authorized = true;
  6 }
  7
  8 // Now let's go through a list of press releases and show them.
  9 $releases = get_press_releases();
  10 foreach ($releases as $release) {
  11
  12   // Some releases are restricted. Only show them to people who can
  13   // see secrets.
  14   if ($release['secret']) {
  15     if (!$authorized) {
  16       continue;
  17     }
  18   }
  19
  20   // We must be allowed to see it.
  21   showRelease($release);
  22 }
  
  您应该注意几件事。第一,依靠 cookie 来判断用户是否已通过身份验证不是个好主意 —— 因为人们可以很容易地设置自己的 cookie 值。我们将在另外一篇文章中叙述这一点。无论如何,此脚本的缺点在于,如果打开 register_globals,它就不具备安全性了。
  
  下面介绍名为 press.php 的脚本。一般来说,当用户访问 press 发行版的脚本时,其浏览器将显示 http://www.example.com/company/press.php。
  
  现在注意当用户擅自将其更改为 http://www.example.com/company/press.php?authorized=1 时将发生什么事?
  
  看看前面的代码:仅当用户使用 cookie 时才设置 $authorized。它永远不会被设置为假。后来引入了 register_globals —— 它取代了刚才使用的 $_GET['authorized'],同时在全局范围内还存在一个值为 1 的变量 $authorized。因此,即使用户没有通过 cookie 检查,$authorized 后来在 foreach 循环中引用时,仍然会被验证为真。
  
  修复此缺陷可以使用两种方式。其一,当然是关闭 register_globals。如果关闭它对您的生产站点没有影响,则这是个好主意。您需要测试一下应用程序,确保它没有因此中断运行。
  
  另一种方式有点像“防御性编程”。我们只需要将 cookie 检查更改为以下形式即可:
  
  清单 2. 使用 COOKIE 提高安全性
  
  1   2
  3 // See if the user has the secret cookie.
  4 $authorized = false;
  5 if (!empty($_COOKIE['secret'])) {
  6  $authorized = true;
  7 }
  
  ...
  
  这时,当用户将 ?authorized=1 添加到脚本 URL 时,$authorized 变量仍然被设置为 1 —— 但是它随即会被 $authorized = false 覆盖,只有那些实际具有秘密 cookie 的用户才能看到受限的 press 发行版。他们仍然可以设计自己的 cookie。
  
  审计代码的教训:设法关闭 register_globals。如果不打开 register_globals 应用程序就不能运行,并且您无法修改它,或者在应用程序必须运行的地方您无法控制 PHP 配置,则需要在条件块中查找所有全局变量设置,或者通过某些函数调用进入全局范围。如果 register_globals 为打开状态,则这两种情形都是由用户将变量设置为任意值引起的。
  
  找到这些变量的好办法是将 php.ini 设置 error_reporting 设置为 E_ALL,同时使用 log_errors 或 display_errors,这样,所有 PHP 警告和错误都会被分别记录在文件中或显示在屏幕上。每当使用未初始化的变量(假定具有值)时,您将得到一条 E_NOTICE。这像 C 和 Java? 语言中那样,仍然与让 PHP 要求声明 变量有所不同。结果,当我们的第一个版本的脚本运行时,出现的错误消息是:
  
  Notice: Undefined variable: authorized in C:\var\www\articles\press.php
  on line 15

迅易年度企业管理系统开源完整版
迅易年度企业管理系统开源完整版

系统功能强大、操作便捷并具有高度延续开发的内容与知识管理系统,并可集合系统强大的新闻、产品、下载、人才、留言、搜索引擎优化、等功能模块,为企业部门提供一个简单、易用、开放、可扩展的企业信息门户平台或电子商务运行平台。开发人员为脆弱页面专门设计了防刷新系统,自动阻止恶意访问和攻击;安全检查应用于每一处代码中,每个提交到系统查询语句中的变量都经过过滤,可自动屏蔽恶意攻击代码,从而全面防止SQL注入攻击

下载



PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

286

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

126

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

42

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

19

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

23

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

421

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

51

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号