」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > PHP 安全編碼:不要讓程式碼鬆動

PHP 安全編碼:不要讓程式碼鬆動

發佈於2024-08-20
瀏覽:703

前几天我和一位朋友闲聊,他是一家成功初创公司的技术主管,当我们观看女子水球奥运会决赛时,我们开始谈论我在野外发现的 PHP 失败问题?。他是一名技术主管,而我是一名中期开发人员,我本以为他已经在日常工作中解决了这个失败问题,但是……听起来令人惊讶,但他没有。
我所说的“失败”,你可能已经猜到了,无非就是PHP的松散比较。现在,公平地说,我不会真正称其为失败,而是一个功能,但它的使用可能非常危险,从这个意义上说,它是一个失败!让我们的书呆子上吧!

PHP Secure Coding: Don

目录

  • PHP 松散比较
  • 脆弱场景
    • 不安全的登录系统
    • 不安全的授权与扭曲
  • 减轻松散比较错误
  • 结论
  • 秀恩爱@Sudorealm

PHP 松散比较

PHP 中的松散比较是指使用 == 运算符比较两个值,它不会检查所比较变量的数据类型。 PHP 在比较之前会尝试将值转换为通用类型。

if ('string' == true){
 echo 'Weedle I choose you';
}
else{
 echo 'Charizard I choose you';
}

不管你信不信,我们即将派出一只 3 级的独角兽在这里战斗,而我们的喷火龙仍未使用。 为什么? 那么,在上面的示例中,PHP 将字符串 'string' 转换为 true,然后再与 true 进行比较,从而得到 true 比较?。这种行为虽然有时有用,但如果没有正确理解和控制,可能会很危险。

查看 PHP 文档中的松散比较表以获取更多信息

一开始可能看起来没那么严重,但相信我,以训练有素的开发人员的眼光来看,这种突然出现的技巧可能会让他们浑身不寒而栗,并让他们陷入生产代码重构热潮。

脆弱场景

在本文的这一部分中,我将尝试给出一些代码块,当在野外发现这些代码块时,它们可以为您带来丰厚的错误赏金奖励,而且如果您发现任何与您的代码库远程相似的内容......更改它?

不安全的登录系统

在下面的代码片段中,您可以看到一个非常基本的登录系统逻辑。

$username = $_POST['username'];
$password = $_POST['password'];

if ($username == 'admin' && $password == '12345') {
    // Grant access
}

假设一个狡猾的黑客篡改了发送的数据并使它们: $_POST['username'] = true 和 $_POST['password'] = true 这将导致:

$username = $_POST['username'];
$password = $_POST['password'];

if (true == 'admin' && true == '12345') {
    // Grant access
}

# Now that hacker has been granted access to our App... Good for him, not for us

如果您想知道黑客如何篡改我们的数据,我有两个答案给您:

  1. 使用curl 自定义请求。
  2. 打嗝套件

继续。

不安全的授权与扭曲

这里我展示了一个可能会让您震惊的 PHP 问题。

$user_role = $_POST['user_role']; // Example: 'admin', 'editor', 'viewer'

// Authorization check using a switch statement
switch ($user_role) {
    case 'crazyDifficultAdminRoleNooneWouldEverGuess':
        // Admin privileges
        echo "Access granted: Super Admin level";
        break;

    case 'editor':
        // Editor privileges
        echo "Access granted: Editor level";
        break;

    case 'viewer':
        // Viewer privileges
        echo "Access granted: Viewer level";
        break;

    default:
        // No access
        echo "Access denied: Invalid role";
        break;
}

此代码已经容易受到数据篡改,因为黑客可以猜测角色并更改其角色以访问不同级别的授权。
不过,我们可能会感到有点安全,因为他们永远无法猜出我们的超级管理员角色名称。

但是如果他们根本不需要猜测怎么办?☠️

你知道Switch Case 使用松散比较吗? 哈!你现在可能会感到震惊!
这意味着如果黑客添加 $_POST['user_role'] = true 那么他们将访问 switch 语句中的第一个案例,无论值是什么。这不是心底的痛吗?阅读文档。

缓解松散比较错误

减少松散比较错误对于确保 PHP 应用程序的安全性和可靠性至关重要。在 PHP 8.0 版本中,严格比较 === 和匹配表达式的使用在此过程中起着至关重要的作用。与松散的比较运算符 == 不同,严格的比较可以确保变量的值和类型都得到检查,而松散的比较运算符 == 可能会因 PHP 的类型杂乱而导致意外且潜在危险的结果。这消除了诸如意外类型强制之类的漏洞,这些漏洞可能被用来绕过安全检查。

