Phpєvipadkovimの意味。 PHPの配列からの変数選択。 サーバーは、CSRFトークン、パスワードドロップトークン、またはmt_rand()トークンに基づいて生成されたクラウドレコードの検証のロックを解除します

ゴロフナ / Korisne PZ

PHPのさまざまな意味はどこにでもあります。 すべてのフレームワーク、多くのライブラリ。 ちなみに、あなた自身が、トークンとソルトを生成するための異なる値と、関数の入力データを持つ一連のコードを作成しました。 したがって、vipadkovіの意味は、virishenninayrіznomanіtnіshzavdanで重要な役割を果たします。

  1. プールまたはオプションの範囲からのオプションの特定の選択について。
  2. 暗号化中の初期化でのベクトルの作成用。
  3. 譲渡不可能なトークンまたは1回限りの認証値を生成するため。
  4. セッションIDなどの一意の識別子を作成するため。

これらすべての変動において、争いは特徴的です。 攻撃者が乱数ジェネレーター(RNG、乱数ジェネレーター)または疑似乱数ジェネレーター(PRNG、疑似乱数ジェネレーター)のデータを転送することを知っている場合は、トークン、ソルト、ワンタイム値を計算できますおよび暗号ベクトルと初期化。 どのジェネレーター。 だからこそ、高いヴィピスティックな意味を生み出すことが重要であり、そうすれば、あなた、ヤキはさらに伝えることが重要になります。 いつでも、パスワードトークン、CSRFトークン、APIキー、ワンタイム値、認証トークンの転送を許可しないでください!


PHPでは、vipadkovy値を使用すると、さらに2つの可能性があります。

  1. 情報開示。
  2. Nestachaエントロピー(不十分なエントロピー)。

このコンテキストでは、「情報の公開」は、疑似仮想数値のジェネレーターの内部ステージの順番、つまり最初のシード値に持ち込まれます。 同様の巻線は、将来のPRNGの風雨の予測を大幅に改善する可能性があります。


「エントロピーの結婚」は状況を説明します。穂軸の内部シード(シード)PRNGまたはフローリングの他の外部データの変動が小さい場合、可能な値の全範囲はブルートフォースによって簡単に克服できます。 PHPプログラマーにとっては良いニュースではありません。


伝えられるところによると、攻撃シナリオの尻からの侮辱を調べます。 PHPでのプログラミングについて話している場合は、本当の意味を確認することから始めましょう。

vipadkovの意味は何ですか?

プルタニンのvipadkovyhの大きさを認める方法は強力で、不合理です。 間違いなく、暗号的に安定したvipadkovymi値と「他のタイプのvikoristannyaの」異なる「一意の」値の違いを考慮してください。 主な損傷は、暗号化で勝利する代位の値であり、高い代位(または、より正確には、高いエントロピー)を意味し、他の混雑領域の値は、エントロピーのコストが低くなる可能性があります。 私は敵が偽りで逆効果であることを尊重します。 実際には、譲渡不可能なvipadkovyの意味と、些細な作業に必要な意味との間には違いがあります。他の人の譲渡がshkidlivyhnaslіdkіvよりも自分にとって負担が大きくない場合はさらにそうです。 栄養学的観点から暗号化を除外したTsevzagali。 言い換えると、重要なタスクで勝利の価値があるとしても、それは自動的に最も豊富なRNGを選択することになります。


振動値の強さは、エントロピーによるそれらの世代の硝子体によって決定されます。 エントロピーは、「ビット」にある無意味な世界の本質です。 たとえば、2ビットビットを取る場合、その値は0または1になります。攻撃者が正確な値を知らない場合、2ビットのエントロピーがある可能性があります(したがって、コインがドロップされます)。 攻撃者として、値が1つしかないことをご存知でしょう。0ビットをエントロピーできます。転移の破片は無意味の反意語です。 また、ビット数は0から2の範囲で変更できます。たとえば、99%の時間で2つのビットが1に等しい場合、エントロピーは0で過大評価される可能性があります。


PHPを使用すると、その場でバグを報告できます。 mt_rand()関数は、すべての桁の変数値を生成します。 ボーンは手紙を見ていません、 特殊文字他の意味は何ですか。 Tseは、攻撃者の攻撃者がスキンバイトに余裕がないため、エントロピーが低いことを意味します。 mt_rand()をLinuxカーネル/ dev / randomからのバイト読み取りに置き換えるために、正しいバイトバイトを取得します。悪臭は、ドライバーによって形成されたノイズを修正することによって生成されます。 システムの別棟その他。 このオプションが大幅に短縮されていることは明らかであるため、より多くのエントロピーが提供されます。


mt_rand()の不備について話すと、これらはvipadkovyではなく、疑似vipad数のジェネレーター、または他の言い方をすれば、vipadkovy 2シーケンスシーケンスの決定論的ジェネレーター(Deterministic Random Bit Generator、DRBG)です。 新しい実装では、アルゴリズムは「メルセンヌツイスター」(メルセンヌツイスター)と呼ばれ、そのようなランクで分割された数値を生成するため、結果はvipadkovyh数値のロボットジェネレーターの結果に近くなります。 mt_rand()にはランダムな値が1つだけあります。シードは、修正に基づいて、アルゴリズムが疑似ランダム値を生成します。


お尻に驚嘆、あなたは自分でそれに抗議することができます:


mt_srand(1361152757.2); for($ i = 1; $ i< 25; $i++) { echo mt_rand(), PHP_EOL; }

これは単純なサイクルであり、メルセンヌの旋風のPHP関数が設定値の後ろで穂軸に達した後にカウントされます。 これは、関数の終了時に取り出されました。これは、mt_srand()および勝利したストリーミング秒とマイクロ秒のドキュメントの例として使用されます。 Yakshcho vykonatiガイダンスコード、画面上の25の疑似vipadkovyh番号を表示します。 悪臭はvipadkovymi、毎日のzbіgіvに見えます、すべてが奇跡的です。 私はコードを知っています。 覚えていますか? 同じ:この番号を表示します。 3番目、4番目のvp'yateから始めましょう。 古いバージョンのPHPでは、結果が異なる場合がありますが、問題はありませんが、すべての最新バージョンのPHPで一般的です。


攻撃者がそのようなPRNGの値を取り出すために、すべてのデータをmt_rand()に転送できます。 したがって、穂軸の値のザヒストは、最初の行のバガの右側にあります。 より多くを費やすと、正の値を生成する権利がなくなります。


次の2つの方法のいずれかでcob値を生成できます。

  • 手動で、ヘルプ関数mt_srand()の場合、
  • mt_srand()を無視し、PHPに自動的に生成させます。

