搜索
首页后端开发php教程理解PHP及其安全问题的入门知识_PHP

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

Jun 01, 2016 pm 12:25 PM
aphp入门安全理解用户知识设置问题


  有时候,您的业务可能涉及到 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
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
超越炒作:评估当今PHP的角色超越炒作:评估当今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

PHP中的弱参考是什么?什么时候有用?PHP中的弱参考是什么?什么时候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

解释PHP中的__ Invoke Magic方法。解释PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

解释PHP 8.1中的纤维以进行并发。解释PHP 8.1中的纤维以进行并发。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区:资源,支持和发展PHP社区:资源,支持和发展Apr 12, 2025 am 12:04 AM

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP与Python:了解差异PHP与Python:了解差异Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

php:死亡还是简单地适应?php:死亡还是简单地适应?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来:改编和创新PHP的未来:改编和创新Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能