PHP 中的 和「隱式轉換」

2021-10-24 08:12:07 字數 1102 閱讀 4103

最近,在 hacker news 上有一篇帖子(提到了一種探測**密碼加密方式的方法。

<?php

var_dump(md5('240610708') == md5('qnkcdzo'));

var_dump(sha1('aarozmok') == sha1('aak1stfy'));

var_dump('0x1234ab' == '1193131');

結果都是:

bool(true)

bool(true)

bool(true)

如果在乙個**,使用240610708作為密碼,然後用qnkcdzo登陸,結果可以登入的話,說明密碼是以md5方式儲存的。類似的,如果用aarozmok作為密碼,然後用aak1stfy登陸,結果可以登入的話,說明密碼是以sha1方式儲存的。第三種當然就是明文儲存了。

以第一組數為例:

md5('240610708') 的結果是:0e462097431906509019562988736854

md5('qnkcdzo') 的結果是:0e830400451993494058024219903391

由於 php 是弱型別語言,在使用 == 號時,如果比較乙個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換為數值並且比較按照數值來進行。此規則也適用於 switch 語句。上述例子中的兩個字串恰好以 0e 的科學記數法開頭,字串被隱式轉換為浮點數,實際上也就等效於 0×10^0 ,因此比較起來是相等的。

<?php

var_dump( 0 == "a" );

var_dump( "0" == "a" );

第乙個返回的是true,第二個返回的是false

php中的hash校驗,應該使用「===」,而不應該使用「==」。另外如果生產環境版本足夠高的話(php >= 5.6.0),最好使用hash_equals()函式。

hash_equals()在比較兩個字串,無論它們是否相等,函式的時間消耗是恆定的,可以用來防止時序攻擊。

PHP 中的 和「隱式轉換」

最近,在 hacker news 上有一篇帖子 提到了一種探測 密碼加密方式的方法。var dump md5 240610708 md5 qnkcdzo var dump sha1 aarozmok sha1 aak1stfy var dump 0x1234ab 1193131 結果都是 bool ...

php隱式轉換

php型別隱式轉換 1.其他型別轉換成整數型別 true為1,false為0,null為0,以字母開頭的字串為0,以數字開頭的取到第乙個字母前的數字 2.其他型別轉換成字串型別 true為1,false為0,null為空,3.其他型別轉換成布林型別 除了0,0.0,空字串,null轉換為false,...

Scala中的隱式轉換函式 隱式引數和隱式類

隱式轉換函式 所謂隱式轉換函式指的是implicit關鍵字修飾的且只有乙個引數的函式,其作用是 1.隱式轉換增強現有型別,2.隱式轉換做引數型別轉換 1.例如 inplicit def int2string n int string n.tostring 上案例 我們把fruit物件轉換成了monk...