前几天我和一位朋友闲聊,他是一家成功初创公司的技术主管,当我们观看女子水球奥运会决赛时,我们开始谈论我在野外发现的 PHP 失败问题?。他是一名技术主管,而我是一名中期开发人员,我本以为他已经在日常工作中解决了这个失败问题,但是……听起来令人惊讶,但他没有。
我所说的“失败”,你可能已经猜到了,无非就是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
如果您想知道黑客如何篡改我们的数据,我有两个答案给您:
继续。
这里我展示了一个可能会让您震惊的 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我的个人博客空间中找到更多关于我的信息。
如果您喜欢我的写作风格和内容,请毫不犹豫地点击关注按钮,神奇的事情就会发生! ??
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3