这里是使用匹配表达式解决不安全授权错误的解决方案:

$user_role = $_POST['role'];

$response = match ($user_role) {
    'crazyDifficultAdminRoleNooneWouldEverGuess' => "Access granted: Super Admin level",
    'editor' => "Access granted: Editor level",
    'viewer' => "Access granted: Viewer level",
    default => "Access denied: Invalid role",
};

echo $response; # This outputs: 'Access denied: Invalid role' when role is set to true

结论

您知道 PHP 中松散比较和类型杂耍的危险吗?如果你没有,现在你可以了。让这篇简单的文章提醒您始终阅读文档并对编程时使用的所有内容有一个扎实的理解。当你努力成为所做的事情中的佼佼者时,好奇心是关键!

通过遵守 === 的严格规则和匹配的精确度,您可以严格控制您的 PHP 代码,确保其行为完全符合您的预期。请记住,现在稍微严格一点可以让您以后避免很多麻烦。让这成为一个有趣的推动力,无论您处于编码之旅的哪个阶段,总是有新的东西需要学习。所以,请睁大眼睛,保持好奇心,不要让那些松散的比较漏网! ?

关于我

您可以在sudorealm.com我的个人博客空间中找到更多关于我的信息。

如果您喜欢我的写作风格和内容,请毫不犹豫地点击关注按钮,神奇的事情就会发生! ??

