Php noyob qiymatga ega.

Kontaktlar / Google Play

topshirish

  1. Golovna
  2. Vipadkovi ma'nolari PHPda hamma joyda mavjud.
  3. Barcha ramkalarda, ko'plab kutubxonalarda.
  4. Shubhasiz, siz o'zingiz tokenlar va tuzlarni yaratish uchun quyidagi qiymatlarni, shuningdek funktsiyalar uchun kirish ma'lumotlarini o'z ichiga olgan bir qator kodlarni yozgansiz.

Shuningdek, tasodifiy qiymatlar turli vazifalarda muhim rol o'ynaydi:


Hovuz yoki mavjud variantlar qatoridan variantlarni tanlash uchun.

  1. Vektorlarni yaratish va shifrlash vaqtida ularni ishga tushirish.
  2. O'tkazilmaydigan tokenlar yoki bir martalik avtorizatsiya qiymatlarini yaratish uchun.

Noyob identifikatorlarni yaratish uchun, masalan, sessiya identifikatorlari.


Bu turlarning barchasi to'kilish bilan tavsiflanadi.


Agar tajovuzkor tasodifiy sonlar generatori (RNG, tasodifiy sonlar generatori) yoki soxta tasodifiy sonlar generatori (PRNG, soxta tasodifiy sonlar generatori) chiqish maʼlumotlarini taxmin qilsa yoki uzatsa, siz tokenlar, tuzlar, bir martalik qiymatlarni hisoblashingiz mumkin. va ushbu generatorning kriptografik vektorlari siyalizatsiyasi.

Shuning uchun, yuqori rentabellikdagi qiymatlarni, ya'ni o'tkazish uchun juda muhim bo'lganlarni yaratish juda muhimdir.

Plutanina, epizodik kattaliklarning ahamiyati darajasida, nodon asossizlikka majbur bo'ladi.


Albatta, siz kriptografik jihatdan kuchli o'zgaruvchan qiymatlar va "boshqa shifrlash turlari uchun" o'zgaruvchan "noyob" qiymatlar o'rtasidagi farq haqida eshitgansiz.


