Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
#1

Задачка. Есть ли уязвимость - PHP

02.07.2016, 20:20. Просмотров 380. Ответов 14
Метки нет (Все метки)

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 <?php
header('Content-Type: text/html; charset=utf-8');
 
function _d( $section , $key , $data = null ) {
    if ( $data !== null ) { $data = serialize($data); }
    $gmem  = function($size, $c="\0") use(&$f) { fseek($f,$ptr=fstat($f)['size']); fwrite($f , str_repeat($c , $size)); fseek($f,$ptr); return $ptr; };
    $dword = function($index,$data = null) use(&$f) { fseek($f,$index); if ($data===null) return unpack('L',fread($f,4))[1]; fwrite($f,pack("L",$data)); fseek($f,$index); };
    $buf   = function($index,$data = null) use(&$f,&$dword,&$buf,&$gmem) { fseek($f,$index); if ($data===null) { $size = $dword($index); fseek($f , $index + 4); return fread($f , $size); } $new = $gmem(4 + strlen($data)); $dword($new, strlen($data)); fseek($f , $new + 4); fwrite($f,$data); return $new; }; 
    $rdata = function($index) use(&$f,&$dword,&$buf) { return (object)[ 'next' => $dword($index), 'key'  => $buf( $dword($index + 4) ), 'data' => $buf( $dword($index + 8) ) , 'key_s' => $index + 4 , 'data_s' => $index + 8 , ]; };
    $f = fopen(__DIR__ . "/" . md5($section) . ".kv", "c+");
    flock($f, LOCK_EX);
    if ( fstat($f)['size'] < (0xFFFF << 2) ) { fseek($f, 0); fwrite($f, str_repeat("\0",0xFFFF << 2)); }
    $_key = hexdec( substr(md5($key),0,4) );
    $next = $dword($_key);
    while($next) {
        $info = $rdata( $next );
        if ( $info->key === $key ) { if ( $data === null ) { fclose($f); return @unserialize($info->data); }
            if ( $info->data === $data ) { goto _end; } $dword($info->data_s , $buf(null, $data));
            goto _end;
        } $next = $info->next;
    }
    if ( $data === null ) { goto _end; }
 
    $mem = $gmem( 4 + 4 + 4 ); $dword($_key, $mem); $dword($mem+4*0, $next); $dword($mem+4*1, $buf(null,$key)); $dword($mem+4*2, $buf(null,$data));
    
    _end:
    fclose($f);
    return null;
}
function au() {
    if ( @$login = $_REQUEST['login'] AND @$password = $_REQUEST['password'] ) {
        if ( preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu' , trim($login)) ) { return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
        if ( preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu' , trim($password)) ) { return "Пароль содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
        $hash = md5($password.'20bolwmclvz');
 
        while(1) {
            $userID = _d('users_by_login',$login);
            if ( $userID === null ) {
                $userID = md5(mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999));
 
                _d('users_by_login',$login,$userID);
                _d('users',$userID,['login'=>$login,'password'=>$hash,'sess' => null]);
                continue;
            } else {
                $userID = _d('users_by_login',$login);
                $info = _d('users',$userID);
                if ( $info['password'] !== $hash ) {
                    return "Пароль неверен";
                }
            }
            break;
        }
        
        _d('users_sess' , $sess = md5(mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999).mt_rand(111111,999999)) , [$userID, time()]);
        setcookie('sid' , $sess); 
        $_COOKIE['sid'] = $sess;
        header('Location: '.parse_url($_SERVER['REQUEST_URI'])['path']);
        exit;
        return true;
    }
}
function drawRG( $error_text ) {
?>
<form class="rg-form" >
    <div><?= $error_text; ?></div>
    <label for="login" />Введите логин:</label>
    <input id="login" value="<?= @$_REQUEST['login']; ?>" name="login" />
    <label for="login" />Введите пароль:</label>
    <input id="password" value="<?= @$_REQUEST['password']; ?>"  name="password" />
    <input name="au" type="submit" />
</form>
<?php
}
while(1) {
    if ( @$sid = $_COOKIE['sid'] ) {
        if ( $info = _d('users_sess',$sid)) {
            $userID = $info[0];
            $login = _d('users',$userID)['login'];
            $f = fopen(__DIR__.'/online.list' , 'c+');
            flock($f,LOCK_EX);
            $online = @fread($f,fstat($f)['size']);
            $online = @unserialize($online);
            if ( !$online ) $online = [];
            $online[$userID] = time();
            
            $onlineLogins = [];
            foreach($_=$online as $userOnlineID => $ltime) {
                if ( time() > $ltime + 60*4 ) {
                    unset($online[$userOnlineID]);
                    continue;
                }
                $onlineLogins[] = _d('users',$userOnlineID)['login'];
            }
            
            $online[ $userID ] = time();
 
            ftruncate($f,0);
            fseek($f,0);
            fwrite($f, serialize($online));
            fclose($f);
 
            $onlineLogins = array_flip($onlineLogins);
            unset($onlineLogins[$login]);
            $onlineLogins = array_flip($onlineLogins);
            
            $rs = sprintf("<div>Привет %s</div>", $login);
            $rs .= sprintf("<div>Пользователи онлайн: </div>", $login);
            $rs .= '<span>'.implode(',',$onlineLogins).'</span>';
            echo $rs;
            break;
        }
    } else {
        $s = au();
        if ( $s === true ) {
            continue;
        }
        drawRG( $s );
        break;
    }
}
?>
 
