(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");
...
?>
Напишешь потом ссылку на этот сайт?
Значения в массиве COOKIE не меняются сразу после setcookie, наверное, проблема в этом.
4.
fhgdfhdfhdf (15.10.2012 / 11:17)
Im-ieee (15 Октября 2012 / 08:56)
Напишешь потом ссылку на этот сайт?
Зачем? Так легко взломать?))) Это не сайт это я изучаю безопасность сайто-строения + cookie + session + ООП.
Значения в массиве 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)
.....
не знаю как я щас только не пробывал сесия не появилась того пользователя чей мыйл я ввел, а следовательно я не вошел как админ. или я что то делаю не так ? в мыло вставил
nothing' union select * from users where email='[email protected]'# и нажал вход.
Добавлено через 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