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