別のオプションはより短いですが、今日のレガシーアドオンは、より大きな最新バージョンのPHPに移植した後、mt_srand()を劣化させることがよくあります。


攻撃者が意味の一部を復元して(シード回復攻撃)、将来の意味を転送するのに十分な情報を提供するリスクを示唆しています。 その結果、そのようなターンの後に補足があれば、情報の開示を攻撃することができます。 明らかに受動的な性質に関係なく、Tsespravzhnіsіnkaの不整合。 に関する情報のスクロール ローカルシステムエシェロン攻撃の原理を破壊するために、攻撃者が攻撃的な攻撃を行うのを助けるためのzdatna。

PHPの変数値

PHPには3つのPRNGがあり、その結果、攻撃者はcob値へのアクセスを拒否します。これは、アルゴリズムにとどまる可能性があり、作業の結果を転送する可能性があります。

  1. 線形合同法(LCG)、lcg_value()。
  2. メルセンヌの渦、mt_rand()。
  3. ローカルでサポートされているC関数rand()。

また、qiジェネレーターは、内部のニーズ、array_rand()およびuniqid()の関数用にセットアップされています。 これは、攻撃者がこれらの関数やその他の関数のデータを転送できることを意味します。これにより、必要なすべてのcob値を探すかのように、PHPムービーの内部PRNGが獲得されます。 それはまた、発電機への数値動物の助けを求めて攻撃者を迷わせたため、ザキストの端に行くことができないことを意味します。 オープンソースのサプリメントは特に価値があります。 建物の悪行者は、与えられた穂軸の値に関するすべてのデータを伝えました。


生成される変数値の明るさを上げるには、重要なタスクの場合、PHPが必要です 古いdzherelaオペレーティングシステムによって期待されるエントロピー。 Linuxでは、/ dev / urandomを停止します。openssl_pseudo_random_bytes()またはmcrypt_create_iv()関数を使用して、ランダムに読み取ることも、ランダムに読み取ることもできません。 攻撃的な悪臭は、Windowsで暗号的に安全な疑似振動数ジェネレーター(CSPRNG)を獲得できますが、PHPでは、これらの機能で安全な拡張機能なしで、特定のジェネレーターからデータを抽出する直接的な方法はありません。 つまり、サーバーバージョンのPHPにはOpenSSL拡張機能またはMcryptがあることに注意してください。


/ dev / urandom-PRNGですが、多くの場合、高エントロピーの/ dev/randomの新しい値を取ります。 邪悪な者のYogonetіkavoyメソッドを奪うためにツェ。 / dev / randomを、ブロッキングリソースであるものに直接一意に読み取ろうとします。 十分なエントロピーを取得するとすぐに、システムから十分なエントロピーが再びシャープになるまで、すべての読み取りがブロックされます。 最も重要なタスクについては、自分で/ dev/randomをスワイプする必要があります。


すべてをルールに取り入れます。


重要な乱数を送信するすべてのプロセスは、openssl_pseudo_random_bytes()のランダム化を担当します。 別の方法として、/ dev/urandomから直接バイトを読み取ってみることができます。 選択肢がない場合に選択肢が見つからない場合は、利用可能な多数のdzherelvipadkovyhまたは秘密の意味でのデータの強力な混合の助けを借りて値を生成するのはあなたの責任です。

このルールの基本的な実装は、SecurityMultiToolリファレンスライブラリにあります。 実際のところ、PHPの内部は、PHPコアに安全なソリューションを直接含めることで、プログラマーの生活を楽にすることが奨励されています。


理論をテストするために、上記の説明を見て、プログラムを攻撃する方法を考えてみましょう。

PHPのvipad番号ジェネレータへの攻撃

いくつかの理由から、PHPには重要なタスクを克服するためのPRNGがあります。


openssl_pseudo_random_bytes()関数は、PHP5.3では使用できなくなりました。 Windowsでは、ブロッキングの問題が発生し、ドックはバージョン5.3.4をリリースしませんでした。 また、PHP 5.3では、Windowsのmcrypt_create_iv()関数がMCRYPT_DEV_URANDOMジェネリックのトリミングを開始しました。 それ以前は、WindowsはMCRYPT_RANDのみを追加していました。実際、rand()関数によって内部ニーズに使用されるのと同じシステムPRNGです。 ええと、PHP 5.3が登場する前は、多くのギャップがあったので、 以前のバージョン、強力なPRNGに切り替わらない場合があります。


好みに応じて、OpensslおよびMcrypt拡張機能を選択します。 シャードは、PHP 5.3を実行しているサーバーでの可用性に依存できません。プログラムは、重要な値を生成するためのフォールバックとして、PHPに組み込まれているPRNGを獲得することがよくあります。


ただし、どちらのモードでも、エントロピーの低いcob値を持つPRNGの助けを借りて生成された正の値があるかのように、重要な割り当てが存在する可能性があります。 攻撃がvіdnovlennyamcob値になる前に、私たちrazlilivyを奪ってください。 最も簡単な例を見てみましょう。


どうやら、私たちはオンラインプログラムで、トークンを生成するためのチートコードを知っていました。 その他のタスク補遺によると:


$ token = hash( "sha512"、mt_rand());

トークンを生成するために折りたたみ可能ですが、下品なバリアントも生成します。 ここにはmt_rand()の芯が1つだけあり、SHA512の助けを借りてハッシュします。 実際のところ、プログラマーが言うように、PHPのvipadkovy値の機能は「dositvipadkovі」であり、略語の歌の選択では、ドックは「暗号化」という言葉を鳴らします。 たとえば、アクセストークン、CSRFトークン、APIワンタイム値、およびパスワードドロップトークンは、暗号化されていない違いまであります。 最初に、続けて、私はあなたがよりよく理解するように、プログラムrazlivimyを奪うために、全体のrazlivostitsієїプログラムについて報告します。

コンテンツプログラムの特徴

これは最終的な翻訳ではありません。 実際には、パラメータのリストを変更できます。

1. mod_php zastosovサーバー。KeepAliveを使用すると、1つのPHPプロセスで飲み物を提供できます。

PHPの乱数ジェネレーターは、プロセスごとに1回ずつ各値を取得することが重要です。 2杯以上の飲み物を処理できる場合は、同じ穂軸の値を獲得します。 攻撃の本質は、cob値に基づいて生成される別のトークンの転送に必要であるため、cob値を削除するために1つのトークンを抽出する必要があるという事実にあります(同じプロセス)。 mod_phpシャードは、ランダムな値の値を削除するためにいくつかのクエリを選択するのに理想的ですが、1つのクエリの助けを借りて、mt_rand()の前に取得されたいくつかの値を取得できます。 世俗的なbe-yakivimogiをmod_phpに奪います。 たとえば、mt_rand()のcob値を生成するために使用されるエントロピーの一部は、セッションIDまたは同じリクエストの他の値を介して指定できます。

2.サーバーは、CSRFトークン、パスワードドロップトークン、またはmt_rand()トークンに基づいて生成されたクラウドレコードの確認のロックを解除します

cob値を削除するには、PHPのジェネレーターによって作成された数値をランダムに書き換える必要があります。 さらに、それは何の意味もありません、それは勝利のようです。 mt_rand()出力データ、CSRFハッシュ、クラウドレコード確認トークンなど、利用可能な値から何でも学ぶことができます。 間接的にdzherelに移動します。場合によっては、途中で別の動作を示すことを意味し、それによって意味が明らかになります。 これは、転送することになっている別のトークンを生成するのと同じプロセスで使用できるという点でスマットです。 そして重要なのは、「情報を明らかにする」ことの矛盾です。 良くなるとすぐに、週末のPRNGの順番は非常に危険になる可能性があります。 注意を払うために、違いは単一のプログラムに囲まれていないことに注意してください。悪臭を侮辱するかのように、サーバー上の1つの付録のPRNGデータを読み取り、同じサーバー上の別の付録の週末データを指定するためにzastosovuvatїxを読み取ることができます。 1つのPHPプロセスでのPRNGの評価。

3.弱いトークン生成アルゴリズム

あなたはヨガを計算することができます:

  • オープンソースプログラムを調べて、
  • 特別な終了コードにアクセスできるspivrobitnikに盗品を与える、
  • 巨大なロボット提供者のイメージの秘密である巨大なspіvrobіtnikを知っている人、
  • または単にそれを手放すと、ある種のアルゴリズムが可能になります。

トークンを生成する方法のいくつかは明白であり、いくつかは人気があります。 正しい方法で、生成の弱点は、PHPの乱数ジェネレーターの1つ(たとえば、mt_rand())、弱いエントロピー(他の数の重要でないデータはない)、および/または弱いハッシュ(たとえば、MD5またはハッシュなし)。 バットコードを詳しく見ると、生成方法が弱い兆候が見られる場合があります。 そのため、SHA512ハッシュを使用して、マスキングが必ずしも満足のいく解決策ではないことを示しています。 SHA512-弱いハッシュ、チップは簡単に数えられるので、攻撃者は名前のセキュリティを備えたCPUまたはGPUのいずれかで入力データを攻撃することができます。 また、ムーアの法則が同じであることを忘れないでください。つまり、ブルートフォース速度はスキンの新しいCPU/GPU世代よりも高速です。 そのため、パスワードは、プロセッサの生産性やムーアの法則に関係なく、追加のツールの背後でハッシュし、ある種の固定時間の結果をハッキングする責任があります。

邪悪な攻撃

私たちの攻撃は、ダウンタイムで終了することです。 PHPプロセスへの接続の一部として、クイックセッションと2種類のHTTPリクエスト(リクエストAとリクエストB)を実行します。 セッションはサーバーによって終了され、ドックは別のリクエストによって終了されません。 CSRFチェックボックスで使用可能なトークン、パスワードドロップトークン(攻撃メールによって強化されたもの)、または同様のものを削除するためのターゲティングをリクエストします。 追加IDの要求などでマークされるインラインマーク(インラインマークアップ)の他の可能性を忘れないでください。初期値が表示されるまで、トークンは非常に古くなっています。 すべて同じ-穂軸値の導入による攻撃の一部:穂軸値がそのような小さなエントロピーを持つことができる場合、ブルートフォースまたは地域テーブルの計算の後ろで検索することができます。


Zapit B。 Zrobimoは、ローカル管理者のパスワードの割引を要求します。 トークンの生成を開始する必要はありません(同じcob値に基づいて実行可能な数値を使用する場合、追加の電力Aが可能であるため、同じPHPプロセスを正常に管理できます)。 管理者がパスワードをすばやく送信し、メールで送信した場合、このトークンは指定された時点でデータベースに保存されます。 パワーAからトークンの初期値を取得できる場合は、パワーBからトークンがどのように生成されるかを知って、パスワードドロップトークンを転送します。 Otzhe、管理者がシートを読む前に割引の助けを借りることは可能です!


  1. 追加の支払いAについては、トークンを受け取り、それをターンアラウンドエンジニアリングに渡して、穂軸の値を計算します。
  2. 追加のサポートBについては、同じcob値に基づいて生成されたトークンを取得します。 このトークンは、パスワードをリセットできるようにデータベースに保存されます。
  3. サーバーによって生成されたSHA512ハッシュがクラックされます vipadic番号.
  4. 失われたvipadic値の助けを借りて、この追加の助けのために生成された、より一般的な値を総当たり攻撃します。
  5. 一連のvipadkovy値yakі、ymovіrnoを計算するためのVykoristovuєmopochatkovuєmopochatkovuyu値は、パスワードドロップのトークンの基礎になります。
  6. トークンを獲得して、管理者のパスワードをリセットします。
  7. 私たちは管理記録へのアクセスを奪い、利用し、利益を享受します。 少なくとも、私たちはそれを手に入れています。

ハッキングに行きましょう。

Pokrokovy悪プログラム

Croc1.トークンを引き出すようにAにリクエストします

セキュリティトークンとパスワードドロップトークンがmt_rand()出力データに保存されていることはわかっているようです。 だからこそ、ヨガそのものを選ぶ必要があります。 明示的なシナリオのアドオンの場合、すべてのトークンが同じ方法で生成されるため、CSRFトークンを取得して、将来のために保存することができます。

クロック2.管理者アカウント用に生成されたパスワードトークンを引き出すようにBに要求します

Tseyは、パスワードのリセットという形で簡単な変更を求めています。 トークンは、koristuvachevy投稿のデータと碑文のデータベースに保存されます。 トークンを正しく検証する必要があります。 サーバーの仕様が正確である限り、BはAを取得するのと同じPHPプロセスを取得します。また、mt_rand()wikiは両方のタイプで同じ初期値を取得します。 注文手順(中間往復を含む)のデータ入力(送信)を増やすために、リクエストAを入力してCSRFトークンを割引の形式で保存することができます。

Krok3.リクエストAに使用されたトークンのSHA512ハッシュがハッキングされた

SHA512は、プログラマーにスリルを与えます。SHA-2アルゴリズムのファミリー全体で最も多い数です。 ただし、被害者によって変換されたトークンの生成方法には、1つの問題があります。それは、変数の値が数値によって制限されることです(つまり、重要性の程度、つまりエントロピーは重要ではありません)。 mt_getrandmax()の出力データを読み間違えた場合は、瓦礫でmt_rand()を生成できる最大の数(21億4700万)を調べてください。 Qiaは、ブルートフォースでSHA512を奪う可能性の数によって制限されます。


私の言葉を信じないでください。 残りの世代のディスクリートビデオカードをお持ちの場合は、先に進むことができます。 ハッシュが1つしか見つからなかった場合は、奇跡的なブルートフォースツールであるhashcat-liteを使用してテストしました。 これはhashcatの最新バージョンの1つであり、すべての主要なバージョン用です。 オペレーティングシステム、Windowsを含む。


このコードを支援するには、トークンを生成します。


$ rand = mt_rand(); echo "乱数:"、$ rand、PHP_EOL; $ token = hash( "sha512"、$ rand); echo "Token:"、$ token、PHP_EOL;

このコードは、リクエストAからトークンを生成し(SHA512ハッシュからヒット数を見つける必要があります)、それをhashcatに渡します。


./oclHashcat-lite64 -m1700 --pw-min = 1 --pw-max = 10 -1?d -o ./seed.txt ?d?d?d?d?d?d?d?d?d?d

すべてのオプションを意味する軸:

  • -m1700:ハッシュアルゴリズムを指定します。de1700はSHA512を意味します。
  • --pw-min = 1:ハッシュする最小入力値を設定します。
  • --pw-max = 10:ハッシュする最大入力値を指定します(mt_rand()の場合は10)。
  • -1?d:数字のみのカスタム辞書(0〜9)が必要であることを示します。
  • -o ./seed.txt:結果を書き込むファイル。 画面には何も表示されません。パラメータを設定することを忘れないでください!
  • ?d?d?d?d?d?d?d?d?d?d:形式を指定するマスク(最大10までのすべての数字)。

すべてが正しく行われ、GPUが溶けない場合、Hashcatはハッシュされた数を数分間計算します。 はい、ホイリン。 先ほど、エントロピーがどのように機能するかを説明しました。 自分で他の人に確認してください。 mt_rand()関数にはほとんど機能がないため、すべての値のSHA512ハッシュを実際にわずか1時間で計算できます。 したがって、mt_rand()からの出力データをハッシュするのはばかげていました。

クロク4

さらに詳しく調べていくと、生成されたmt_rand()値のSHA512の調査には、2、3のメモが必要です。 値を確認したら、別のブルートフォースツールであるphp_mt_seedを実行できます。 この小さなユーティリティはmt_rand()データを取得し、ブルートフォースが値を計算した後、それに基づいて分析を生成できます。 Zavantage 現行版、コンパイルして実行します。 コンパイルの問題を非難するには、もっと試してください 古いバージョン(新しく、私は問題を抱えていました 仮想メディア).


./php_mt_seed

あなたは1時間以上を費やすことができます、より少ない邪悪なSHA512、破片はCPUで数えられます。 まともなプロセッサでは、ホイリンのスプラットの穂軸値の可能な範囲全体を知っています。 結果は1つ以上の可能な値です(この値の場合、これに基づいてvipadkove番号から削除できます)。 繰り返しますが、弱いエントロピーの結果が疑われます。これは、メルセンヌ渦のPHPcob値で一度だけ生成されたものです。 後で見てみましょう。値が生成されたかのように、ブルートフォースをすばやく実行できることに同意するでしょう。


Otzhe、その前は私たちがkoristuvalisでした シンプルなツール悪、メジャーで利用可能。 悪臭はmt_rand()wikiのために研ぎ澄まされていますが、他のシナリオの前に停止できるため、アイデアも示しています(たとえば、トークンを生成する時間の最後のmt_rand()wiki)。 また、悪意のあるもののセキュリティが、トークンの生成への特定のアプローチを保証する地域テーブルの生成を上書きしないことを明確にしましょう。 Axisは、mt_rand()とPythonでの記述の不整合を悪用するもう1つのツールです。

Krok5.管理上の監視可能なレコードのパスワードをドロップするためのトークンを生成することが可能です

リクエストAとBのフレームワークで、2つのリクエストのみがmt_rand()に分割されたとしましょう。 今では、予言トークンを使用することをお勧めします。これは、可能な穂軸の値を以前に代用して計算したものです。


