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

Тема в разделе "Защита и взлом", создана пользователем Q_BASIC, 20 июн 2014.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    352
    Симпатии:
    223
    $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 md5trim$pass ) . $salt ) );
        return 
    $hash;
    }
    function 
    check_captcha$code ){
        global 
    $_SESSION;
        if( 
    $code == '' ){
            return array( 
    'mess' => 'Введите капчу''code' => );
        }else{
            
    $code trim($code);
            
    $cap $_SESSION['captcha'];
            unset( 
    $_SESSION['captcha'] );
            if (
    $code == $cap){
                    return array( 
    'mess' => '''code' => );
            }else{
                return array( 
    'mess' => 'Капча введена не верно''code' => );
            }
        }
    }
    PHP:
    if( isset( $_POST['login'] ) and isset( $_POST['pass'] ) ){
            if( isset( 
    $_POST['captcha_code']) ){
                
    $captcha =check_captchastr_replace0''$_POST['captcha_code'] ) );
                if( 
    $captcha['code'] == ){
                    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'] == ){
                                    
    SetCookiePREFIX .'_login'$data['login'], time()+2592000"/");
                                    
    SetCookiePREFIX .'_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'] == ){
                                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 'Записи о вашей авторизации нет в системе';
                                
    SetCookiePREFIX .'_login'''time()+1"/");
                                
    SetCookiePREFIX .'_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 ){
        
    SetCookiePREFIX .'_login'''time()+1"/");
        
    SetCookiePREFIX .'_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 '';
    }
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    код не читал, но насчёт
    "...или кривого"
    могу подсказать это
    Код очень страшный и не читабельный. Используйте приём- сторожевые пункты. Вложенные условия заменяем на прерывания работы. Будет намного приятнее работать
    PHP:
    if( !isset( $_POST['login'] ) || !isset( $_POST['pass'] ) ){
    // error
    returm false;
    }
    f( !isset( $_POST['captcha_code']) ){
    // error
    returm false;
    }
    $captcha =check_captchastr_replace0''$_POST['captcha_code'] ) );
    if( 
    $captcha['code'] !== ){
    ....  
     
    latteo нравится это.
  3. masterphp1122

    masterphp1122 Писатель

    Регистр.:
    17 июн 2014
    Сообщения:
    1
    Симпатии:
    0
    Тоже скорее из "кривого". Лучше использовать не равно (==), а тождественно равно (===) для такого рода сравнений:
    PHP:
    if( html_entity_decode$data['password'] ) == $post_pass )
    во избежании всяких неприятностей
    http://raz0r.name/vulnerabilities/simple-machines-forum/