(session and cookie) перезапись в авторизации.

1. fhgdfhdfhdf (15.10.2012 / 01:01)
<?php
require_once('db.php');

$email = trim(htmlspecialchars(stripslashes($_POST['email'])));
$password = md5(md5(trim(htmlspecialchars(stripslashes($_POST['password'])))));
$remember = trim(htmlspecialchars(stripslashes($_POST['save'])));

class inLog{

    public $classEmail;
    public $classPass;
    public $classRem;

    function __construct($ce,$cp,$cr = false){
        $this->classEmail = $ce;
        $this->classPass = $cp;
        $this->classRem = $cr;

        $sql = mysql_query("SELECT * FROM users WHERE password = '" . $this->classPass . "' AND email = '" . $this->classEmail . "' LIMIT 1");
        // Если есть совпадения то работаем далее
        if($sql===false){ //если нет совпадений то логин фальш если есть то иднм далее и логин тру
            $login = false;
        }else{
            
            while($u = mysql_fetch_array($sql))//Выборка из БД
            {
            
                if($this->classRem){//условия ремэмберна
                    
                    function rand_string($len, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')//функция строки 
                    { 
                        $string = ''; 
                        for ($i = 0; $i < $len; $i++) 
                        { 
                            $pos = rand(0, strlen($chars)-1); $string .= $chars{$pos}; 
                        } 
                        return $string; 
                    }
                    
                    function session_encrypt($string) //функция мд5 строки
                    { 
                        $salt = 'sdsfljkdfg'; 
                        return md5($salt . $string); 
                    }
                    
                    $cookie_auth= rand_string(10) . $email;
                    $auth_key = session_encrypt($cookie_auth);
                    $auth_query = mysql_query("UPDATE users SET auth_key = '" . $auth_key . "' WHERE email = '" . $this->classEmail . "'");
                    setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7);
                        
                }//Закрывает условия ремэмберна



2. fhgdfhdfhdf (15.10.2012 / 01:01)
<?php
                session_start();
                session_regenerate_id(true);
                $session_id = $u[id];
                $session_username = $u[user_name];
                $session_email = $email;
                $session_level = $u[user_level];
                
                $_SESSION['user_id'] = $session_id;
                $_SESSION['user_level'] = $session_level;
                $_SESSION['user_email'] = $session_email;
                $_SESSION['user_name'] = $session_username;
                $_SESSION['user_lastactive'] = time();
                return true; 
            }//Закрывает закрывает цикл выборки
        }//Закрывает условие выборки
    }//Закрывает конструктор        
}//Закрывает класс

$user = new inLog($email, $password, $remember);
print_r($_COOKIE);
?> 

Кто сможет помочь? Cookie "auth_key" не перезаписываются, при том что в БД ключ обновляется в чем причина? Как очистить Cookie и записать новые?

3. Петр (15.10.2012 / 08:56)
6680 (15 Октября 2012 / 01:01)
<?php
$email = trim(htmlspecialchars(stripslashes($_POST['email'])));
...
$sql = mysql_query("SELECT * FROM users WHERE password = '" . $this->classPass . "' AND email = '" . $this->classEmail . "' LIMIT 1"); 
...
?>
Напишешь потом ссылку на этот сайт? smile Значения в массиве COOKIE не меняются сразу после setcookie, наверное, проблема в этом.

4. fhgdfhdfhdf (15.10.2012 / 11:17)
Im-ieee (15 Октября 2012 / 08:56)
Напишешь потом ссылку на этот сайт?

Зачем? Так легко взломать?))) Это не сайт это я изучаю безопасность сайто-строения + cookie + session + ООП.


smile Значения в массиве COOKIE не меняются сразу после setcookie, наверное, проблема в этом.

Не понял, как сделать так что бы очистить $_COOKIE['auth_key']? А потом записать туда тоже значения что записывается и в БД?

5. Петр (15.10.2012 / 11:48)
4. 6680, $_COOKIE['auth_key']=$auth_key; очевидно. Насчет безопасности - тут SQL инъекция.

6. fhgdfhdfhdf (15.10.2012 / 12:02)
И что мне это даст? То что для данной странице $_COOKIE['auth_key'] равна тому что я указал а на других страницах тому что было указано ранее! НУ И ЧТО ТУТ ОЧЕВИДНО?

7. Петр (15.10.2012 / 12:32)
6. 6680, то есть у тебя вообще не устанавливается cookie? Тогда стоит включить отображение ошибок.

8. fhgdfhdfhdf (15.10.2012 / 12:33)
Насчет безопасности - тут SQL инъекция. - можно по подробней об этом?

Добавлено через 01:52 сек.
Im-ieee (15 Октября 2012 / 12:32)
6. 6680, то есть у тебя вообще не устанавливается cookie? Тогда стоит включить отображение ошибок.
Так то ошибки показывает когда например будет вывод в браузер в переди, как сделать что бы все ошибки видно было, я не помню...

9. Петр (15.10.2012 / 12:39)
8. 6680, такой email: nothing' union select * from users where email='admin_email'# Отображение ошибок - error_reporting(E_ALL);

10. fhgdfhdfhdf (15.10.2012 / 12:48)
Im-ieee (15 Октября 2012 / 12:39)
8. 6680, такой email: nothing' union select * from users where email='admin_email'#

Типо если вместо мыла вставить эту штуку и нажать вход, получишь данные из бд? или что? можно подробнее.

11. Петр (15.10.2012 / 12:54)
10. 6680, зайдешь, как администратор.

