Как можно обойти мою защиту и что в ней есть лишнего или кривого

Статус
В этой теме нельзя размещать новые ответы.

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
$is_logged false если пользователь не авторизован.
Если пользователь авторизован, то в $is_logged все из mysql про него
site.ru?exit Это выход

в mysql столбики:
id
login
status - 0 Авторизован. 0 - не авторизован
group - 1 - посетитель. 2 - модератор. 3 - администратор
ip - две первые группы IP. Если IP пользователя 49.204.28.40 То там будет 49.204
date
password - Пароль из функции salt( $pass )

PHP:
function salt( $pass ){
    $salt = '12e0jasd()"#';
    $hash = md5( $salt . md5( trim( $pass ) . $salt ) );
    return $hash;
}
function check_captcha( $code ){
    global $_SESSION;
    if( $code == '' ){
        return array( 'mess' => 'Введите капчу', 'code' => 0 );
    }else{
        $code = trim($code);
        $cap = $_SESSION['captcha'];
        unset( $_SESSION['captcha'] );
        if ($code == $cap){
                return array( 'mess' => '', 'code' => 1 );
        }else{
            return array( 'mess' => 'Капча введена не верно', 'code' => 0 );
        }
    }
}
PHP:
if( isset( $_POST['login'] ) and isset( $_POST['pass'] ) ){
        if( isset( $_POST['captcha_code']) ){
            $captcha =check_captcha( str_replace( 0, '', $_POST['captcha_code'] ) );
            if( $captcha['code'] == 1 ){
                if( $_POST['login'] !== '' ){
                    $data = $db->query( 'SELECT * FROM `'. PREFIX .'_users` WHERE `login`="' .htmlentities( $_POST['login'] ) .'"' );
                    if( $data ){
                        $data->setFetchMode(PDO::FETCH_ASSOC);
                        $data = $data->fetch();
                        $post_pass = salt( $_POST['pass'] );
                        if( html_entity_decode( $data['password'] ) == $post_pass ){
                            if( $data['status'] == 0 ){
                                SetCookie( PREFIX .'_login', $data['login'], time()+2592000, "/");
                                SetCookie( PREFIX .'_password', $data['password'], time()+2592000, "/");
                                $ip_arr = explode( '.', $_SERVER['REMOTE_ADDR'] );
                                $query_data = array( 'status' => 1, 'ip' => $ip_arr[0]. '.' . $ip_arr[1], 'date' => $_SERVER['REQUEST_TIME']  );
                                $query = $db->prepare( 'UPDATE `'. PREFIX .'_users` SET `status`=:status, `ip`=:ip, `date`=:date WHERE `login`="'. htmlentities( $_POST['login'] ) .'"' );
                                $query->execute( $query_data );
                                $is_logged = $data;
                                $mess = '';
                                $refresh = true;
                            }else{
                                $is_logged = false;
                                $mess = 'Пользователь уже авторизован';
                            }
                        }else{
                            $is_logged = false;
                            $mess = 'Логин или пароль не верный';
                        }
                    }else{
                        $is_logged = false;
                        $mess = 'Логин или пароль не верный';
                    }
                }else{
                    $is_logged = false;
                    $mess = 'Логин не может быть пустым';
                }
            }else{
                $is_logged = false;
                $mess = $captcha['mess'];
            }
        }else{
            $is_logged = false;
            $mess = 'Введите капчу';
        }
    }else{
        if( isset( $_COOKIE[PREFIX .'_login'] ) and isset( $_COOKIE[PREFIX .'_password'] ) ){
            if( $_COOKIE[PREFIX .'_login'] !== '' ){
                $data = $db->query( 'SELECT * FROM '. PREFIX .'_users WHERE `login`="' . htmlentities( $_COOKIE[PREFIX .'_login'] ) .'"' );
                if( $data ){
                    $data->setFetchMode(PDO::FETCH_ASSOC);
                    $data = $data->fetch();
                    if( html_entity_decode( $data['password'] ) == $_COOKIE[PREFIX .'_password'] ){
                        $ip_arr = explode( '.', $_SERVER['REMOTE_ADDR'] );
                        if( $data['status'] == 1 ){
                            if( $data['ip'] == $ip_arr[0]. '.' . $ip_arr[1]){
                                $is_logged = $data;
                                $mess = '';
                            }else{
                                $is_logged = false;
                                $mess = 'У вас сменился IP адрес';
                                $query_data = array( 'status' => 0, 'ip' => '' );
                                $query = $db->prepare( 'UPDATE `'. PREFIX .'_users` SET `status`=:status, `ip`=:ip' );
                                $query->execute( $query_data );
                            }
                        }else{
                            $is_logged = false;
                            $mess = 'Записи о вашей авторизации нет в системе';
                            SetCookie( PREFIX .'_login', '', time()+1, "/");
                            SetCookie( PREFIX .'_password', '', time()+1, "/");
                        }
                    }else{
                        $is_logged = false;
                        $mess = '';
                    }
                }else{
                    $is_logged = false;
                    $mess = 'Логин или пароль не верный';
                }
            }else{
                $is_logged = false;
                $mess = '';
            }
        }else{
            $is_logged = false;
            $mess = '';
        }
    }
if( isset( $_GET['exit'] ) and $is_logged ){
    SetCookie( PREFIX .'_login', '', time()+1, "/");
    SetCookie( PREFIX .'_password', '', time()+1, "/");
    $query_data = array( 'status' => 0, 'ip' => '' );
    $query = $db->prepare( 'UPDATE `'. PREFIX .'_users` SET `status`=:status, `ip`=:ip WHERE `id`="'. $is_logged['id'] .'"' );
    $query->execute( $query_data );
    $is_logged = false;
    $mess = '';
}
 
код не читал, но насчёт
"...или кривого"
могу подсказать Для просмотра ссылки Войди или Зарегистрируйся
Код очень страшный и не читабельный. Используйте приём- сторожевые пункты. Вложенные условия заменяем на прерывания работы. Будет намного приятнее работать
PHP:
if( !isset( $_POST['login'] ) || !isset( $_POST['pass'] ) ){
// error
returm false;
}
f( !isset( $_POST['captcha_code']) ){
// error
returm false;
}
$captcha =check_captcha( str_replace( 0, '', $_POST['captcha_code'] ) );
if( $captcha['code'] !== 1 ){
....
 
Тоже скорее из "кривого". Лучше использовать не равно (==), а тождественно равно (===) для такого рода сравнений:
PHP:
if( html_entity_decode( $data['password'] ) == $post_pass )
во избежании всяких неприятностей
Для просмотра ссылки Войди или Зарегистрируйся
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху