搜尋
首頁後端開發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與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)持續優化性能和推廣最佳實踐。

您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

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尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用