Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

random_bytes_dev_urandom.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 4.44 KiB


 001  <?php
 002  /**
 003   * Random_* Compatibility Library 
 004   * for using the new PHP 7 random_* API in PHP 5 projects
 005   * 
 006   * The MIT License (MIT)
 007   * 
 008   * Copyright (c) 2015 Paragon Initiative Enterprises
 009   * 
 010   * Permission is hereby granted, free of charge, to any person obtaining a copy
 011   * of this software and associated documentation files (the "Software"), to deal
 012   * in the Software without restriction, including without limitation the rights
 013   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 014   * copies of the Software, and to permit persons to whom the Software is
 015   * furnished to do so, subject to the following conditions:
 016   * 
 017   * The above copyright notice and this permission notice shall be included in
 018   * all copies or substantial portions of the Software.
 019   * 
 020   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 021   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 022   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 023   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 024   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 025   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 026   * SOFTWARE.
 027   */
 028   
 029  if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
 030      define('RANDOM_COMPAT_READ_BUFFER', 8);
 031  }
 032   
 033  /**
 034   * Unless open_basedir is enabled, use /dev/urandom for
 035   * random numbers in accordance with best practices
 036   * 
 037   * Why we use /dev/urandom and not /dev/random
 038   * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
 039   * 
 040   * @param int $bytes
 041   * 
 042   * @throws Exception
 043   * 
 044   * @return string
 045   */
 046  function random_bytes($bytes)
 047  {
 048      static $fp = null;
 049      /**
 050       * This block should only be run once
 051       */
 052      if (empty($fp)) {
 053          /**
 054           * We use /dev/urandom if it is a char device.
 055           * We never fall back to /dev/random
 056           */
 057          $fp = fopen('/dev/urandom', 'rb');
 058          if (!empty($fp)) {
 059              $st = fstat($fp);
 060              if (($st['mode'] & 0170000) !== 020000) {
 061                  fclose($fp);
 062                  $fp = false;
 063              }
 064          }
 065   
 066          if (!empty($fp)) {
 067              /**
 068               * stream_set_read_buffer() does not exist in HHVM
 069               * 
 070               * If we don't set the stream's read buffer to 0, PHP will
 071               * internally buffer 8192 bytes, which can waste entropy
 072               * 
 073               * stream_set_read_buffer returns 0 on success
 074               */
 075              if (function_exists('stream_set_read_buffer')) {
 076                  stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
 077              }
 078              if (function_exists('stream_set_chunk_size')) {
 079                  stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
 080              }
 081          }
 082      }
 083   
 084      try {
 085          $bytes = RandomCompat_intval($bytes);
 086      } catch (TypeError $ex) {
 087          throw new TypeError(
 088              'random_bytes(): $bytes must be an integer'
 089          );
 090      }
 091   
 092      if ($bytes < 1) {
 093          throw new Error(
 094              'Length must be greater than 0'
 095          );
 096      }
 097   
 098      /**
 099       * This if() block only runs if we managed to open a file handle
 100       * 
 101       * It does not belong in an else {} block, because the above 
 102       * if (empty($fp)) line is logic that should only be run once per
 103       * page load.
 104       */
 105      if (!empty($fp)) {
 106          $remaining = $bytes;
 107          $buf = '';
 108   
 109          /**
 110           * We use fread() in a loop to protect against partial reads
 111           */
 112          do {
 113              $read = fread($fp, $remaining); 
 114              if ($read === false) {
 115                  /**
 116                   * We cannot safely read from the file. Exit the
 117                   * do-while loop and trigger the exception condition
 118                   */
 119                  $buf = false;
 120                  break;
 121              }
 122              /**
 123               * Decrease the number of bytes returned from remaining
 124               */
 125              $remaining -= RandomCompat_strlen($read);
 126              $buf .= $read;
 127          } while ($remaining > 0);
 128          
 129          /**
 130           * Is our result valid?
 131           */
 132          if ($buf !== false) {
 133              if (RandomCompat_strlen($buf) === $bytes) {
 134                  /**
 135                   * Return our random entropy buffer here:
 136                   */
 137                  return $buf;
 138              }
 139          }
 140      }
 141   
 142      /**
 143       * If we reach here, PHP has failed us.
 144       */
 145      throw new Exception(
 146          'Error reading from source device'
 147      );
 148  }
 149