Вот мини регистрация: Код (Text): <?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> есть ли тут уязвимость
похоже ты не указал начало строки ^ чтобы регулярное выражение проверяло всю строку полностью, а не только часть которая попадает под regex
возможно Код (Text): if ( !preg_match( '~^[a-zа-я0-9]{4,12}$~iuD' , trim($login) ) ) { return "Логин содержит не допустимые символы или не верной длинны(можно от 4 до 12 смиволов)"; } и верно, но я писал про utf впринцепе