Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Безопасность в PHP (https://javascript.ru/forum/server/27761-bezopasnost-v-php.html)

Diego 24.04.2012 15:12

Цитата:

Сообщение от micscr (Сообщение 170939)
Странная у тебя цмс, где ты сессии не используешь. :-?

Не люблю кашу в ссылках. Да и хранить переменные в сессии мне особо не надо, пока не встречалось таких задач в которых жизненно важно использовать сессии.
В любом случае сессии будут работать через куки, тогда зачем вообще включать сессии если можно использовать куки для идентификации пользователя. Сессии не будут работать через куки только если куки отключены, а они отключены по данным разных статистик от 0.5 до 3% пользователей, которые знали на что идут, когда отключали эти самые куки :)
Но я полностью не отрицаю вариант авторизации с сессиями, просто пока удобнее работать с куками, может в будущем все таки перейду на сессии.

Но вопрос не в этом. Сейчас у меня сайт на укозе(собственно, именно из-за этого и пишу cms), и пользователи часто жалются что им надо каждый день логинится заново. А IP, потому как динамический, будет каждый день менятся и разлогинивать пользователя, поэтому я сейчас думаю над тем, как иными способами закрепить профиль пользователя за конкретным компом. Пока думаю "метить" пользователя, согласно этой статье http://javascript.ru/unsorted/id , по крайней мере заголовки много полезных данных содержат.
И напрашивается вопрос - как держать логин пользователя безопасным способом без привязки к IP?

Цитата:

Сообщение от devote (Сообщение 170943)
А еще не забывать о том что многие редакторы любят совать BOM который тоже иногда приводит к ошибкам.

Ну это совсем уж детские ошибки(всмысле, сохранить в неправильной кодировке). Тем более во многих редакторах можно сразу при создании документа менять кодировку, например в Notepad++

devote 24.04.2012 15:33

Цитата:

Сообщение от Diego
Тем более во многих редакторах можно сразу при создании документа менять кодировку, например в Notepad++

речь не о кодировке.. Редакторы добавляют BOM в тех случаях если вы файл сохраняете в кодировке UTF-8 что чаще всего на сегоднящний день все и используют.

devote 24.04.2012 16:02

Если таблица юзера в БД примерно такая:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(15) NOT NULL AUTO_INCREMENT,

   // логин пользователя
  `username` varchar(255) NOT NULL,
   // пароль пользователя в md5 формате
  `password` varchar(32) NOT NULL,
   // некий md5 хеш для проверки авторизации юзера
  `passkey` varchar(32) NOT NULL,

   // NULL если не заблокирован, иначе время в формате unix timestamp указывающую дату блокировки
  `blocked` int(15) unsigned DEFAULT NULL,

   // NULL если не активирован аккаунт, иначе время в формате unix timestamp указывающую дату активации
  `activated` int(15) unsigned DEFAULT NULL,

  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


То можно сделать примерно такой вариант:
function check_user_auth() {

	if ( isset( $_COOKIE['ruirm'] ) ) {

		$sql_result = mysql_query( "SELECT COUNT(*) FROM `users` ".
				"WHERE md5(CONCAT(`passkey`, md5(`id`), md5(`username`), md5(`password`)))='".
				mysql_real_escape_string( $_COOKIE['ruirm'] )."' ".
				"AND ISNULL(`blocked`) ".
				"AND NOT ISNULL(`activated`);"
		);

		if ( mysql_num_rows( $sql_result ) > 0 ) {

			SetCookie( "ruirm", $_COOKIE['ruirm'], time() + 60*60*24*30*12*5 );

			return true;

		} else {
			SetCookie( "ruirm", '', time() + 60*60*24*30*12*5 );
		}
	}

	return false;
}

if ( check_user_auth() ) {
	echo "Пользователь авторизован!";
} else {
	echo "Пользователь не авторизован!";
}
Но без использования сессий, это критично для БД.

После авторизации в куку значение ruirm генерить так:
SetCookie("ruirm",
	md5( $user['passkey']. // текущее значение passkey из БД
	md5( $user['id'] ). // Id пользователя в БД
	md5( $user['username'] ). // логин пользователя
	md5( $user['password'] ) ), // хешпароль пользователя в БД
	time() + 60*60*24*30*12*5  // сохраним на пять лет :)
);
где переменная $user содержит данные пользователя из БД

Если пользователь сменит пароль, во всех браузерах где он был авторизован слетит авторизация, так же можно добавить у пользователя в аккаунте кнопочку, "Выйти из всех браузеров" после нажатия на которую меняем passkey на какой-нить другой. Генерация этого passkey может быть любая, на ваш вкус. Но менять ее может лишь юзер который жмакнул кнопку "Выйти из всех браузеров". Или сервак может сменить например при блокировании юзера что бы он вылетел со всех браузеров и т.д.

Если юзать сессии, то тогда не нужно будет постоянно обращаться в БД, а лишь один раз в случае если в сессии нет инфы об авторизации юзера.

Раед 24.04.2012 16:31

Много вы тут про сессии говорите. А можно ссылку - глянуть, что это и как реализуется

micscr 24.04.2012 17:23

Цитата:

Сообщение от devote
Уж неужто вычитали где-то что это влияет на безопасность?

это доморощенная мудрость пых программистов. :) , почерпнутая из холиваров на форумах.
Смысл в том, что если стоит закрывающий тег, то html вирус(если как то проникнет) спокойно себя допишет в конец файла и будет работать незамеченным.
А если не стоит тег, то пых выкинет ошибку и сайт ляжет, зато сразу можно будет и устранить проблему.

Diego 24.04.2012 17:23

Цитата:

Сообщение от devote (Сообщение 170961)
$sql_result = mysql_query( "SELECT COUNT(*) FROM `users` ".
"WHERE md5(CONCAT(`passkey`, md5(`id`), md5(`username`), md5(`password`)))='".
mysql_real_escape_string( $_COOKIE['ruirm'] )."' ".
"AND ISNULL(`blocked`) ".
"AND NOT ISNULL(`activated`);"
);

то есть как ответ из бд вернутся не данные, а количество строк, в которых сумма хешей совпадает данным из куки?
Цитата:

Сообщение от devote (Сообщение 170961)
Если юзать сессии, то тогда не нужно будет постоянно обращаться в БД, а лишь один раз в случае если в сессии нет инфы об авторизации юзера.

тогда буду использовать сессии :)

Цитата:

Сообщение от devote (Сообщение 170961)
Генерация этого passkey может быть любая, на ваш вкус.

значит, что всю безопасность обеспечивает passkey? Если у злоумышленника сгенерированный по данным его компа passkey не совпадет с passkey пользователя, то защита работает?

Цитата:

Сообщение от Раед (Сообщение 170967)
Много вы тут про сессии говорите. А можно ссылку - глянуть, что это и как реализуется

http://www.php.su/articles/?cat=examples&page=070

micscr 24.04.2012 17:24

сессии

micscr 24.04.2012 17:30

Цитата:

Сообщение от Diego
Не люблю кашу в ссылках

А такая ссылка и не нужна. Сессии через куки работают, а автоподстановку в адреса и формы(получаются некрасивые адреса) обычно не включают.

Раед 24.04.2012 17:52

Цитата:

Сообщение от micscr
сессии

Спасибо, почитал

devote 24.04.2012 17:57

Цитата:

Сообщение от Diego
значит, что всю безопасность обеспечивает passkey?

Нет конечно, он лишь подтверждает то что юзер когда-то залогинелся. А если злоумышленник узнает passkey то он ему совершенно ничего не даст, так как помимо этого нужно знать и пароль пользователя и логин пользователя и ID пользователя в БД.. потому как все это связано между собой и любое изменение этих параметров приведет к тому что юзер вылетит из сайта, со своего аккаунта и ему придется авторизоваться снова.

Цитата:

Сообщение от Diego
то есть как ответ из бд вернутся не данные, а количество строк, в которых сумма хешей совпадает данным из куки?

Да, но хеш код уникален, поэтому всегда будет возвращаться лишь одна строка если совпадение найдено, либо не одной если не найдено.

Цитата:

Сообщение от Diego
Если у злоумышленника сгенерированый по данным его компа passkey не совпадет с passkey пользователя, то защита работает?

не переживайте через эту систему ему вечность ломать придется вас


Часовой пояс GMT +3, время: 00:54.