12. fhgdfhdfhdf (15.10.2012 / 12:59)
т.е. в nothing' union select * from users where email='admin_email'# заменяешь то что синим на мыло админа (которое ты должен знать) вставляешь в строку мыла дальше не чего не заполняя нажимаешь вход и заходишь с учетки того человека чье мыло вставил?

13. Петр (15.10.2012 / 13:06)
12. 6680, да. Хотя знать адрес не обязательно, можно просто по очереди заходить с разных пользователей.

14. fhgdfhdfhdf (15.10.2012 / 13:10)
.....

Добавлено через 04:37 сек.
Все понял, сорри, ты прав... как от этого защититься можно?

15. Петр (15.10.2012 / 13:41)
14. 6680, addslashes или prepared statements

16. fhgdfhdfhdf (15.10.2012 / 13:52)
Первое понял, это плюс ко всему что там есть вставляю этот обработчик и он все спец символы экранирует (или что то в этом роде) а второй вообще не понял.
А можно ведь ограничить число вводимых символов и удалить пробелы, тогда этот способ инъекции просто не пройдет из за кол-ва символов да еще и перестанет работать из за не правильной формулировки, такое может помочь?

17. Петр (15.10.2012 / 14:01)
16. 6680, плохая идея, разве не бывает длинных адресов? Вместо пробелов можно использовать комментарии или скобки. Если и проверять e-mail, то регулярным выражением.

18. fhgdfhdfhdf (15.10.2012 / 14:10)
ммм регулярное выражение хороший вариант) спасибо за помощь
=) а на счет длинного мыла, длиннее 32 символов чаще спамеры и боты используют =)


А вот что с COOKIE делать? Их не создает и не обновляет, пару раз обновились и то по не понятным причинам.( Ошибок не выдает.(

Добавлено через 02:44 сек.

Ваш положительный голос за пользователя Im-ieee успешно оставлен!
В данный момент его авторитет: 12


19. Петр (15.10.2012 / 14:25)
18. 6680, попробовал запустить твой код, у меня все обновляет. Даже не знаю, что может быть. В базе хоть ключ обновляется?

20. fhgdfhdfhdf (15.10.2012 / 14:32)
В базе все супер, при каждой отправке мыла с паролем там новый ключ а вот в куках все тот же.

Сделал для теста вот так:

<?php
error_reporting(E_ALL);
setcookie("auth_key", "", time() - 3600);
print_r($_COOKIE);
 ?>

В ответ получаю:


Array ( [login] => 6680 [password] => 000000 [auth_key] => 18db656ece2a1b4772b6a9ef437e650f [PHPSESSID] => 5u2oserlufsgvlsrg31tob66u5 )

=(

Добавлено через 08:58 сек.
Сейчас попробовал вот так:
<?php
error_reporting(E_ALL);
setcookie("login", "", time() - 3600);
setcookie("password", "", time() - 3600);
setcookie("auth_key", "", time() - 3600);
print_r($_COOKIE);
 ?>

Получил:

Array ( [auth_key] => 18db656ece2a1b4772b6a9ef437e650f [PHPSESSID] => 5u2oserlufsgvlsrg31tob66u5 )


21. fhgdfhdfhdf (15.10.2012 / 17:30)
Ещё не мене важный но (наверное) менее сложный вопрос:
У меня страницы кодировки utf_8 с сохранением BOM.
Из за этого session_start(); выдает ошибку:



Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\dub.music\reg\index.php:1) in Z:\home\dub.music\reg\index.php on line 1

Как исправить?

22. Петр (15.10.2012 / 17:43)
21. 6680, открыть и сохранить без BOM. В принципе, можно обрезать эти байты и самому -
<?php file_put_contents('file_no_bom.php', substr(file_get_contents('file_bom.php'), 3)); ?>


23. fhgdfhdfhdf (15.10.2012 / 18:01)
Без BOM не льзя.... каракули будут... пробовал записывать в отдельный файл и сохранять просто в utf_8 а потом инклудить на странице с BOM. Но не помогло(((
Не понял тот код что ты написал...


24. Петр (15.10.2012 / 18:16)
23. 6680, где каракули - в браузере или в редакторе? Если в браузере, то нужно послать заголовок: header('Content-Type: text/html; charset=utf-8');

25. fhgdfhdfhdf (15.10.2012 / 18:28)
ммм... вроде помогло, сейчас по экспериментирую.... спасибо

26. fhgdfhdfhdf (15.10.2012 / 21:45)
У меня опять проблемы %) , почему в случае если второе условие не выполняется, то то что должно происходить при его не выполнении, не происходит?

<?php
if(isset($_COOKIE['auth_key']))
{
    function safe_var($str){ $str=trim(stripslashes(htmlspecialchars($str))); return $str; }
    $auth_key = safe_var($_COOKIE['auth_key']);
    $auth_key_query = mysql_query("SELECT email, password FROM users WHERE auth_key = '" . $auth_key . "' LIMIT 1");    
    if($auth_key_query)// Второе условие!!!
    {   
        while($u = mysql_fetch_array($auth_key_query))//Выборка из БД
        {
             $email = $u['email'];
             $password = $u['password'];
             if(isLog($email, $password) == 1){$k=1;}else{setcookie("auth_key", "", time() - 3600,"/", "reg.dub.music", false, true);logout();$k=0;}                  
        }        
    }
    else
    {
        $k=0;
    }
}else{$k = 0;}
?>


URL: https://visavi.net/topics/34866