Asosiy maqsadlar kriptografiyada qo'llaniladigan noto'g'ri qiymatlar bo'lib, ular yuqori volatillikni (yoki aniqrog'i, yuqori entropiyani) talab qiladi va turg'unlikning boshqa sohalari uchun qiymatlar kamroq entropiyaga tushishi mumkin. Men dushmanning soxta va teskari ekanligini hurmat qilaman. O'tkazilmaydigan tasodifiy qiymatlar va zarur bo'lgan ahamiyatsiz vazifalar o'rtasida haqiqiy farq bor, ayniqsa boshqalarning o'tkazilishi o'z merosxo'rlariga og'irlik qilmaydi. Bu kriptografiyani ozuqaviy nuqtai nazardan o'chiradi. Boshqacha qilib aytganda, agar siz ahamiyatsiz bo'lmagan muammoda tasodifiy qiymatlarni tanlasangiz, siz avtomatik ravishda kuchliroq RNG-larni tanlash uchun javobgar bo'lasiz.


mt_rand() ning noto'g'ri tomoni shundaki, u tasodifiy sonlar generatori emas, balki psevdo-tasodifiy sonlar generatori yoki u ham deyilganidek, deterministik tasodifiy bit generatori (DRBG).


U "Mersenne Twister" deb nomlangan algoritmni amalga oshirdi, bu natija tasodifiy sonlar generatorining natijasiga yaqin bo'ladigan tarzda bo'lingan raqamlarni hosil qiladi.


mt_rand() faqat bitta noyob qiymatdan foydalanadi - urug', fiksatsiyalarga asoslanib, algoritm pseudo-ideal qiymatlarni hosil qiladi.< 25; $i++) { echo mt_rand(), PHP_EOL; }

Bu dumbaga hayron bo'ling, bunga o'zingiz e'tiroz bildirishingiz mumkin:


mt_srand(1361152757.2);


uchun ($i=1; $i

  • Bu Mersenne-ning PHP funktsiyasi kobdan olib tashlanganidan va qiymatlar o'rnatilgandan so'ng tugaydigan oddiy tsikl.
  • U mt_srand() va vikoryst aniq soniyalar va mikrosekundlarga hujjat namunasi sifatida yo'naltirilgan funktsiyaning chiqishida chiqarildi.

Kodni kiritganingizda, ekranda 25 ta pseudo-pad raqamlarini ko'rasiz.


Xushbo'y hid yiqilish, ko'p suv kabi ko'rinadi, hamma narsa mo''jizaviy. Men vikonamo kodini bilaman. Belgiladingizmi?

Xuddi shunday: bir xil raqamlar ko'rsatilgan.

PHP-da uchta PRNG mavjud bo'lib, ular ekspluatatsiya qilinadi va tajovuzkor o'z algoritmlariga kiritilgan va ish natijalarini uzatishi mumkin bo'lgan asosiy qiymatlarga kirishni rad etadi:

  1. Lineer Congruential Generator (LCG), lcg_value().
  2. Vihor Mersenne, mt_rand().
  3. C funktsiyasi rand() mahalliy sifatida qo'llab-quvvatlanadi.

Shuningdek, ushbu generatorlar ichki ehtiyojlar uchun array_rand() va uniqid() funksiyalari yordamida sozlanishi mumkin.


Bu shuni anglatadiki, tajovuzkor barcha kerakli boshlang'ich qiymatlar uchun ichki PHP PRNG'larini yaratish uchun ushbu va boshqa funktsiyalarning chiqish ma'lumotlarini uzatishi mumkin. Bu shuningdek, generatorlarga qo'shimcha raqamli boshqaruv orqasidagi hujumchini yo'qotib, mudofaani bo'yashga qodir emasligingizni anglatadi. Ochiq kodli qo'shimchalar ayniqsa qimmatlidir.


Biznesmen sizga ma'lum bo'lgan har qanday kob qiymati uchun barcha chiqish ma'lumotlarini uzatadi.


Yaratilgan turdagi qiymatlarning intensivligini oshirish uchun ahamiyatsiz bo'lmagan vazifalar uchun PHP talab qilinadi.


tashqi jerelalar

Ushbu qoidaning asosiy bajarilishini SecurityMultiTool ma'lumot kutubxonasida topishingiz mumkin.


Har doimgidek, PHP jasoratlari PHP yadrosiga xavfsiz yechimlarni to'g'ridan-to'g'ri kiritish o'rniga dasturchilar uchun hayotni osonlashtirishga intiladi.

Barcha nazariyalardan voz kechgan holda, keling, uning tavsifi bilan dasturga qanday hujum qilish mumkinligini ko'rib chiqaylik.

PHP raqamlar generatorlariga hujum


Bir qator sabablarga ko'ra, PHP ahamiyatsiz bo'lmagan vazifalar uchun PRNG bilan almashtiriladi. openssl_pseudo_random_bytes() funksiyasi endi PHP 5.3 da mavjud emas. Windows blokirovkasi bilan bog'liq muammolarga duch keldi va 5.3.4 versiyasi chiqarilmadi.


Shuningdek, PHP 5.3 da Windows’dagi mcrypt_create_iv() funksiyasi MCRYPT_DEV_URANDOM yadrosini qo‘llab-quvvatlay boshladi.


Ilgari Windows faqat MCRYPT_RAND-ni qo'llab-quvvatlagan - aslida rand() funktsiyasi tomonidan ichki ehtiyojlar uchun ishlatiladigan bir xil PRNG tizimi.


Ma'lumki, PHP 5.3 paydo bo'lishidan oldin juda ko'p tozalashlar mavjud edi, shuning uchun ko'plab eski qo'shimchalar yozilgan. oldingi versiyalar, kuchliroq PRNGlarga o'tmagan bo'lishi mumkin.


O'zingizning fikringizga ko'ra Openssl va Mcrypt kengaytmasini tanlang.

Fragmentlar PHP 5.3 dasturlari bilan ishlaydigan serverlarda mavjudligiga ishonish mumkin emas;

Biroq, ikkala bosqichda ham bizda ahamiyatsiz ma'lumotlarga ega bo'lishimiz mumkin, masalan, past entropiya kob qiymatlari bilan PRNG yordamida yaratilgan faza qiymatlarining turg'unligi.

Bu bizni kob qiymatlarining yangilanishidan kelib chiqadigan hujumlardan ogohlantirish uchun.

1. Server mod_php bilan ishlamayapti, bu KeepAlive tomonidan yoqilganda, bir PHP jarayoni tomonidan bir nechta so'rovlarga xizmat ko'rsatish imkonini beradi.

PHP tasodifiy sonlar generatorlari har bir jarayonda bir marta tasodifiy qiymatlarni olib tashlashi muhimdir.

Agar jarayondan oldin ikkita yoki undan ko'proq ichimlik ishlab olsak, biz bir xil kob qiymatlaridan foydalanamiz.

Hujumning mohiyati SHU KOB qiymati (xuddi shu jarayonda) asosida yaratilgan boshqa tokenni uzatish uchun zarur bo'lgan kob qiymatini olish uchun bitta token yaratilishini muzlatishdan iborat.

Mod_php fragmentlari bir nechta iboralar uchun tegishli o'zgaruvchilar qiymatlarini ayirish uchun idealdir, ammo boshqa hollarda, bitta bayonot yordamida siz mt_rand() ga oziqlanadigan bitta qiymatni ayirishingiz mumkin.

Mod_php dan oldin iloji boricha yuqorida ishlaydi.

  • Masalan, mt_rand() uchun asosiy qiymatni yaratish uchun ishlatiladigan entropiyaning bir qismi seans identifikatori yoki xuddi shu yozuvdagi chiqish qiymatlari orqali kiritilishi mumkin.
  • 2. Server mt_rand() tokenlari asosida yaratilgan CSRF tokenlarini, parolni tiklash tokenlarini yoki bulut hisobini tasdiqlash tokenlarini ochadi.
  • Kob qiymatini olish uchun biz PHP generatorlari tomonidan yaratilgan raqamni to'g'ridan-to'g'ri tekshirishimiz kerak.
  • Bundan tashqari, hikoyaning ma'nosi yo'q, chunki u vikorist.

Tokenlarni yaratishning ba'zi usullari aniq, ba'zilari esa mashhur.

Umuman olganda, zaif usullar PHP tasodifiy sonlar generatorlaridan biri (masalan, mt_rand()), zaif entropiya (muhim bo'lmagan ma'lumotlarning boshqa ko'plab turlari mavjud) va/yoki zaif xeshlar (masalan, MD5 yoki Shuvannya holda).

Yuqoridagi kodga qarasangiz, u zaif avlod usuli belgilarini ko'rsatadi.


Men niqoblash hech qachon yaxshi qaror emasligini ko'rsatish uchun SHA512 ni tanladim.


SHA512 zaifroq xeshlashdir, shuning uchun u tezda hisoblab chiqiladi, shuning uchun tajovuzkor protsessor yoki GPUga kirish ma'lumotlarini aql bovar qilmaydigan tezlikda qo'pol ravishda kiritishi mumkin.

  1. Qo'shimcha A kiritish uchun token olib tashlanadi va u kob qiymatini hisoblash uchun teskari muhandislikdan o'tkaziladi.
  2. Qo'shimcha B buyrug'idan so'ng bir xil kob qiymatiga asoslangan token hosil bo'ladi.
  3. Ushbu token keyingi parolni tiklash uchun ushbu dasturlarning ma'lumotlar bazasida saqlanadi. SHA512 xeshi buzilgan, shuning uchun ma'lumotlar server tomonidan yaratilgan.
  4. Vipadkov raqami
  5. O'chirilgan vipadkovy qiymatining qo'shimcha yordami uchun, qo'shimcha qiymatni qo'pol kuch ishlating, chunki u ushbu qo'shimcha yordam uchun yaratilgan.
  6. Vikoristovye kob qiymatlari bir qator vidjet qiymatlarini hisoblash uchun mo'ljallangan, bu, albatta, parolni tiklash tokenining asosi bo'lishi mumkin.
  7. Vikorist administrator parolini tiklash uchun ushbu token(lar)dan foydalanadi.

Biz administratorning bulut hisobiga kirishni, hurmat va foyda olishni rad etamiz.

Hech bo'lmaganda biz hurmat qilamiz.

Keling, xakerlik qilishni boshlaylik ...

Pokrokovy yomon dasturi

Protsedura 1. Bu yerda tokenni olib tashlash uchun A yozish kerak.

Ma'lum bo'lishicha, maqsadli token va parolni tiklash tokeni mt_rand() chiqishida saqlanadi.

Shuning uchun uni o'zingiz tanlashingiz kerak.

Bundan tashqari, bizning aniq stsenariyimizda barcha tokenlar bir xil tarzda yaratilgan, shuning uchun siz shunchaki CSRF tokenini olib, uni kelajak uchun saqlashingiz mumkin.


Faqat buning uchun mening so'zimni qabul qilmang. Agar sizda qolgan avlodlardan birining diskret video kartasi bo'lsa, keyingi yo'lga o'tishingiz mumkin. Biz bitta xeshni qidirayotganimiz sababli, men tezda qo'pol kuch uchun mo''jizaviy vositadan foydalanishga qaror qildim - hashcat-lite.


Bu hashcat-ning eng ilg'or versiyalaridan biri bo'lib, u hamma uchun


operatsion tizimlar

, shu jumladan Windows.


Ushbu koddan foydalanib, token yarating: $rand = mt_rand();

echo "Tasodifiy raqam: ", $rand, PHP_EOL;

  • $token = hash("sha512", $rand);
  • echo "Token:", $token, PHP_EOL;
  • Ushbu kod A so'rovidan token hosil qiladi (SHA512 xeshga kerakli miqdordagi yozuvlarni joylashtirish uchun) va uni hashcat orqali boshqaradi:
  • ./oclHashcat-lite64 -m1700 --pw-min=1 --pw-max=10 -1?d -o ./seed.txt
  • ?d?d?d?d?d?d?d?d?d?d?d
  • Bu variantlarning barchasi nimani anglatadi:

-m1700: xesh algoritmini anglatadi, bu erda 1700 SHA512 degan ma'noni anglatadi.

--pw-min=1: xeshlangan qiymatning minimal kirish qiymatini bildiradi.

--pw-max=10: xeshlangan qiymatning maksimal kirish qiymatini o'rnatadi (mt_rand() uchun 10). -1?d: bizga faqat raqamlardan (ya'ni 0-9) iborat maxsus lug'at kerakligini bildiradi.-o ./seed.txt: natijalarni yozish uchun fayl. Ekranda hech narsa ko'rsatilmaydi, shuning uchun ushbu parametrni o'rnatishni unutmang!?d?d?d?d?d?d?d?d?d?d: formatni belgilovchi niqob (barcha raqamlar maksimal 10 tagacha). Agar hamma narsa to'g'ri bajarilgan bo'lsa va GPU erimasa, Hashcat bir necha daqiqada xeshlangan raqamni hisoblab chiqadi.).


Ha, hwilin.

Bu bir soatdan ko'proq vaqt olishi mumkin, garchi SHA512 buzilgan bo'lsa-da, qolganlari esa protsessorda tugaydi.


Yaxshi protsessorda siz kilogramm uchun kob qiymatlarining barcha mumkin bo'lgan diapazonini topishingiz mumkin. Natijada bitta yoki bir nechta mumkin bo'lgan qiymatlar (ya'ni, berilgan tasodifiy sonni olib tashlash mumkin bo'lgan qiymat). Takror aytaman: biz Mersen vorteksi funktsiyasi uchun PHP kob qiymatlarida faqat bir marta yaratilgan zaif entropiya natijasini bilamiz.

Keyinchalik bu qiymatlar qanday yaratilganini ko'rib chiqamiz, shuning uchun nima uchun qo'pol kuch ishlatishingiz mumkinligini bilib olasiz.

Ey Xudoyim, nega urushdik?


oddiy vositalar bilan

yovuzlik, chegaragacha kirish mumkin.

Ular mt_rand() qo'ng'iroqlari ostida qamoqqa olinadi va boshqa stsenariylardan oldin ham qamoqqa olinishi mumkinligi haqidagi fikrni tasvirlaydi (masalan, tokenlarni yaratishda oxirgi mt_rand() qo'ng'iroqlari).

Endi siz barcha dasturlar uchun administrator parolini tiklash va bulut hisobiga kirishni rad etish imkonini beruvchi tokenni joylashtirish uchun URL manzilini to'plashingiz kerak.

Albatta, forumda va statistikada siz filtrlanmagan HTMLni nashr qilishingiz mumkin (ko'pincha eshelonni himoya qilish tamoyilini buzadi).

Bu sizga zararli dasturlar va Man-In-The-Browser monitoringi texnikasi bilan kompyuterlarini yuqtirgan kompyuter dasturlariga katta XSS hujumining oldini olishga imkon beradi.


Jiddiy, nega yana bitta kirish taqiqlangani bilan bezovta qilasiz?


Bir qarashda, passiv va beparvo bo'lmagan hujumlarning mohiyati, yulduzlar o'z maqsadiga erishishlari uchun yovuz odamning u erga to'liq kirib borishiga yordam berishdir.


Agar siz ketma-ket bosish zarbalarini bajarish uchun kerakli kombinatsiyani tezda bosishingiz kerak bo'lsa, xakerlik xuddi arkada jangovar o'yinini o'ynashga o'xshaydi.

Hujumdan keyin tahlil

Biz endi bilamizki, PHP-dan import qilingan PRNG-larning buzilishi entropiya tanqisligi ta'siriga bog'liq (ya'ni noaniqlikning kamayishi qo'pol kuchni kamaytiradi).


Biz hujumimizni kengaytirishimiz mumkin:


Ochiq ma'lumotlarning tarqalishi tufayli, tokenlarni yaratishning bu usuli mutlaqo cheksizdir.


Buning sababini tushunish uchun uniqid() PHP funksiyasini ko'rib chiqing.


Bu ma'no:


Joriy soat asosida mikrosoniyalardan noyob prefiks identifikatori olinadi.

Esingizda bo'lsa, entropiya ahamiyatsiz dunyo.


Axborotni to'kish orqali mt_rand() tomonidan yaratilgan qiymat hosil bo'lishi mumkin, shuning uchun mt_rand() noyob prefiks identifikatori sifatida null ahamiyatsizligini qo'shadi.

Bizning ilovamiz uniqid() uchun yagona turdagi kirish ma'lumotlariga ega - bir soat.


$id = uniqid();

$vaqt = str_split($id, 8);


$sek = hexdec("0x". $vaqt);

$usec = hexdec("0x". $vaqt);

echo "Seconds: ", $sec, PHP_EOL, "Microseconds: ", $usec, PHP_EOL;


C-kodga hayron bo'ling.

Parametrlardan qat'i nazar, chiqish ma'lumotlarining aniq tizim vaqti hech qachon olinmaydi:


echo uniqid(), PHP_EOL;

// 514ee7f81c4b8 echo uniqid("prefiks-"), PHP_EOL;


C-kodni qanday moslashtirish kerak, yangi entropiya wiki manbasi php_combined_lcg() ichki funksiyasini chiqaradi.


Ushbu funktsiya ishlab chiquvchining maydoniga lcg_value() qo'shimcha funktsiyasi orqasida keltiriladi, men uni PHP-o'zgartirilgan uniqid() funktsiyasiga qo'shdim.<<11); } else { LCG(s1) = 1; } #ifdef ZTS LCG(s2) = (long) tsrm_thread_id(); #else LCG(s2) = (long) getpid(); #endif /* Add entropy to s2 by calling gettimeofday() again */ if (gettimeofday(&tv, NULL) == 0) { LCG(s2) ^= (tv.tv_usec<<11); } LCG(seeded) = 1; }

Asosan, u kob qiymatlaridan olingan ikkita chiziqli mos keladigan generatorlar yordamida yaratilgan ikkita qiymatni birlashtiradi.


Quyida kob qiymatlari bo'lgan generatorlarni o'z ichiga olgan kod mavjud.


Mt_rand() da bo'lgani kabi, hidlar har bir PHP jarayoni uchun bir marta hosil bo'ladi va kelajakdagi barcha bloglarda tez-tez takrorlanadi.


statik void lcg_seed(TSRMLS_D) /* ((( * / ( struct timeval tv; if (gettimeofday(&tv, NULL) == 0)) ( LCG(s1) = tv.tv_sec ^ (tv.tv_usec)

Bu shuni anglatadiki, PHP da qo'llaniladigan barcha kob qiymatlari bir-biriga bog'liq.


Siz bir xil kirish ma'lumotlarini bir necha marta olasiz.

Ehtimol, siz avvalroq muhokama qilganimizdek, boshlang'ich mikrosekundlar oralig'ini cheklashingiz mumkin: agar birinchisi soniyalar o'rtasida almashish bo'lsa, ikkita qo'shimcha qadamni qo'llang (shunda mikrosoat 0 + keyingi C tugmasini bosish gettimeofday() soatiga teng bo'ladi. ).

Boshqa gettimeofday() qo'ng'iroqlari orasidagi deltani mikrosekundlarda hisoblashingiz mumkin, bu esa chiqish kodiga kirish imkonini beradi (PHP kodiga ochiq bo'lish foydalidir).


Shuni ta'kidlash kerakki, mt_rand() kob qiymatining qo'pol kuchi yakuniy kob qiymatini beradi, bu esa oflayn tekshirish imkonini beradi.

Biroq, asosiy muammo php_combined_lcg() bilan bog'liq.


Esingizda bo'lsa, PHP endi session.entropy_file va session.entropy_length buyruqlari uchun yangi seans variantlarini qo'llab-quvvatlaydi.


Bu php_combined_lcg() LCG generatorlari yordamida birlashtirish uchun ikkita kob qiymatini tezda (bir yil talab qilmasdan) olib tashlashingiz mumkin bo'lgan seans identifikatorlarini shafqatsiz kuchga kiritish uchun mo'ljallangan.


Agar siz PHP 5.3 yoki undan pastroq versiyadan foydalanayotgan bo'lsangiz, siz ushbu parametrlarni noto'g'ri sozlagan bo'lishingiz mumkin.


Va bu yana bir ma'lumot manbasining mavjudligini anglatadi, bu esa asl LCG qiymatlarini olib tashlash uchun seans identifikatorlarini qo'pol ravishda majburlash imkonini beradi.


Bunday holatlar uchun LCG qiymatlarini hisoblash imkonini beruvchi Windows qo'shimchasi mavjud.

Gapirishdan oldin, LCG holatini bilish sizga mt_rand() kob qiymatlarini qanday olib tashlashini tushunishga imkon beradi, bu mt_rand() qiymatining burilishlarini chetlab o'tishning yana bir usuli.


Bularning barchasi aylantirilgan uniqid() qiymatiga entropiya qo'shish nuqtai nazaridan nimani anglatadi?

$token = hash("sha512", uniqid(mt_rand(), true));

Bu entropiya bo'lmagan potentsial tarqalishining yana bir misolidir.


Afsuski, norozilik ixtiyoriy ravishda kengaytirilganligi sababli, ba'zi hollarda qolgan oxirgi chora sifatida zaif entropiyaga tayanishdan boshqa ilojimiz yo'q.


Agar shunday bo'lsa, mt_rand() ning zaif entropiyasini qo'shimcha ahamiyatsiz elementlar yordamida to'ldirish, ma'lumotlarni psevdo-pad baytlarini olish mumkin bo'lgan yagona hovuzga aralashtirish kerak.


Kuchli entropiyaning g'alabali aralashtirgichi kabi shunga o'xshash xato generatori Entoni Ferrara tomonidan o'zining RandomLib kutubxonasida allaqachon amalga oshirilgan.

Asosiysi, dasturchilarning ishlash qobiliyati.

Murakkab matematik o'zgarishlarning yordami uchun entropiyangizning zaifligidan ehtiyot bo'ling.

Yovuzlikni takrorlashga arziydi, chunki boshoqning asosiy ma'nosi ma'lum.

Bunday hiylalar qo'pol kuch bilan soliq to'lovini biroz oshirishi mumkin.

Unutmang: entropiya qanchalik kam bo'lsa, unchalik ahamiyatsiz emas;

Kamroq noaniqlik bilan, qo'pol kuchga kamroq ehtiyoj bor.

Qarorning yagona asosi - siz to'plagan entropiya pulini oshirish uchun har qanday mavjud vositalardan foydalanish.

RandomLib kutubxonasi entropiyaning turli elementlaridan ma'lumotlarni aralashtirish va tajovuzkorga hujum qilish uchun kerak bo'lishi mumkin bo'lgan ma'lumotlarni lokalizatsiya qilish orqali tasodifiy baytlarni hosil qiladi.

Misol uchun, siz mt_rand(), uniqid() va lcg_value() chiqish ma'lumotlarini o'zgartirishingiz mumkin, PID, xotira xotirasi, mikrosoat nima, serializatsiya $_ENV, posix_times() va hokazolarni qo'shishingiz mumkin. Yoki undan ham ko'proq, bu RandomLib-ni kengaytirish imkonini beradi.

Har bir deltani mikrosekundlarda hisoblashga ruxsat beriladi (har bir funktsiya hash() manbasiga psevdo-tipdagi kirish ma'lumotlari bilan qancha mikrosekundda ishlashi kerakligini aniqlash uchun).

$massiv = massiv("bir", "ikki", "uch", "to'rt", "besh", "olti");

echo $massiv;

$massiv = massiv("bir", "ikki", "uch", "to'rt", "besh", "olti");

Yoki pastki indeks indeksini tanlash uchun rand va count funksiyalaridan foydalanishingiz mumkin.

$tasodifiy = $random;

Bu sizga kerak bo'lgan funksiya kabi qiziqarli

Funktsiya random_value($massiv, $default=null) ( $k = mt_rand(0, count($massiv) - 1); qaytish isset($array[$k])? $massiv[$k]: $default; )

Xavfsizlik uchun sizning tanlovingiz nima?

Agar shunday bo'lsa, random_int() va array_keys() ni tekshiring.

(random_bytes() - faqat PHP 7, lekin PHP 5 uchun polipolk mavjud).

Funktsiya random_index(massiv $manba) ( $max = count($source) - 1; $r = random_int(0, $max); $k = array_keys($source); $k[$r]; qaytaring)

Agar shunday bo'lsa, random_int() va array_keys() ni tekshiring.

Zastosuvannya:

$massiv = ["olma" => 1234, "o'g'il" => 2345, "mushuk" => 3456, "it" => 4567, "echo" => 5678, "fortune" => 6789];

  • $i = tasodifiy_indeks ($massiv);
  • var_dump([$i, $massiv[$i]]);

Funktsiya array_random($array, $summa = 1) ( $keys = array_rand($massiv, $summa); if ($miqdori == 1) ( return $massiv[$keys]; ) $results = ; foreach ($keys) $key sifatida) ( $results = $massiv[$key]; ) $natijani qaytaring)$items = ["foo", "bar", "baz", "lorem"=>"ipsum"];

massiv_tasodifiy($elementlar);

// "bar" massiv_tasodifiy($itemlar, 2);

  • // ["foo", "ipsum"]
  • Eslatmalar bo'yi:
  • $summa count($array) dan kam yoki koʻp ga teng.

array_rand() tugmachalarni aralashtirmaydi (PHP 5.2.10, Bo'limdan beri), shuning uchun siz tanlagan elementlar har doim asl tartibda bo'ladi.

Tasodifiy sonlarni yaratish maxsus algoritmlarga asoslanadi.

Kirish parametri, algoritmga qarab, tasodifiy qiymat yoki keyingi qiymat bo'lishi mumkin.

Ushbu maqolada biz tasodifiy raqamlar haqida gapiramiz: ular qanday yaratilgan va ular qayerda ishlatilishi mumkin.

Vipadkovyh raqamlari Vikoristannya

PHP da qo'shimcha raqamlar muhim rol o'ynaydi, chunki...

  • juda tez-tez turli maqsadlarda ishlatiladi. Hidi asosan ehtiyotsizlikdan kelib chiqadi.
  • Ularning asosida CSRF tokenlari, API kalitlari, autentifikatsiya qiymatlari, parollarni tiklash qiymatlari va boshqalar yaratiladi. Qabul qilingan qiymatlar o'tkazilmasligi uchun hamma narsa bajarilishi kerak.
  • Stastosuvannya vyadkovyh eng muhim dumba ma'nosi: Kriptografiya uchun tuz hosil qilish

- Ko'p miqdordagi tuzlar, qoida tariqasida, "bir bitli" shifrlash uchun, shuningdek parolni xeshlash uchun ishlatiladi.

Ushbu qiymat kriptografiyani ishga tushirish uchun vektor sifatida ishlatiladi.

    Seans identifikatori kabi noyob qiymatlarni yaratish

    - PHP ko'p sonli dasturlarni yaratish uchun ishlatiladi, bu erda xavfsizlik birinchi o'rinda turadi.

    Ko'pgina funksiyalar seanslar bilan ishlash va sessiya identifikatorlarini yaratishga asoslangan.

O'tkazish deyarli mumkin bo'lmagan autentifikatsiya uchun tokenlarni yaratish

- ko'pgina PHP plaginlari maxsus API interfeyslari orqali boshqa tizimlar bilan robotlarga asoslangan.

Iltimos, API-dan foydalanishdan oldin autentifikatsiya jarayonidan o'tishingiz kerakligini unutmang.

PHP da siz asosiy raqamlarni ikki xil usulda o'rnatishingiz mumkin.

Birinchisi, mt_srand() funksiyasidan foydalanish.

Bu usul asosan birlikni ketma-ket sinovdan o'tkazishda qo'llaniladi.

Yana bir usul PHP ga asosiy raqamlarni o'zi yaratish huquqini berishdir.

4.2 versiyasidan boshlab, PHP ushbu funksiyani qo'shadi.

Keyinchalik, Vixor Mersenne faza raqamlarini yaratish uchun ishlatiladi.

PHP operatsion tizim asosida asosiy raqamni yaratadi.

Linux platformalarida siz /dev/urandom da mcrypt_create_iv() yoki openssl_pseudo_random_bytes() funksiyalaridan tezda foydalanishingiz mumkin.

Windows maxsus psevdogeneratorni taqdim etadi, unga openssl_pseudo_random_bytes() va mcrypt_create_iv() funksiyalari orqali kirish mumkin. sumka Ushbu raqamlar xavfsiz veb-ilovalarni yaratishda muhim rol o'ynaganligi sababli, biz ularning qanday ishlashi haqida ko'proq bilishimiz kerak.

Agar siz psevdogeneratorlar uchun asosiy raqamlarni yaratmoqchi bo'lsangiz, usullaringizning ishonchliligini tekshiring.< $exception)*/ { break; } } return $number; }

