MT_RAND()對(duì)於加密目的而言並不安全,因?yàn)樗褂玫氖钱a(chǎn)生可預(yù)測(cè)輸出的Mersenne Twister算法,可能是種子不佳,並且不是為安全設(shè)計(jì)而設(shè)計(jì)的。 2。對(duì)於安全的隨機(jī)數(shù)生成,請(qǐng)使用Random_int(),因?yàn)樗菑牟僮飨到y(tǒng)的密碼安全的pseudorandom數(shù)字生成器(CSPRNG)中汲取的,並且對(duì)預(yù)測(cè)和計(jì)時(shí)攻擊具有抵抗力。 3。避免常見(jiàn)錯(cuò)誤,例如假設(shè)所有隨機(jī)函數(shù)都是等效的,random_int()中的不當(dāng)範(fàn)圍,或組合安全和不安全的函數(shù),例如Random_int()和MT_RAND()(破壞安全性)。 4。對(duì)於早於7.0的PHP版本,請(qǐng)通過(guò)Composer安裝Paragonie/Random_compat庫(kù)以允許使用Random_int()和Random_bytes()。 5。 MT_RAND()僅對(duì)於非安全性敏感的任務(wù),例如調(diào)整測(cè)驗(yàn)問(wèn)題,生成UI ID或不可預(yù)測(cè)性並不重要的遊戲機(jī)制。 6。在處理身份驗(yàn)證令牌,會(huì)話鍵,密碼重置或任何面向用戶的秘密時(shí),請(qǐng)始終使用諸如Random_int()的密碼安全功能,以確??煽康陌踩?。
多年來(lái),PHP中的隨機(jī)數(shù)已經(jīng)顯著發(fā)展,尤其是在安全方面。如果您仍在使用mt_rand()
進(jìn)行敏感操作,例如生成令牌,密碼或會(huì)話密鑰,那麼該升級(jí)了。這是為什麼以及如何從mt_rand()
轉(zhuǎn)移到random_int()
以獲取密碼安全的數(shù)字生成。

為什麼mt_rand()
不安全
mt_rand()
使用Mersenne Twister算法,這非常適合模擬,遊戲或洗牌數(shù)據(jù),但對(duì)於密碼學(xué)來(lái)說(shuō)卻不安全。
- 可預(yù)測(cè)的輸出:給定足夠的輸出,攻擊者可以反向工程內(nèi)部狀態(tài)並預(yù)測(cè)未來(lái)的值。
- 默認(rèn)情況下未正確播種:尤其是在較舊的PHP版本中,播種可能很弱或基於諸如時(shí)間戳等可預(yù)測(cè)值。
- 不是為安全設(shè)計(jì)而設(shè)計(jì)的:這是用於性能的偽隨機(jī)數(shù)生成器(PRNG),而不是不可預(yù)測(cè)性。
示例:如果您使用
mt_rand(1, 1000000)
生成密碼重置令牌,則攻擊者可能會(huì)隨著時(shí)間的推移而爆炸或預(yù)測(cè)可能的值。![]()
使用random_int()
進(jìn)行關(guān)鍵安全代碼
PHP 7引入了random_int()
,這是random
擴(kuò)展的一部分(內(nèi)置為PHP 7.0),該擴(kuò)展名生成了密碼固定的隨機(jī)整數(shù)。
$ SECURERANDOMNUMBER = RONARAM_INT(1,1000000);
此功能:

- 從OS級(jí)別的CSPRNG中汲取隨機(jī)性(例如Linux上的
/dev/urandom
或Windows上的CryptGenRandom
)。 - 抵抗預(yù)測(cè)和計(jì)時(shí)攻擊。
- 只有當(dāng)系統(tǒng)的熵池是空的(在現(xiàn)代系統(tǒng)上非常罕見(jiàn))時(shí),才能阻止。
?當(dāng)需要不可預(yù)測(cè)的數(shù)字時(shí),請(qǐng)使用
random_int()
:
- CSRF令牌
- 密碼重置鍵
- 會(huì)話標(biāo)識(shí)符(儘管PHP內(nèi)部處理此操作)
- 任何面向用戶的秘密
常見(jiàn)的錯(cuò)誤和陷阱
即使使用random_int()
,開(kāi)發(fā)人員也可以滑倒:
假設(shè)所有隨機(jī)函數(shù)都是相等的
不要屬於用mt_rand()
rand()
並將其稱為“固定”的陷阱。只有random_int()
,random_bytes()
或諸如paragonie/random_compat
之類的庫(kù)是安全的。範(fàn)圍處理不當(dāng)
random_int($min, $max)
必須具有有效的界限。避免使用負(fù)範(fàn)圍或$min > $max
。試圖“改善”隨機(jī)性
不要做這樣的事情://?不這樣做 $ num = Random_int(1,100) * mt_rand(1,10);
混合安全和不安全的來(lái)源會(huì)削弱結(jié)果。
向後兼容性:PHP <7.0
如果您卡在PHP 5.X上,請(qǐng)使用paragonie/random_compat
庫(kù):
作曲家需要Paragonie/Random_compat
現(xiàn)在您可以安全地使用:
$ SecureNumber = Random_int(1,100); $ bytes = Random_bytes(16);
它使用安全源,即使在較舊的PHP版本上,它都可以使用random_int()
和random_bytes()
。
mt_rand()
什麼時(shí)候還可以?
mt_rand()
仍然有有效的用途 - 只是安全性的地方並不重要:
- 改組一個(gè)測(cè)驗(yàn)問(wèn)題清單
- 為UI元素生成非敏感ID
- 公平性≠安全性的遊戲機(jī)制
但是如有疑問(wèn),請(qǐng)使用random_int()
。
基本上,如果它觸及用戶身份驗(yàn)證,訪問(wèn)控製或秘密,則可以在密碼上安全。從mt_rand()
到random_int()
的切換是簡(jiǎn)單,安全且適合未來(lái)的。
以上是從`mt_rand`到`random_int`:生成密碼固定的數(shù)字的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