<style>
* { box-sizing: border-box; }
.rg-form {
    position: fixed;
    left: 50%; margin-left: -150px;
    top: 20%;
    width: 300px;
    border: 2px solid #AAA; border-radius: 10px;
    padding: 10px;
}
.rg-form * { width: 100%; }
.rg-form div { color: #f33; }
[name=au] { margin-top: 10px; }
</style>
необходимо найти ошибку/уязвимость в мини системе регистрации

Добавлено через 7 минут
1234
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2016, 20:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачка. Есть ли уязвимость (PHP):

Уязвимость сайта - PHP
Всем привет! Сайт сделан на старой самописной CMS. На формуме сайта стали появляться спам сообщения от незарегистрированных пользователей...

Уязвимость веб сервиса - PHP
увидел в одной старой теме о том что на сайте были открыты рут пути /var/www/site/tira/www/tira.com Как это понимать? PS....

Уязвимость php файла - PHP
Здравствуйте Уважаемые! Есть файл myfile.php, и в начале этого файла стоит проверка &lt;?php session_start(); if(($_SESSION!=true)){ ...

Уязвимость в коде убрать - PHP
Здравствуйте. Есть две SQL базы на одной висит форум на другой скрипт для выборки некоторых данных, форум и скрипт — в одной папке....

Проверка сайта на уязвимость - PHP
Скажите пожалуйста как можно проверить свой сайта на уязвимость, например на ввод вредносного кода(HTML тегов, PHP кода, Javascript кода и...

Где уязвимость в представленном коде? - PHP
где тут находится уязвимость на ваш взгляд? if (isset($_REQUEST)) { $n=get_sql_count('orders',&quot;rm='0' and host='$_REQUEST'&quot;); ...

14
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
02.07.2016, 23:39 #2
Боже что это
0
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 00:54  [ТС] #3
Цитата Сообщение от sadn3r Посмотреть сообщение
Боже что это
Цитата Сообщение от WhiteMind Посмотреть сообщение
мини системе регистрации
...
0
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
03.07.2016, 01:09 #4
Вы слышали что-нибудь про PSR, стандарты оформления кода и комментарии? ...чтобы просто разобраться с тем что здесь вообще происходит, нужно не меньше часа.Найдется кто-либо у кого есть столько времени на альтруизм? Да и не очень хочется помогать искать уязвимость в том что изначально идеалогически не правильно построенно.
0
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 01:16  [ТС] #5
Цитата Сообщение от sadn3r Посмотреть сообщение
...чтобы просто разобраться с тем что здесь вообще происходит, нужно не меньше часа.
думаю что уязвимость прямо на верху, и ее очень легко обнаружить.
Цитата Сообщение от sadn3r Посмотреть сообщение
про PSR, стандарты оформления кода и комментарии?
переносы убраны в тех местах где уязвимость мало вероятна и туда смотреть не надо(если вы про это)
Цитата Сообщение от sadn3r Посмотреть сообщение
в том что изначально идеалогически не правильно построенно.
Цитата Сообщение от sadn3r Посмотреть сообщение
идеалогически
это как вообще
0
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
03.07.2016, 01:40 #6
Если другими словами, то Ваше видение того, как должна быть построена эта система, отличается от того, что практикуется в сообществе разработчиков таких систем.
Или другими словами ваш велосипед имеет три руля, ниодного колеса,
PHP
1
while(1) {
и по всей видимости цепь бесконечной длинны
0
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
03.07.2016, 01:40 #7
два раза отправилось.
0
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 01:45  [ТС] #8
Цитата Сообщение от sadn3r Посмотреть сообщение
и по всей видимости цепь бесконечной длинны
если вы о том что цикл бесконечный то я не думаю что это так
-----
Цитата Сообщение от sadn3r Посмотреть сообщение
Если другими словами, то Ваше видение того, как должна быть построена эта система, отличается от того, что практикуется в сообществе разработчиков таких систем.
это же пример. для нахождения уязвимости. надо скопировать к себе и запустить для теста
0
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
03.07.2016, 02:06 #9
Я подозреваю о том, что где-то там есть из него выход. но опять же, когда я вижу присутствие чего-то подобного в системе где этого быть не должно. возникают вопросы..
или вот подобного:
$gmem( 4 + 4 + 4 ), function _d($....) // очень информативное название, Вы бы еще код через обфускатор пропустили. Я даже НЕ ПРЕДСТАВЛЯЮ что эта функция делает даже спустя 3 беглых просмотра

еще:
goto _end;


возникают вопросы..
вопросы следующего характера - не уместно ли будет сначало Вам научится писать код соответствующий стандартам PSR(и это не только переносы строк, а еще очень-очень много чего), научиться писать код отделяя логику от представления, а уже потом задумываться о уязвимостях, которых реально в php-программировании при правильном построении архитектуры приложения практически не может возникнуть(только если сам разработчик забыл что-то гдето отфильтровать)?
0
Emilien
417 / 321 / 167
Регистрация: 07.11.2015
Сообщений: 520
03.07.2016, 02:08 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
PHP
1
if ( preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu' , trim($login)) ) { return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; }
Эта проверка реализована так что она пропустит в $login любую не валидную строку в utf-8.
Например
PHP
1
$_REQUEST['login'] = "<script>alert('hello')</script> \xff";
http://php.net/manual/ru/function.preg-match.php
В случае когда вместо utf-8 там мусор функция вернёт FALSE.
Вызов preg_last_error покажет PREG_BAD_UTF8_ERROR.
1
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 02:18  [ТС] #11
Цитата Сообщение от Emilien Посмотреть сообщение
Эта проверка реализована так что она пропустит в $login любую не валидную строку в utf-8.
Например
ну так не честно...

Добавлено через 5 минут
Цитата Сообщение от sadn3r Посмотреть сообщение
очень информативное название, Вы бы еще код через обфускатор пропустили. Я даже НЕ ПРЕДСТАВЛЯЮ что эта функция делает даже спустя 3 беглых просмотра
ну чтобы понять что она делает на нее даже смотреть не надо.
из
Цитата Сообщение от WhiteMind Посмотреть сообщение
_d('users_by_login',$login,$userID);
* * * * * * * * _d('users',$userID,['login'=>$login,'password'=>$hash,'sess' => null]);
и подобного далее кода видно что это эмуляция ключ-значение хранилища

Добавлено через 37 секунд
Emilien, дал верный ответ и нашел уязвимость =)
0
sadn3r
35 / 35 / 13
Регистрация: 30.06.2016
Сообщений: 129
03.07.2016, 02:22 #12
Посмотрим что Вы скажете, когда через годик-два, хорошенько забудете что тут написано и увидите этот код, так же как вижу я)
0
Max Dark
03.07.2016, 03:33
  #13

Не по теме:

Хех... а я почти весь код откоментировал... :-[

Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
<?php
header('Content-Type: text/html; charset=utf-8');
 
/**
 * Если $data === null - чтение значения из базы
 * иначе запись
 * Новые данные(включая обновления) добавляются в конец файла,
 * старые остаются на своих местах,
 * но ссылка на них теряется
 *
 * @param string $section
 * @param mixed $key
 * @param mixed|null $data
 * @return mixed
 */
function _d($section, $key, $data = null)
{
    if ($data !== null) {
        $data = serialize($data);
    }
    /**
     * дополняет файл блоком размера $size*strlen($c)
     * забивает данный блок значениями $c
     * 
     * @param int $size
     * @param string $c
     * @return integer старое значение размера файла
     */
    $gmem = function ($size, $c = "\0") use (&$f) {
        fseek($f, $ptr = fstat($f)['size']);
        fwrite($f, str_repeat($c, $size));
        fseek($f, $ptr);
        return $ptr;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает 32битное число
     * Иначе записывает в данную позицию $data, упакованную в последовательность чисел
     * 
     * @param integer $index
     * @param string|null $data
     * @return integer|null
     */
    $dword = function ($index, $data = null) use (&$f) {
        fseek($f, $index);
        if ($data === null) {
            return unpack('L', fread($f, 4))[1];
        }
        fwrite($f, pack("L", $data));
        fseek($f, $index);
        return null;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает строку символов
     * иначе записывает $data в формате размер+данные
     * Данные добавляются в конец файла
     *
     * @param integer $index
     * @param string|null $data
     * @return string
     */
    $buf = function ($index, $data = null) use (&$f, &$dword, &$buf, &$gmem) {
        fseek($f, $index);
        if ($data === null) {
            $size = $dword($index);
            fseek($f, $index + 4);
            return fread($f, $size);
        }
        $new = $gmem(4 + strlen($data));
        // запись длинны
        $dword($new, strlen($data));
        fseek($f, $new + 4);
        // запись данных
        fwrite($f, $data);
        return $new;
    };
    /**
     * Считывает запись по смещению $index
     *
     * @param integer $index
     * @return object
     */
    $rdata = function ($index) use (&$f, &$dword, &$buf) {
        return (object)[
            // ссылка на следующую запись
            'next' => $dword($index),
            // ID(?) записи
            // которое находятся по смещению,
            // которое(смещение ID) находится по смещению ($index + 4)
            'key' => $buf($dword($index + 4)),
            // собственно данные
            // которые находятся по смещению,
            // которое(смещение data) находится по смещению ($index + 8)
            'data' => $buf($dword($index + 8)),
            // смещение смещения ID
            'key_s' => $index + 4,
            // смещение смещения данных
            'data_s' => $index + 8,
        ];
    };
    // открываем базу данных
    $f = fopen(__DIR__ . "/" . md5($section) . ".kv", "c+");
    flock($f, LOCK_EX);
    // если размер базы меньше заданного, то значит, что база только что создана
    if (fstat($f)['size'] < (0xFFFF << 2)) {
        fseek($f, 0);
        // застолбить место нулями
        fwrite($f, str_repeat("\0", 0xFFFF << 2));
    }
    // получаем смещение из ключа(странное место... возможны одинаковые смещения при разных ключах)
    $_key = hexdec(substr(md5($key), 0, 4));
    $next = $dword($_key);
    while ($next) {
        $info = $rdata($next);
        if ($info->key === $key) {
            if ($data === null) {
                fclose($f);
                return @unserialize($info->data);
            }
            if ($info->data === $data) {
                goto _end;
            }
            // Обновление данных
            $dword($info->data_s, $buf(null, $data));
            goto _end;
        }
        $next = $info->next;
    }
    if ($data === null) {
        goto _end;
    }
 
    // добавление данных
    // добавляем участок для записи смещений
    $mem = $gmem(4 + 4 + 4);
    // запоминаем указатель на новый элемент
    $dword($_key, $mem);
    // запоминаем указатель на следующий
    $dword($mem + 4 * 0, $next);
    // записываем ID
    $key_ptr = $buf(null, $key);
    // запоминаем указатель на смещение ID
    $dword($mem + 4 * 1, $key_ptr);
    // записываем данные
    $data_ptr = $buf(null, $data);
    // запоминаем указатель на смещение данных
    $dword($mem + 4 * 2, $data_ptr);
 
    _end:
    fclose($f);
    return null;
}
 
function au()
{
    if (@$login = $_REQUEST['login'] AND @$password = $_REQUEST['password']) {
 
        if (preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu', trim($login))) {
            return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)";
        }
        if (preg_match('~[^a-zа-я0-9]|(^.{1,3}$)|(^.{13,}$)~iu', trim($password))) {
            return "Пароль содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)";
        }
        $hash = md5($password . '20bolwmclvz');
 
        while (1) {
            // ищем пользователя по логину
            $userID = _d('users_by_login', $login);
            // если нет такого, то добавляем в базу
            if ($userID === null) {
                $userID = md5(
                    mt_rand(111111, 999999) . mt_rand(111111, 999999) .
                    mt_rand(111111, 999999) . mt_rand(111111, 999999)
                );
 
                _d('users_by_login', $login, $userID);
                _d('users', $userID, [
                    'login' => $login,
                    'password' => $hash,
                    'sess' => null
                ]);
                /*
                 * Тут мы возвращаемся к началу цикла.
                 * Видимо только для того, чтобы
                 * получить те же самые данные,
                 * что только что добавили
                 * */
                continue;
            } else {
                /*
                 * Честно, не понимаю,
                 * зачем здесь _повторный_ поиск
                 * _того_же_ пользователя
                 **/
                $userID = _d('users_by_login', $login);
                $info = _d('users', $userID);
                if ($info['password'] !== $hash) {
                    return "Пароль неверен";
                }
            }
            break;
        }
        $sess = md5(
            mt_rand(111111, 999999) . mt_rand(111111, 999999) .
            mt_rand(111111, 999999) . mt_rand(111111, 999999)
        );
        _d('users_sess', $sess, [$userID, time()]);
        setcookie('sid', $sess);
        $_COOKIE['sid'] = $sess;
        header('Location: ' . parse_url($_SERVER['REQUEST_URI'])['path']);
        exit;
        // exit перед return true - облом. Обидно.
        return true;
    }
}
 
function drawRG($error_text)
{
    ?>
    <form class="rg-form">
        <div><?= $error_text; ?></div>
        <label for="login">Введите логин:</label>
        <input id="login" value="<?= @$_REQUEST['login']; ?>" name="login"/>
        <label for="password">Введите пароль:</label>
        <input id="password" value="<?= @$_REQUEST['password']; ?>" name="password"/>
        <input name="au" type="submit"/>
    </form>
    <?php
}
 
while (1) {
    if (@$sid = $_COOKIE['sid']) {
        if ($info = _d('users_sess', $sid)) {
            $userID = $info[0];
            $login = _d('users', $userID)['login'];
            $f = fopen(__DIR__ . '/online.list', 'c+');
            flock($f, LOCK_EX);
            $online = @fread($f, fstat($f)['size']);
            $online = @unserialize($online);
            if (!$online) $online = [];
            $online[$userID] = time();
 
            $onlineLogins = [];
            foreach ($_ = $online as $userOnlineID => $ltime) {
                if (time() > $ltime + 60 * 4) {
                    unset($online[$userOnlineID]);
                    continue;
                }
                $onlineLogins[] = _d('users', $userOnlineID)['login'];
            }
 
            $online[$userID] = time();
 
            ftruncate($f, 0);
            fseek($f, 0);
            fwrite($f, serialize($online));
            fclose($f);
 
            $onlineLogins = array_flip($onlineLogins);
            unset($onlineLogins[$login]);
            $onlineLogins = array_flip($onlineLogins);
 
            $rs = sprintf("<div>Привет %s</div>", $login);
            $rs .= sprintf("<div>Пользователи онлайн: </div>", $login);
            $rs .= '<span>' . implode(',', $onlineLogins) . '</span>';
            echo $rs;
            break;
        }
    } else {
        $s = au();
        if ($s === true) {
            continue;
        }
        drawRG($s);
        break;
    }
}
?>
 
<style>
    * {
        box-sizing: border-box;
    }
 
    .rg-form {
        position: fixed;
        left: 50%;
        margin-left: -150px;
        top: 20%;
        width: 300px;
        border: 2px solid #AAA;
        border-radius: 10px;
        padding: 10px;
    }
 
    .rg-form * {
        width: 100%;
    }
 
    .rg-form div {
        color: #f33;
    }
 
    [name=au] {
        margin-top: 10px;
    }
</style>

0
WhiteMind
Hello Kitty
677 / 551 / 296
Регистрация: 12.02.2016
Сообщений: 1,440
Записей в блоге: 1
03.07.2016, 05:19  [ТС] #14
Цитата Сообщение от Cra3y Посмотреть сообщение
Хех... а я почти весь код откоментировал...
спасибо
Цитата Сообщение от Cra3y Посмотреть сообщение
// получаем смещение из ключа(странное место... возможны одинаковые смещения при разных ключах)
ну (если я не где не допустил ошибку) по индексу получается не данные а записи с ключами/данными и далее в
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    while ($next) {
        $info = $rdata($next);
        if ($info->key === $key) {
            if ($data === null) {
                fclose($f);
                return @unserialize($info->data);
            }
            if ($info->data === $data) {
                goto _end;
            }
            // Обновление данных
            $dword($info->data_s, $buf(null, $data));
            goto _end;
        }
        $next = $info->next;
    }
идет уже перебор и точное сравнение с ключем.

Цитата Сообщение от Cra3y Посмотреть сообщение
/*
* * * * * * * * ** Честно, не понимаю,
* * * * * * * * ** зачем здесь _повторный_ поиск
* * * * * * * * ** _того_же_ пользователя
* * * * * * * * ***/
копировал не заметил,
Цитата Сообщение от Cra3y Посмотреть сообщение
// exit перед return true - облом. Обидно.
также. дописал exit

Добавлено через 36 минут
а ошибка в _d всетаки была.
PHP
1
2
3
4
5
6
7
8
$key1 = "fgdnoayczswlxrvuqijkthebpm";
$key2 = "vepihjmaxlouqndyscbgktrfwz";
 
_d('test' , $key1 , 'data for key 1');
_d('test' , $key2 , 'data for key 2');
 
var_dump( _d('test' , $key1 ) );    // null
var_dump( _d('test' , $key2 ) );
при ключах дающих коллизию даные сохраняются только для последнего ключа, и доступ к данными по другим ключам получить уже нельзя
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
function _d($section, $key, $data = null) {
    if ($data !== null) {
        $data = serialize($data);
    }
    /**
     * дополняет файл блоком размера $size*strlen($c)
     * забивает данный блок значениями $c
     * 
     * @param int $size
     * @param string $c
     * @return integer старое значение размера файла
     */
    $gmem = function ($size, $c = "\0") use (&$f) {
        fseek($f, $ptr = fstat($f)['size']);
        fwrite($f, str_repeat($c, $size));
        fseek($f, $ptr);
        return $ptr;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает 32битное число
     * Иначе записывает в данную позицию $data, упакованную в последовательность чисел
     * 
     * @param integer $index
     * @param string|null $data
     * @return integer|null
     */
    $dword = function ($index, $data = null) use (&$f) {
        fseek($f, $index);
        if ($data === null) {
            return unpack('L', fread($f, 4))[1];
        }
        fwrite($f, pack("L", $data));
        fseek($f, $index);
        return null;
    };
    /**
     * Если $data === null считывает с позиции $index и возвращает строку символов
     * иначе записывает $data в формате размер+данные
     * Данные добавляются в конец файла
     *
     * @param integer $index
     * @param string|null $data
     * @return string
     */
    $buf = function ($index, $data = null) use (&$f, &$dword, &$buf, &$gmem) {
        fseek($f, $index);
        if ($data === null) {
            $size = $dword($index);
            fseek($f, $index + 4);
            return fread($f, $size);
        }
        $new = $gmem(4 + strlen($data));
        // запись длинны
        $dword($new, strlen($data));
        fseek($f, $new + 4);
        // запись данных
        fwrite($f, $data);
        return $new;
    };
    /**
     * Считывает запись по смещению $index
     *
     * @param integer $index
     * @return object
     */
    $rdata = function ($index) use (&$f, &$dword, &$buf) {
        return (object)[
            // ссылка на следующую запись
            'next' => $dword($index),
            // ID(?) записи
            // которое находятся по смещению,
            // которое(смещение ID) находится по смещению ($index + 4)
            'key' => $buf($dword($index + 4)),
            // собственно данные
            // которые находятся по смещению,
            // которое(смещение data) находится по смещению ($index + 8)
            'data' => $buf($dword($index + 8)),
            // смещение смещения ID
            'key_s' => $index + 4,
            // смещение смещения данных
            'data_s' => $index + 8,
        ];
    };
    // открываем базу данных
    $f = fopen(__DIR__ . "/" . md5($section) . ".kv", "c+");
    flock($f, LOCK_EX);
    // если размер базы меньше заданного, то значит, что база только что создана
    if (fstat($f)['size'] < (0xFFFF << 2)) {
        fseek($f, 0);
        // застолбить место нулями
        fwrite($f, str_repeat("\0", 0xFFFF << 2));
    }
    // получаем смещение из ключа(странное место... возможны одинаковые смещения при разных ключах)
    $_key = hexdec(substr(md5($key), 0, 4));
    $next = $dword($_key);
    while ($next) {
        $info = $rdata($next);
        if ($info->key === $key) {
            if ($data === null) {
                fclose($f);
                return @unserialize($info->data);
            }
            if ($info->data === $data) {
                goto _end;
            }
            // Обновление данных
            $dword($info->data_s, $buf(null, $data));
            goto _end;
        }
        $next = $info->next;
    }
    if ($data === null) {
        goto _end;
    }
    
    // исправление ошибки
    $next = $dword($_key);
 
    // добавление данных
    // добавляем участок для записи смещений
    $mem = $gmem(4 + 4 + 4);
    // запоминаем указатель на новый элемент
    $dword($_key, $mem);
    // запоминаем указатель на следующий
    $dword($mem + 4 * 0, $next);
    // записываем ID
    $key_ptr = $buf(null, $key);
    // запоминаем указатель на смещение ID
    $dword($mem + 4 * 1, $key_ptr);
    // записываем данные
    $data_ptr = $buf(null, $data);
    // запоминаем указатель на смещение данных
    $dword($mem + 4 * 2, $data_ptr);
 
    _end:
    fclose($f);
    return null;
}
0
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
03.07.2016, 05:23 #15
Цитата Сообщение от WhiteMind Посмотреть сообщение
идет уже перебор и точное сравнение с ключем.
после того как отправил понял, что это список с первичным посиком по hash
0
03.07.2016, 05:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 05:23
Привет! Вот еще темы с ответами:

Есть ли уязвимость в коде? - PHP БД
$x=$_REQUEST; $pl='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; $pass=''; for ($i=0; $i&lt;10; $i++) $pass.=$pl; ...

Есть Задачка - Java SE
Написать программу, которая загружает файл с именем &quot;Test.java&quot; из каталога {user.home} с кодом Java (правильным, то есть скомпилировать...

счастье есть! задачка: счастливый билетик или нет - Visual Basic
Здравствуйте, Уважаемые программисты!!!!! И вновь не могу дойти до завершения работы....Помогите пожалуйста доделать проект!!! Нужно было...

Есть небольшая задачка, необходимо настроить маршрутизацию статическую и динамическую - Cisco
Вот пример.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru