Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Приемы безопасного программирования на PHP
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007
Помог: 0 раз(а)
Доброго всем дня!
Прочитал на днях статьюПриемы безопасного программирования на PHP, оч полезная инфа для меня оказалась.
Пишу свой двиган уж пол года, и ни как не мог понять как лучше всего написать авторизацию, видел много вариантов, и сесии использовали люди и "печеньки", но так же находил статьи на ХАК-сайтах как это всё обходилось кралось и проще говоря взламывалось.
Первое что меня порадовало это :
Цитата:
Пользователь при каждом запросе, помимо другой информации (сообщение в чате, или список сообщений в гостевой книге), отправляет серверу свой uid. При этом в документе с формами ввода будет присутствовать, наряду с другими формами, тег вида:
<input type=hidden name=uid value=1234567890>
, ведь даже если злоумышленник посмотрит иходный сгенерированный текст в браузере, то он увидит число которое подобрать нельзя, потомучто оно с каждым новым заходом на сайт, меняеца!!!
Минусы статьи тоже есть!!!
Я обычно при авторизации использую "escape_string", так как одного
не достаточно есть ещё
" ' " и " " " спец символы. Много статей про Инъекции
в Интернете есть!!!
Функция экранирует все спец-символы (у меня она не расписана а в простом варианте):
,
а пользоваться ими с "display_errors=Off" и на всех функциях ставить значок "@"(это значит что если в функции какая либо ошибка она её не покажет на экране)
злоумышленник не увидит пути к файлам в которых есть ошибка!!!!
Ох да совсем забыл, про запросы в БД на помнить!!! Если вы ищите что то конкретно в большой таблице то лучше всего использовать в запросах LIMIT 1, так как можно сформировать запрос с функцией BECHMARK
Ну вот вроде пока ВСЁ!!!
----- ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
EuGen
Отправлено: 25 Сентября, 2007 - 13:59:07
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
по поводу запросов - я всегда прежде чем вставлять в запрос какую бы то ни было переменную использую
, экранируя спец. символы. Кроме того, никогда не использую register_globals, так как небезопасно(почему - подумайте сами ...)
Далее, рекомендуется всегда инициализировать переменные, если требуется достичь большей безопасности. Приемы нехитрые, но помогают избежать многих "тупых" ошибок.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
valenok
Отправлено: 25 Сентября, 2007 - 15:00:12
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
а я всегда использую Только mysql_escape_string
( или в крайних мерах mysql_real_escape_string ) и всё.
Я тоже против register globals, пока не наткнулся на программиста
который мне предоставлял хостинг и долго объяснял мне чем же регистр глобалс так хороши.
Так что вообще то как вам удобней, но c register_globals off легче.
Тестировать только с включёнными ошибками, загружать в выключенными. Для этого я обычно использую на сервере и на локалке разные .htaccess .
Насчёт LIMIT 1 - не очень то нужная вещь для безопастности.
Раньше я вообще писал так Select ... ; /*
Потом понял что если писать правильные запросы со всеми кавычками,
апострофами, заглавными буквами для ключевых слов, используя mysql_escape_string - то никто мне ничего не сделает, что бы он там не ввёл. Ещё естественно нужно проверять не пустые ли поля с логином и паролем.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
2 valenok - в подходе, когда в самом начале скрипта делается экранирование символов у введенных переменных, есть некоторый изъян - а именно: если мы будем использовать эти переменные где-либо еще, кроме как в запросе, нам это экранирование "испортит" ввод пользователя (бывает и так, что нам нужно сохранить именно исходные данные без экранирования). В Вашем примере я бы предпочел:
Таким образом и данные сохраняются, и экранирование идет в нужном месте.
(А вообще то логин с паролем обычно нигде кроме БД не нужны ((* ... так что данный пример вполне вероятно что и так можно было оставить, но для общего случая лучше использовать экранирование только в тех местах, где оно нужно)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
valenok
Отправлено: 25 Сентября, 2007 - 18:04:26
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
EuGen
У меня веде escape стоит в самих запросах
Вышеприведенный код лишь пример того что инъекцировать написанный
правильными манерами запрос почти невозможно в отличии от безобразно написанного
select id from users where login=$login and pass=$pass
которого я всё чаще и чаще встречаю в различных скриптах.
----- Truly yours, Sasha.
EuGen
Отправлено: 25 Сентября, 2007 - 18:22:43
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Цитата:
select id from users where login=$login and pass=$pass
это безобразие уже давно в серьезных проектах не встречал.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
mario
Отправлено: 26 Сентября, 2007 - 08:53:02
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007
может лучше функцию написать и вызывать её в нужные нам номенты, когда нужно именно запрос в БД сделать
функцию по ескейпу приводил выше^^(у меня она в классе БД)
$sql="SELECT * FROM users WHERE user_id IN (SELECT user_id FROM $rights_table) AND reg_date BETWEEN '$start_date' AND '$end_date' OR status=$status";
Просто я не понимаю пока следующего: reg_date BETWEEN '$start_date' AND '$end_date'
какую цель ты преследуеш этим, т.е. что тебе даёт "reg_date" между стартом и канцом?
Наверно для того чтобы считать это запросом авторизации
нужно знать $start_date и $end_date
И ещё вопрос почему в конце OR ? Если я правильно понял, ты хочеш получить ВСЕ ид юзеров, в которых указана reg_date или $status
Да и на втой вопрос про функции! Для канкретно этого запроса я не думаю что нужна какая либо функция
----- ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
EuGen
Отправлено: 27 Сентября, 2007 - 10:18:40
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Во-первых, это запрос - пример того, что подход с функцией лишней не есть гут.
P.S.
Он всего лишь делает следующее: выбирает пользователей, которые были зарегистрированы с..по, или же тех, чей статус нам важнее этих данных
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
mario
Отправлено: 27 Сентября, 2007 - 10:31:31
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2007
Помог: 0 раз(а)
Я тебя понял, но как это относится к авторизации?
Я и не предлогаю тебе в этом запросе использовать функцию, только по тому, что код будет более громоздким, да это и лишне...
Могу наверно лишь посоветовать "mysql_free_result" если запрос возвращает большое количество данных
----- ЗАНАЯ id МОЖНО МНОГО ЧТО УЗНАТЬ ;)
EuGen
Отправлено: 05 Октября, 2007 - 10:02:48
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Дак какая разница? .. Ну, можете считать что я этот запрос просто так написал.. смысл в том, что не нужно переписывать то, что уже и так написано.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.