rand(1,N) massivdan tashqari (a,b,c,..)

Qaysi funktsiya allaqachon o'rnatilgan, lekin men mustaqil ravishda nima qilishim kerakligini bilmayman (qanday qilib?)? YANGILANISH Cheklangan massivning o'lchamidan qat'i nazar, malakali yechim ona oltin hisoblanadi. O'rnatilgan funksiya yo'q, lekin

Siz .. qila olasiz; siz ... mumkin

zrobiti tse: Funktsiya randWithout($from, $to, array $exceptions) ( sort($exceptions); // break dan foydalanishga imkon beradi; foreachda ishonchli $number = rand($from, $to - count($exceptions)));

/ yoki mt_rand() foreach ($exceptions as $exception) ( if ($number >= $exception) ( $number++; // boʻshliqni toʻldirish ) else /*if ($number)

Bu mening boshimda emas, shuning uchun siz polishingdan foydalanishingiz mumkin - aks holda siz cheksiz halqa bilan stsenariyni aniqlay olmaysiz, bu farazdir.

  • Eslatma
    • : Funktsiya $exceptions tufayli uziladi
    • Biroq, u normal ishlashi mumkin, chunki N katta va sizda juda ko'p himoyaviy qiymatlar yo'q.
  • Yuridik ahamiyatga ega bo'lmagan massiv yarating
    • I vikorist massiv_rand Xuddi shu ma'noda tebranish
    • Agar N etarli bo'lmasa, nima normal bo'ladi

Bu sizga kerak bo'lgan narsaga bog'liq va nima uchun bu yondashuv yaxshi alternativ bo'lishi mumkin.

$raqamlar = massiv_diff (diapazon (1, N), massiv (a, b, c));

// Yoki (to'g'ri javob emas, lekin siz o'zingizning sharoitingizga qarab uni o'rnini bosuvchi sifatida ishlatishingiz mumkin) aralashtirma ($numberlar);

// $raqamlar endi sizni qiziqtirgan barcha raqamlarni o'z ichiga olgan tasodifiy tartiblangan massivdir // Yoki: $x = $raqamlar;

// $x endi sizni qiziqtirgan raqamlar to'plamidan tanlangan tasodifiy raqam

  1. Shunday qilib, siz bir vaqtning o'zida potentsial raqamlar to'plamini yaratishingiz shart emas, balki bir marta to'plamni yarating va keyin bir xil to'plamdan tasodifiy sonlar to'plamini aniqroq tarzda tanlang.
  2. Eng oddiy usul...
  3. Uzluksiz massivdagi chiquvchi pozitsiyani M = N - # istisnolar bilan tanlashingiz va ularni teshiklari bilan chiqish massivida osongina ko'rsatishingiz uchun etishmayotgan joylar qatorini hisoblashingiz kerak.
  4. Buning uchun o'tkazib yuborilgan massaga teng vaqt va makon kerak bo'ladi.<= r < Offest это легко с бинарным поиском
  5. Men PHP-ni erdagi ochilishdan bilmayman, shuning uchun napiv-psudo matn kodini tekshiring.

Istisnolar qatoridan keyin yangi Ofset massivini oling.

Ofsetda [i] chiqish massividagi ikkita elementni o'tkazib yuboradigan aniq bo'sh bo'lmagan massivning birinchi indeksini saqlaydi.

Ochiladigan elementni tanlang.

Kim xitoylik ishlab chiqaruvchilarni dunyoga mashhur tendentsiyalardan tendentsiyalarni o'g'irlashda ayblaydi.