function Forecast($ seed)(/***シード値をPRNGに渡します*/mt_srand($ seed); /***シードAからwinclick関数をスキップします*/mt_rand(); /***シード世代Bを渡してローテーションしますトークン*/$ token = hash( "sha512"、mt_rand()); return $ token;

この関数は、真皮の可能な穂軸値の割引トークンを転送します。

手順6と7。管理者アカウントのパスワードを削除して楽しんでみましょう。

ここで、トークンを取得するためのURLを選択する必要があります。これにより、管理者のパスワードを破棄できるようになり、プログラムは公開レコードにアクセスできるようになります。 フォーラムや記事で、フィルタリングされていないHTMLを公開する可能性があることは明らかです(多くの場合、段階的な攻撃の原則に違反しています)。 Tseを使用すると、コンピューターをマルウェアや監視ツール「man-In-The-Browser」(Man-In-The-Browser)に感染させる破損したプログラムのクラックに対するXSS攻撃を攻撃することができます。 真剣に、あなたはより多くのアクセス制御が必要ですか? これらの本質は、一見したところ、受動的で過度に危険ではないクイズは、悪人が自由に侵入するのを助けるために、ワインの星が頭に届くことができるという事実にあります。 一連のハードヒットを実行するために必要な組み合わせをすばやくヒットする必要がある場合は、アーケード格闘ゲームでtseyakgraをハッキングします。

攻撃後の分析

より多くのスクリプトガイダンスとコードの単純さは、mt_rand()の危険性を明確に示しています。 フロアのリスクは明らかであるため、情報の開示に応じて、mt_rand()の値が弱く付加され、攻撃者があらゆる形式で利用できるかどうかを考慮に入れることができます。


それ以上に、別の歴史があります。 たとえば、いくつかの重要なタスクで無邪気に勝利したmt_rand()のように、ライブラリにいる場合は、取得した値を確認しないでください。その後、「強力な」トークンを使用してニーズに合わせて縮小します。このライブラリを危険にさらします。 最初の問題は、ライブラリとフレームワークがcob値の置換に対する攻撃を防ぐのに役立たないことです。 mt_rand()の値を変更するためにkoristuvachを呼び出す必要があるのはなぜですか。また、同じvipadkovіの値を超えないzastosovuєのライブラリを呼び出す必要があるのはなぜですか。


本当に気分を害したワイン。 ライブラリは重要なタスクにmt_rand()を選択しません(そうでなければエントロピーが弱いため)、vipadkovyh値では一般的でした。 そして、koristuvachは、mt_rand()値がねじれているコードを書くことについて有罪ではありません。 つまり、そのように、書かれていない文字mt_rand()をほぼ非難的に指でチェックできるので、まっすぐに曲がる必要はありません。


情報開示の軽薄さを駆り立てるだけでなく、hvilyuvatisyaを行う必要があります。 技術的には暗号化と重複しないが、アドオンの重要な機能の仕事。

そして今、すべて同じ

PHPで使用されるPRNGバリアントは、エントロピーの不整合の影響を受けることがわかりました(不整合を減らし、ブルートフォースを緩和するため)。 あなたは私たちの攻撃を拡大することができます:


情報を明らかにすることの多様性は、トークンを生成するこの方法で絶対に素晴らしいです。 その理由を理解するために、PHPのuniqid()関数を丁重に見てみましょう。 Її予定:


ストリーム時間に基づいて、マイクロ秒単位の一意のプレフィックス識別子を取得します。


ご存知のように、エントロピーは無意味な世界の終わりです。 情報の開示の多様性を通じて、mt_rand()によって生成される値を変えることが可能であり、その結果、一意のプレフィックス識別子としてのmt_rand()変数はnullnullityを追加します。 アプリケーションには、uniqid()に対する他のタイプの入力が1つだけあります-1時間です。 エール、それは間違いなく見えないわけではありません。 直線的に変化し、やり過ぎです。 そして、譲受人のために、低いエントロピーを盗みます。


明らかに、表示は「マイクロ秒」、つまり数百万分の1秒です。 Tseは私たちに1,000,000の可能な数を与えます。 ここでは、1秒を超える値を無視します。その分数のシャードとスケーリングが非常に大きいため(たとえば、出力のHTTP Dateヘッダー)、何も表示されません。 まず、詳細を詳しく見ていきましょう。uniqid()関数を調べて、コードを見てみましょう。


gettimeofday((struct timeval *)&tv、(struct timezone *)NULL); sec =(int)tv.tv_sec; usec =(int)(tv.tv_usec%0x100000); / * usecの最大値は0xF423Fであるため、*usecsに勝つことができるのは5つの16進数のみです。 * / if(more_entropy)(spprintf(&uniqid、0、 "%s%08x%05x%.8F"、prefix、sec、usec、php_combined_lcg(TSRMLS_C)* 10);)else(spprintf(&uniqid、0、 "% s%08x%05x "、prefix、sec、usec);)RETURN_STRING(uniqid、0);

少し滑らかすぎるように見えますが、古き良きPHPですべてを複製できます。


function unique_id($ prefix = ""、$ more_entropy = false)(list($ usec、$ sec)= explode( ""、microtime()); $ usec * = 1000000; if(true === $ more_entropy)( return sprintf( "%s%08x%05x%.8F"、$ prefix、$ sec、$ usec、lcg_value()* 10);)else(return sprintf( "%s%08x%05x"、$ prefix、$ sec、$ usec);)))

このコードは、パラメーターのない単純なuniqid()wikiが13文字の行に変換するコードに関するものです。 最初の8文字は、現在のUnixタイムタグ(秒単位)であり、16番目の形式で表されます。 残りの5文字は、16番目の形式の追加のマイクロ秒です。 言い換えると、基本のuniqid()関数は、システムクロックがさらに正確であることを保証します。これは、次のようなコードを支援するために、単純なuniqid()wikiから取得できます。


$ id = uniqid(); $ time = str_split($ id、8); $ sec = hexdec("0x"。$time); $ usec = hexdec("0x"。$time); echo "Seconds:"、$ sec、PHP_EOL、 "Microseconds:"、$ usec、PHP_EOL;

Cコードを見てください。 週末のデータの正確なシステム時間は、パラメーターに関係なく、決して固定されていません。


echo uniqid()、PHP_EOL; // 514ee7f81c4b8 echo uniqid( "prefix-")、PHP_EOL; //プレフィックス-514ee7f81c746echouniqid( "prefix-"、true)、PHP_EOL; //プレフィックス-514ee7f81c8993.39593322

ブルートフォースの一意の識別子

しばらくすると、悪意のある人にuniqid()の意味を明らかにすることが、情報を明らかにすることの潜在的な了解度のもう1つの例であることが明らかになります。 正確なシステムクロックを一周します。これを使用して、離れたuniqid()呼び出しの入力データを予測できます。 これは、マイクロ秒を予測しようとするときに非難されるジレンマを克服するのに役立ちます。これは、より大きく、より狭い範囲までのサウンドの1,000,000の可能性です。 後でこのターンについて推測できる場合は、私たちのお尻では技術的には必要ありません。 元のuniqid()トークンコードをもう一度見てみましょう。


$ token = hash( "sha512"、uniqid(mt_rand()));

このため、ルート値に対するmt_rand()攻撃を一度に打ち負かして、uniqid()で情報を明らかにすると、SHA512ハッシュの比較的小さなセットを計算できることを理解しようとしています。重要なパスワードドロップまたはトークンによって。 uniqid()を使用してシステムクロッククロックを変更せずに広範囲のタイムスタンプが必要な場合は、HTTP日付ヘッダーを鳴らすようにサーバーのメッセージを解析します。 正確なサーバータイムスタンプを取得できます。 そして、このエントロピーの方法でのシャードは、マイクロ秒の100万を超える可能な値であり、数秒でブルートフォース攻撃を行うことができます!


なぜエントロピーの増加について私たちに嘘をついているのですか?

最後に、別の関数パラメーターをTRUEに設定することにより、uniqid()にエントロピーを追加できます。


Cコードを照合する方法、内部関数php_combined_lcg()からの新しいエントロピーハック出力データ。 この関数は、PHPで変換されたuniqid()関数を使用しているため、ヘルパー関数lcg_value()の後ろのスペースに表示されます。 実際、他の値から削除された2つの線形合同ジェネレーターの助けを借りて生成された2つの値を組み合わせています。 以下は、cob値のジェネレーターで提供されているコード表現です。 mt_rand()と同様に、悪臭はスキンPHPプロセスごとに1回生成され、今後のすべてのWikiで頻繁に繰り返されます。


