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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
random_bytes_dev_urandom.php
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