UseIntl.NumberFormatwithuser-specificlocalesforcorrectdigitgroupinganddecimalseparators.2.Formatcurrencyusingstyle:'currency'withISO4217codesandlocale-specificsymbolplacement.3.ApplycompactnotationforlargenumberstoenhancereadabilitywithunitslikeMor??

使用BCMath擴(kuò)展是解決PHP金融計(jì)算精度問(wèn)題的關(guān)鍵,因?yàn)樗ㄟ^(guò)字符串進(jìn)行任意精度的十進(jìn)制運(yùn)算,避免了浮點(diǎn)數(shù)的捨入誤差;2.必須始終以字符串形式傳入數(shù)值並設(shè)置scale參數(shù)(如bcadd('0.1','0.2',2)),以確保結(jié)果精確到所需的小數(shù)位;3.避免將浮點(diǎn)數(shù)直接傳給BCMath函數(shù),因其在傳參前已丟失精度;4.可通過(guò)bcscale(2)設(shè)置全局小數(shù)位數(shù),確保財(cái)務(wù)計(jì)算統(tǒng)一保留兩位小數(shù);5.BCMath默認(rèn)截?cái)喽撬膾挝迦?,需自行?shí)現(xiàn)四捨五入邏輯(如通過(guò)bcround函數(shù));6.輸入值需驗(yàn)

mt_rand()isNotsecureCryptographicposePoseSitusEsthemerSennetWisterAlgorithm,whtroducesProdiCesProdiCtableOutput,Maybepoorlyseeded,andisnotdesignedforsecurity.2.2.forsecurererandomnumnumnumnumnumnumnumnumnumnumnumnumnumnumbergeneration,UsserandSty,inserandsyterstranseftsfors

當(dāng)需要處理超過(guò)PHP_INT_MAX(如9223372036854775807)的整數(shù)時(shí),1.應(yīng)使用GMP擴(kuò)展或brick/math等任意精度數(shù)學(xué)庫(kù);2.GMP基於C庫(kù),性能高但需服務(wù)器支持;3.brick/math為純PHP實(shí)現(xiàn),便於移植但速度較慢;4.初始化大數(shù)時(shí)必須用字符串防止精度丟失;5.所有操作應(yīng)避免浮點(diǎn)數(shù)參與以確保精度。最終選擇取決於環(huán)境控製程度、性能需求與代碼風(fēng)格偏好,但都需以字符串方式安全初始化大整數(shù)。

is_numeric()checksifavaluecanbeinterpretedasanumber,acceptingformatslikehex,scientificnotation,andwhitespace,butonlyreturnsabooleanwithouttypecasting.2.filter_var()withFILTER_VALIDATE_INTorFILTER_VALIDATE_FLOATvalidatesandsanitizesbyreturningtheactua

PHP的鬆散類型系統(tǒng)在數(shù)字類型轉(zhuǎn)換中既強(qiáng)大又危險(xiǎn)。 1.使用鬆散比較(==)時(shí),PHP會(huì)將非數(shù)字字符串轉(zhuǎn)為0,導(dǎo)致'hello'==0為true,可能引發(fā)安全漏洞,應(yīng)始終在需要時(shí)使用嚴(yán)格比較(===)。 2.算術(shù)運(yùn)算中,PHP會(huì)靜默轉(zhuǎn)換字符串,如'10apples'變?yōu)?0,而'apples10'變?yōu)?,可能導(dǎo)致計(jì)算錯(cuò)誤,應(yīng)使用is_numeric()或filter_var()驗(yàn)證輸入。 3.數(shù)組鍵中,數(shù)字字符串如'123'會(huì)被轉(zhuǎn)為整數(shù),導(dǎo)致'007'變?yōu)?,丟失格式,可通過(guò)添加前綴避免。 4.函數(shù)參數(shù)

浮點(diǎn)數(shù)不準(zhǔn)確的問(wèn)題在PHP中常見(jiàn),尤其是在金融計(jì)算或精確比較時(shí),根本原因是十進(jìn)制小數(shù)無(wú)法在二進(jìn)制浮點(diǎn)表示法(IEEE754標(biāo)準(zhǔn))中精確存儲(chǔ),導(dǎo)致如0.1 0.2≠0.3的結(jié)果;1.進(jìn)行浮點(diǎn)數(shù)相等比較時(shí)應(yīng)使用容差值(epsilon)而非直接用==;2.金融計(jì)算應(yīng)避免使用浮點(diǎn)數(shù),改用整數(shù)(如以分為單位)或BCMath擴(kuò)展;3.BCMath通過(guò)字符串進(jìn)行任意精度計(jì)算,適用於高精度場(chǎng)景,但性能較低;4.應(yīng)注意PHP的類型轉(zhuǎn)換可能將字符串或整數(shù)隱式轉(zhuǎn)為浮點(diǎn)數(shù)引入誤差;總之,浮點(diǎn)數(shù)不精確是通用計(jì)算問(wèn)題,但在

intdiv()performstrueintegerdivisionandissaferforwholenumbers,whilecasting(int)afterdivisionrisksfloating-pointprecisionerrors.2.Bothtruncatetowardzero,butcastingcanyieldincorrectresultswithnegativeorimprecisevaluesduetofloatrepresentationissues.3.int