static void lcg_seed(TSRMLS_D)/ *(((* /(struct timeval tv; if(gettimeofday(&tv、NULL)== 0))(LCG(s1)= tv.tv_sec ^(tv.tv_usec)<<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; }

長い間見ていて、モニターに投げたいのなら、それ以上は必要ありません。 道路を監視します。


cob値をgettimeofday()関数にオフセットして、Unixエポック(サーバー年より前)からのストリーム時間を秒とマイクロ秒で保存します。 プロンプトが出力コードに実装されるように指定する必要があります。これにより、プロンプト間のmicrosecond()識別子の値が最小になり、入力する必要のある重要でないものが減ります。 別の一般的な値もスレッドプロセスIDに表示されます。これは、ほとんどのLinuxカーネルが32768をオーバーライドできません。明らかに、/ proc / sys / kernel / pid_maxを変更することで、コードンを手動で約400万までプッシュできますが、そうではありません。大したこと。


エントロピーの最初の外出には、vikoristovuvane tsimi LCG、ceマイクロ秒。 たとえば、古いmt_rand()値を覚えていますか? それがどのように計算されるかを推測します。


#ifdef PHP_WIN32 #define GENERATE_SEED()(((long)(time(0)* GetCurrentProcessId()))^((long)(1000000.0 * php_combined_lcg(TSRMLS_C))))#else #define GENERATE)(time(0) * getpid()))^((long)(1000000.0 * php_combined_lcg(TSRMLS_C))))#endif

Tseは、PHPで勝利するすべての穂軸の意味が相互に依存していることを意味します。 Navіtkіlkarazіvzmіshuyutsyavhіdnіデータ。 おそらく、私たちがもっと議論したように、穂軸のマイクロ秒の範囲を狭めることができます:2つの飲み物の助けを借りて、最初の飲み物を秒の間に壊す必要がある場合(したがって、マイクロ時間は0 +次のC週のgettimeofdayの時間になります( ))。 他のgettimeofday()サイクル間のデルタをマイクロ秒単位で計算して、終了コードにアクセスできるようにすることができます(PHPコードを手に入れることができます)。 総当たり攻撃でmt_rand()cob値が、オフライン検証を実行できる最終的なcob値を与えることを気にしないでください。


ただし、主な問題はphp_combined_lcg()にあります。 lcg_value()関数の下位実装は、スキンPHPプロセスごとに1回値を取得するため、非常に制限されています。 そして、その意味がわかれば、日付を転送することができます。 rozgryzti tseyポットのように-それだけで、グリストは完成しました。

プログラムは誰のために...

実践的なスピーチに少し敬意を払ったので、もう一度それらに目を向けましょう。 php_combined_lcg()と組み合わせた2つのcob値を取得するのはそれほど簡単ではありません。可能ですが、すぐに整理することはできません。 lcg_value()関数は非常に小さいことで有名であり、プログラマーは、PHPが行うPRNGが必要な場合、mt_rand()に依存することがよくあります。 lcg_value()の値ループを失いたくありません。そうしないと、関数は人気がありません。 コンボLCGのペアは、cob値を生成する機能も表していません(したがって、wikiをmt_srand()で見て、cob値を作成するための間違ったメカニズムを見つけて、そのレガシーコードからドロップすることはできません) 。 ただし、ブルートフォースcob値(PHPのセッション識別子)のデータを誤って提供しているため、それだけの価値はありません。


spprintf(&buf、0、 "%.15s%ld%ld%0.8F"、remote_addr?remote_addr: ""、tv.tv_sec、(long int)tv.tv_usec、php_combined_lcg(TSRMLS_C)* 10);

このコードは、セッションID、ウィンクIP、タイムスタンプ、マイクロ秒、およびphp_combined_lcg()の出力データのプレハッシュ値を生成します。 Vrahovyuchiは、マイクロアワー機能の数を削減しました(コードは、ID生成に1つ、php_combined_lcg()に2つ必要であり、それらの差を最小限に抑えるために)、ブルートフォースを回避できるようになりました。 まあ、多分。


PHPは、session.entropy_fileおよびsession.entropy_lengthの新しいセッションオプションをサポートするようになりました。 これは、ブルートフォースセッションIDを回避するために行われます。その時点で、php_combined_lcg()LCGジェネレーターを使用して2つのcob値を取得してそれらを組み合わせることができます(1年はかかりません)。 PHP 5.3以下を微調整している場合は、いくつかのオプションを誤って設定している可能性があります。 そして、tseは、情報開示の異なるコアコンテンツの存在を意味します。これにより、セッションIDを総当たり攻撃して、LCGの初期値を削除できます。


同様のオプションについては、LCG値を計算できるWindowsアドオンを使用してください。


そういえば、LCGの状態を知ることで、mt_rand()がランダムな値をとる方法を理解できます。これは、mt_rand()値のエラーを回避するもう1つの方法です。


uniqid()値にエントロピーを追加するという観点から、それはすべてどういう意味ですか、それらは何を回転させますか?


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

潜在的な不整合の非定常エントロピーの別の例。 ターンのエントロピーに頼ることはできません(彼らを罵倒してはいけません!)。 セッションIDに関する情報のラウンド後、攻撃者はIDに追加されたエントロピー値を転送できます。


誰に電話すればいいの? Xアドオンがuniqid()に依存しているが、同じサーバー上の別のアドオンが内部LCG状態のループを許可している場合は、両方の状況でそれを使用する必要があります。 Korhuvachi Misa ButiVichetnі、Scho Cechi Vicorovyovyt Dili Visuka Eventropi、SudneyMoviestniRosumіti、SchoїxMethodsGeneral Einuavane VipadkovichZistaはVistarєEventropіїではありません。

エントロピーのように見えます

PHP自体は、強力なエントロピーを生成するようには構築されていません。 強力なエントロピージェットの上にあるオペレーティングシステムと同等のPRNGジェネレーターからデータを転送するための基本的なAPIはありません。 したがって、opensslおよびmcrypt拡張機能のオプションのオープン性に依存する必要があります。 悪臭を放つプロポニュユットは、サッキーでペレドバチュバニーの低エントロピーの親戚のために豊かに美しいように機能します。


残念ながら、侮辱の破片はオプションです。そのような場合、最後の大きな境界として弱いエントロピーに頼るしかありません。 もしそうなら、重要でない補足コアの助けを借りて、mt_rand()の弱いエントロピーを補足する必要があり、これらのデータを単一のプールに粉砕し、そこから疑似暴力バイトを引き出すことができます。 同様のバイパージェネレーターは、強力なエントロピーの一種のバイコリストミキサーであり、EntonFerraraによってRandomLibライブラリにすでに実装されています。 Axis schoに続いて、プログラマーのために働く能力。


フォールディング数学変換のハッシュの助けを借りて、エントロピーの弱点を簡単につかむことができます。 それでも、ワインは意味の最初の穂軸によって認識されるので、悪を行う者を繰り返します。 Podіbnіはより少ないtrohizbіlshatobsjagbruteforsіを狡猾にしています。 忘れないでください:エントロピーが少なく、重要性が少ない。 無知が減り、力ずくの能力が減ります。 唯一の本当の解決策は、あなた自身の手段で勝利のエントロピーのプールを増やすことです。


RandomLibライブラリは、攻撃者が使用する必要がある場合があるため、エントロピーのさまざまなソースからのデータと情報のローカリゼーションを混合する方法でランダムバイトを生成します。 たとえば、mt_rand()、uniqid()、lcg_value()の出力データを変更したり、PIDを追加したり、メモリを節約したり、マイクロアワーを増やしたり、$ _ ENV、posix_times()をシリアル化したりできます。RandomLibを展開します。 マイクロ秒単位でデルタを打ち負かすことができます(hash()サイクルで疑似波長入力データを処理するのに必要なマイクロ秒数を把握するため)。

タグを追加する

要素を選択(11)

私はそれらの配列を持っています$ran= array(1,2,3,4);

この配列の活力を取り除き、変化からヨガを救う必要がありますが、どうすればそれを成長させることができますか?

回答

私は@ÓlafurWaage関数に基づいて意見を述べています。 vikoristati yogoを試しましたが、回転するオブジェクトを変更しようとすると、既存の問題で立ち往生しています。 そのターンを助けに送るための新しい関数を追加しました。 新機能:

関数&random_value(&$ array、$ default = null)($ k = mt_rand(0、count($ array)-1); if(isset($ array [$ k])))(return $ array [$ k] ;)else(return $ default;))

otrimannyaの追加情報div。 「オブジェクトに送信された転送/リターン+オブジェクトの変更」の配布での私の力は機能しません

$ value = $ array;

次に示すように、array_rand関数を使用して、配列からランダムなキーを選択できます。

$ array = array( "one"、 "two"、 "three"、 "four"、 "five"、 "six"); エコー$配列;

または、rand関数とcount関数を使用して、ランダムなインデックスを選択できます。

$ array = array( "one"、 "two"、 "three"、 "four"、 "five"、 "six"); エコー$配列;

$ random = $ ran;

関数のように、値が必要なようにとても美しいです

関数random_value($ array、$ default = null)($ k = mt_rand(0、count($ array)-1); return isset($ array [$ k])?$ array [$ k]:$ default;)

チーはあなたの選択かもしれません-安全の遺産のように? それ以外の場合は、random_int()とarray_keys()を切り替えます。 (random_bytes()-PHP 7の場合のみですが、PHP 5の場合は新しいフィールドです)。

関数random_index(array $ source)($ max = count($ source)-1; $ r = random_int(0、$ max); $ k = array_keys($ source); return $ k [$ r];)

Zastosuvannya:

$ array = ["apple" => 1234、 "boy" => 2345、 "cat" => 3456、 "dog" => 4567、 "echo" => 5678、 "fortune" => 6789]; $ i = random_index($ array); var_dump([$ i、$ array [$ i]]);

関数array_random($ array、$ amount = 1)($ keys = array_rand($ array、$ amount); if($ amount == 1)(return $ array [$ keys];)$ results =; foreach($ keys as $ key)($ results = $ array [$ key];)return $ results;)

Zastosuvannya:

$ items = ["foo"、 "bar"、 "baz"、 "lorem" => "ipsum"]; array_random($ items); // "bar" array_random($ items、2); // ["foo"、 "ipsum"]

デカールノート:

  • $ amountはcount($ array)以下です。
  • array_rand()はキーをシャッフルしないため(PHP 5.2.10以降、div)、選択する要素は常に元の順序になります。 必要に応じてshuffle()にチェックマークを付けます。

編集: Laravelの機能は、何年にもわたって指数関数的に成長しました、div。 Laravel 5.4 "s Arr :: random()。

関数array_random($ array、$ number = null)($ requested =($ number === null)?1:$ number; $ count = count($ array); if($ requested> $ count)(throw new \ RangeException( "($ requested)アイテムをリクエストしましたが、使用できるアイテムは($ count)のみです。");)if($ number === null)(return $ array;)if((int)$ number == = 0)(return;)$ keys =(array)array_rand($ array、$ number)$ results =; foreach($ keys as $ key)($ results = $ array [$ key];)return $ results;)

ハイライトのデッキ:

  • 利用可能なアイテムを拾わないので、vinyatokを一掃します
  • array_random($ array、1)1つの要素で配列を回転します(#19826)
  • サブトリム値は、要素数の「0」です(単純で単純ではありません)。

Vipadkovі番号-セキュリティシステムのコストとして、プログラミングの価格nevid'mna部分。 たとえば、vipadkovyhの意味の生成には暗号化が使用されるため、数値を転送することはできません。 もちろん、PHPでは、変数番号が大きな役割を果たします。それらの助けを借りて、トークンやその他の値を生成できます。

乱数の生成は、特別なアルゴリズムに基づいています。 入力パラメータは、アルゴリズムの想定内容によっては値が異なる場合があるため、事前に割り当てられています。

この記事では、vipadkovіの数について説明します。悪臭がどのように生成され、deїхを捕まえることができるかです。

Wikoristanyavipadkovyh番号

PHPにはかなりの数の数字があり、大きな役割を果たしています。 多くの場合、他の目的のためにvikoristovuyutsya。 基本的に、悪臭は安全性に関連しています。 それらに基づいて、CSRFトークン、APIキー、認証用の値、パスワードドロップ用の値などが生成されます。 すべてが恐れられるので、意味を取り除くことは不可能です。

最も重要なのは、vipadkovyhの意味のstosuvanyaを適用することです。

  • 暗号化のための塩の生成-原則として、「1つのベックで」暗号化するため、およびパスワードをハッシュするために獲得するソルトの数よりも多い。 Tse vipadkoveは、暗号化の初期化のベクトルとしてvikoristovuєtsyaを意味します。
  • セッションIDなどの特定の値の生成-多数のプログラムを作成するためのPHPvikoristovuєtsya、そもそもセキュリティを強化します。 豊富な機能は、セッションとセッションIDの生成を備えたロボットに基づいています。
  • 転送できない認証用のトークンの生成-多くのPHPプログラムは、特別なAPIインターフェースを介して他のシステムを備えたロボットに基づいています。 APIを呼び出す前に認証プロセスを実行する必要があるようです。 選択することが重要な値を使用します。トークンの場合はさらに複雑になります。 このため、これらの問題の数は異なります。

Vipadkovy数ジェネレータ

上記のvipadkovі番号、vipadkiのscho vykoryvayutsya、PHPは疑似ジェネレーターによって生成されます。 Usyєkіlkaalgorithmіv:

    異なる関数lcg_value()を使用した線形合同法。

    メルセンヌの渦は、mt_rand()関数によってねじれています。

    rand()関数。これはmovC関数に似ています。

実際、これらの関数は直立した数字ではなく、直立した数字のように配置された数字になります。 これらの数値のシーケンスは、実装されたアルゴリズムの中央の基本小数に配置する必要があります。

発電機の基数

基数またはそのような数のベクトルは、vipadkovyh数を作成するために使用されるデータのセットです。 vipadkovyh数の疑似生成元は機能しますが、それはそれらの中でのみ機能します。 悪意のある人が基数を知っている場合、将来、彼はあなたのvipadkovy番号の意味を転送することができます。

PHPでは、2つの方法でベース番号を設定できます。 1つ目は、ツイスト関数mt_srand()です。 この方法は、vipadicシリーズの単体テストで最も重要な勝利を収めています。 もう1つの方法は、PHPに基数自体を生成する権利を与えることです。 バージョン4.2から、PHPはそれができるようになり始めています。 vipadkovyh番号を生成するためのナダルは、タスクVihorMersenneになります。

PHPは、オペレーティングシステムに基づいて休閑の基本数を生成します。 Linuxプラットフォームでは、/ dev / urandomでmcrypt_create_iv()またはopenssl_pseudo_random_bytes()を使用できます。 Windowsには、openssl_pseudo_random_bytes()およびmcrypt_create_iv()関数を介してアクセスできる特別な疑似ジェネレーターが用意されています。

ポッドバッグ

Oscilkivipadkovіの番号はpobudovіの安全なWebアドオンで大きな役割を果たします。それなら、pratsyutを悪臭を放つ人々についてもっと知る必要があります。 疑似ジェネレーターの基数を生成する場合は、メソッドの優位性を利用してやりすぎてください。

rand(1、N)ale crim array(a、b、c、..)

すでに関数とは何ですか、独立して実装する必要があるものがわかりません(のように?)?

アップデート

多数の世界がアレイを除外したという事実に関係なく、ソリューションの資格はゴールドである可能性があります。

vbudovanoї機能はありません、エール・ヴィ あなたはできる zrobiti tse:

関数randWithout($ from、$ to、array $ exceptions)(sort($ exceptions);//breakを使用できます;foreachで確実に$number= rand($ from、$ to --count($ exceptions)); / /またはmt_rand()foreach($ exceptions as $ exception)(if($ number> = $ exception)($ number ++; //ギャップを埋める)else / * if($ number< $exception)*/ { break; } } return $number; }

それは私の頭の中ではないので、勝利を収めて磨くことができますが、それを受け入れると、仮想的に、無限のサイクルを持つシナリオで意見を述べることはできません。

ノート:関数は$exceptionsとして壊れます vicerpuєあなたの範囲-たとえば、wiki randWithout(1、2、array(1,2))またはrandWithout(1、2、array(0,1,2,3))は(明らかに)合理的なものを何も与えませんが、それは変わります数字は$from-$toの範囲になるので、彼をいじめるのは簡単です。

また、$ exceptionsはすでにソートされていることが保証されています。sort($ exceptions); 没収される可能性があります。

目の保養:Descho最小視覚化アルゴリズム。

これは意図した機能ではないと思います。 あなた、mabut、たまたま自分でヨガをコーディングしています。

コーディングするには、2つの解決策があります。

  • winが正しい値になるまで、ループを循環してrand()またはmt_rand()を呼び出します
    • 毎週のランド()スプラットrazіvはどういう意味ですか
    • Nが大きく、豊富な値がない場合、aletseは正常である可能性があります。
  • 法的な重要性が低いと報復するアレイを作成する
    • Іバイコリスト array_rand 1つの値を選択するには
    • これはpratsyuvati正常になりますが、これは小さいNです

あなたが必要としているものと、なぜこの子供が代わりになることができるのかという観点から休耕してください。

$ numbers = array_diff(range(1、N)、array(a、b、c)); //どちらか(実際の信号ではありませんが、状況に応じてねじることができます)shuffle($ numbers); // $ numbersは、関心のあるすべての数値を含むランダムに並べ替えられた配列になりました//または:$ x = $ numbers; // $ xは、関心のある一連の数値から選択された乱数になりました。

このように、潜在的な数値のセットを一度に生成する必要はなく、一度に数値のセットを生成してから、同じセットから多数のvipadic番号を選択する場合は、良い方法で行うことができます。

最も簡単な方法...

欠落している場所の配列を計算する必要があります。これにより、中断されていない配列M = N-#の例外で欠落している位置を選択し、開口部のある前の配列で簡単に視覚化できます。 時間とスペースが必要な人にとっては、これは失われたアレイに適しています。 私は最初からphpを知らないので、sing-psudoのコード例をテキストで送信したいと思います。

  1. 新しい配列Offsetを作成してから、例外の配列を作成します。
  2. in Offset [i]は、最初のインデックスを明らかに空でない配列に保存します。これは、外側の配列のbi要素をスキップします。
  3. vipadical要素を選択します。 欠落している要素の0..M個のvipad番号rを選択します。
  4. iを見つけるOffset[i]<= r < Offest это легко с бинарным поиском
  5. r+iを回します

さて、スケッチだけの場合は、配列を並べ替える必要がありますが、それでも0または1の形式で、あらゆる種類のジャズでインデックスを作成できます。 賢い場合は、実際には元の配列と少し同じようにオフセット配列を変更できますが、少し賢明ではありません。

おそらく、vidpovidiには少し遅すぎますが、ここでのコードを知っています。ワイン番号について、vypadkovy識別子に基づいてデータベースからデータを取得しようとしています。

$ excludedData = array(); //これは除外された番号です$maxVal= $ this-> db-> count_all_results( "game_pertanyaan"); //データベースに基づいて最大数を取得します$randomNum= rand(1、$ maxVal); //最初の開始を行います。これをwhile>in_arrayパラメータに直接配置できると思います。semも機能します。while(in_array($ randomNum、$ excludedData))($ randomNum = rand(1、$ maxVal );)$randomNum;//選択した数値を除く乱数

©2022androidas.ru-Androidのすべて