版本聲明 本文轉載於:https://dev.to/athanstan/php-secure-coding-dont-let-the-code-get-loose-26ja?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Next.js - 概述
    Next.js - 概述
    本文作為初學者友好的指南和使用 Next.js 的步驟。 Next.js 是一個用於建立 Web 應用程式的靈活框架。相反,它是一個建立在 Node.js 之上的 React 框架。 設定您的 Next.js 專案 要啟動新的 Next.js 項目,您需要在電腦上安裝 Node.js。 安裝 ...
    程式設計 發佈於2024-11-02
  • 如何在程式碼中使用 Unsplash 圖片
    如何在程式碼中使用 Unsplash 圖片
    身為從事新 SaaS 專案的開發人員,我需要直接透過 URL 連結一些 Unsplash 圖片。 最初,我看到一篇推薦使用 https://source.unsplash.com/ API 的文章(連結)。但是,此方法不再有效,僅從 URL 欄位複製連結並不能提供嵌入所需的直接圖像 URL。 h...
    程式設計 發佈於2024-11-02
  • 如何合併關聯數組、處理缺失鍵、填滿預設值?
    如何合併關聯數組、處理缺失鍵、填滿預設值?
    合併多個關聯數組並添加具有預設值的缺失列將關聯數組與不同的鍵集組合起來創建統一的數組可能具有挑戰性。這個問題探索了一種實現此目的的方法,所需的輸出是一個數組,其中鍵被合併,缺失的列用預設值填充。 為了實現這一點,建議結合使用 array_merge 函數精心設計的鍵數組:$keys = array(...
    程式設計 發佈於2024-11-02
  • 透過 testcontainers-go 和 docker-compose 來利用您的測試套件
    透過 testcontainers-go 和 docker-compose 來利用您的測試套件
    Welcome back, folks! Today, we will cover the end-to-end tests in an intriguing blog post. If you've never written these kinds of tests or if you stri...
    程式設計 發佈於2024-11-02
  • 以下是一些適合您文章的基於問題的標題:

**直接簡潔:**

* **如何在Windows控制台中正確顯示UTF-8字元? ** **
* **為什麼傳統方法無法顯示
    以下是一些適合您文章的基於問題的標題: **直接簡潔:** * **如何在Windows控制台中正確顯示UTF-8字元? ** ** * **為什麼傳統方法無法顯示
    在Windows 控制台中正確顯示UTF-8 字元使用傳統方法在Windows 控制台中顯示UTF-8 字元的許多嘗試均失敗正確渲染擴充字元。 失敗嘗試:一個使用 MultiByteToWideChar() 和 wprintf() 的常見方法被證明是無效的,只留下 ASCII 字元可見。此外,使用 ...
    程式設計 發佈於2024-11-02
  • ReactJS 的模擬介紹
    ReactJS 的模擬介紹
    ReactJS 19:重要部份 並發模式增強: ReactJS 19 中最大的改進是並發模式,它不僅在應用程式自身更新時保持UI 平滑和響應靈敏,而且還確保了無縫界面,尤其是在復雜的過渡(例如動畫)時。 改進的伺服器元件: 在 Python 的引領下,ReactJ...
    程式設計 發佈於2024-11-02
  • 首屆DEV網頁遊戲挑戰賽評審
    首屆DEV網頁遊戲挑戰賽評審
    我被要求對DEV團隊9月份組織的第一屆網頁遊戲挑戰賽提交的參賽作品進行評判,結果在10月初發布。 我們幾個月來一直在 DEV 上組織挑戰(迷你黑客馬拉松),併計劃宣布我們的第一個網頁遊戲挑戰。鑑於您在遊戲社群 和 dev.to 的專業知識和參與度,我們想知道您是否有興趣成為客座評審。 誰能對此說...
    程式設計 發佈於2024-11-02
  • 購買經過驗證的現金應用程式帳戶:安全可靠的交易
    購買經過驗證的現金應用程式帳戶:安全可靠的交易
    Buying verified Cash App accounts is not recommended. It can lead to security risks and potential account bans. If you want to more information just k...
    程式設計 發佈於2024-11-02
  • 為什麼 `std::function` 缺乏相等比較?
    為什麼 `std::function` 缺乏相等比較?
    揭開std::function 的等式可比性之謎難題:為什麼是std::&&]難題:為什麼是std:: function,現代C 程式碼庫的一個組成部分,不具備相等比較功能?這個問題從一開始就困擾著程式設計師,導致管理可呼叫物件集合的混亂和困難。 早期的歧義:在C 語言的早期草案中11 標準中,op...
    程式設計 發佈於2024-11-02
  • JavaScript 類型檢查 |程式設計教學
    JavaScript 類型檢查 |程式設計教學
    介紹 本文涵蓋以下技術技能: 在本實驗中,我們將探索一個 JavaScript 函數,該函數檢查提供的值是否屬於指定類型。我們將使用 is() 函數,它利用建構子屬性和 Array.prototype.includes() 方法來確定值是否屬於指定類型。本實驗將幫助您更了解 Jav...
    程式設計 發佈於2024-11-02
  • 使用 Streamlit 將機器學習模型部署為 Web 應用程式
    使用 Streamlit 將機器學習模型部署為 Web 應用程式
    介绍 机器学习模型本质上是一组用于进行预测或查找数据模式的规则或机制。简单地说(不用担心过于简单化),在 Excel 中使用最小二乘法计算的趋势线也是一个模型。然而,实际应用中使用的模型并不那么简单——它们通常涉及更复杂的方程和算法,而不仅仅是简单的方程。 在这篇文章中,我将首先构...
    程式設計 發佈於2024-11-02
  • ## utf8_unicode_ci 與 utf8_bin:哪一種 MySQL 排序規則最適合德國網站?
    ## utf8_unicode_ci 與 utf8_bin:哪一種 MySQL 排序規則最適合德國網站?
    為德語選擇最佳MySQL 排序規則為德語選擇最佳MySQL 排序規則在設計為德語受眾量身定制的網站時,支持像ä、 ü 和ß。當涉及特定於語言的要求時,排序規則的選擇起著重要作用。 字元集和排序規則對於字元處理,UTF-8 仍然是首選選項,提供廣泛的字元支援。至於排序規則,則需要考慮德語特定字元。 排...
    程式設計 發佈於2024-11-02
  • 異常處理基礎知識
    異常處理基礎知識
    Java中的例外處理由五個關鍵字管理:try、catch、 throw、throws和finally。 這些關鍵字構成了一個相互關聯的子系統。 要監視的指令位於 try 區塊內。 如果try區塊中發生異常,則會拋出異常。 程式碼可以使用catch捕獲並處理異常。 系統異常由Java執行時...
    程式設計 發佈於2024-11-02
  • 好的第一期:做出您的第一個開源貢獻
    好的第一期:做出您的第一個開源貢獻
    嘿,未來的開源貢獻者! ? 一開始為開源做出貢獻可能會令人生畏,尤其是當專案有數千行程式碼並且對問題進行深入討論時。但這就是為什麼好的首要問題存在。它們就像是一個友好的邀請,讓你嘗試並熟悉操作,而不會迷失在雜草中。將它們視為幫助您開始騎乘的輔助輪。 無論如何,什麼是好的第一期? ...
    程式設計 發佈於2024-11-02
  • 目錄:Django 基礎知識
    目錄:Django 基礎知識
    點此收聽我的直播 目錄:Django 基礎 Django簡介 Django框架概述 安裝Python 設定虛擬環境 安裝 Django 創建您的第一個 Django 專案 Django 專案架構 瞭解 Django 的專案佈局 管理 Django 設定 配置資料庫設定 urls.py、views....
    程式設計 發佈於2024-11-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3