Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2011
Помог: 0 раз(а)
Здравствуйте!
Возникла необходимость написать движок для одного интернет-проекта, кода-то давно я немного кодил, но опыта, особо, не накопил. Трудность в том, что очень критична скорость работы скриптов и вопрос информационной безопасности.
Общий смысл файла index.php: 1. Определяем, авторизован ли пользователь (получаем права и прочую информацию, которая потом пригодится).
2. Определяем, язык на котором выводим контент (если пользователь авторизован, у него в настройках указан язык).
3. По URI находим контент в БД (получаем тип страницы и прочую информации, которая потом пригодится).
4. Подключаем модуль, соответствующий типу страницы (каталог, галерея, контент, ...).
Если не сложно, посоветуйте, пожалуйста, как оптимизировать код и, возможно, структуру движка.
Значения для POST переменных, пока, подставлять не пробовал, но, думаю, должно работать без особых ошибок.
P.S.: Что-то мне подсказывает, что получилось ужасно криво...
Haron
Отправлено: 02 Мая, 2011 - 07:38:17
Частый гость
Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010 Откуда: Оттуда
Помог: 5 раз(а)
Безопасность:
- Нет контроля того, что приходит от пользователя (GET POST). Поэтому взламывается элементарно. Курите статью про MySQL Injection в википедии. mysql_escape_string - не панацея.
- md5 - легко дешифруется. Есть такая (очень) весёлая программа GPU md5 crack
Структура
- Почитайте про буферизацию вывода. Сильная вещь.
- Не храните короткие строки в полях типа TEXT. Ужасно ресурсоёмкое, и не поддерживающее индексы решение. Храните в VARCHAR.
- Используйте индексы в таблицах. Например повесьте уникальный индекс на поле `urn`.
На этом всё, ниже - чисто рекомендации (Их не обязательно использовать, это моё ИМХО).
- Используйте библиотеки абстракций от БД (Например DBsimple, - сильно экономит время).
- А лучше напишите свою, и желательно под расширение MySQLi.
Смысл в том, чтобы некая абстрагирующая функция (ну например обзовём её query()) - выполняла и
mysql_query, и mysql_fetch_row к примеру, и возвращала уже готовый результат. Принимать она должна строку запроса SQL и параметры.
В неё же (функцию) можно фильтрацию и контроль входящих данных впихнуть.
Не надо так делать. Это мусорный комментарий. Если хотетите выделить смысловой блок - оформите его в функцию или (всякие конфиги) вынесите в отдельный файл.
Haron,DlTA - всё по делу, но
Haron пишет:
md5 - легко дешифруется.
Немного не так. md5 вообще не дешифруется. Никак. Атака с использованием радужной таблицы - это не дешифрация, а по сути просто очень эффективная модификация брута. И сломать позволяет далеко не всё. А использование соли делает эти таблицы вообще неэффективными. kto-to хешировать лучше не пароль, а md5(чудо-строка), где чудо-строка получается путем конкатенации пароля со случайным образом сгенерированной еще одной строкой - солью.
Haron пишет:
Почитайте про буферизацию вывода. Сильная вещь.
Обычная вещь. Да и к чему она тут?
Haron пишет:
Храните в VARCHAR.
а поля type и language можно даже в enum.
Haron
Отправлено: 02 Мая, 2011 - 10:55:35
Частый гость
Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010 Откуда: Оттуда
К тому, что с буферизацией страница будет отдаваться уже готовой - сразу и вся, а не рисоваться постепенно (порой это очень некрасиво смотрится). А если ещё и закешировать (например в файлы) - +100500 к быстродействию.
----- И чё?
Champion
Отправлено: 02 Мая, 2011 - 11:10:57
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Я тут вообще не увидел ничего похожего на вывод, поэтому не понял, зачем здесь заводить речь о буферизации)
Я вот могу с таким же успехом посоветовать совершать пробежки в парке - это тоже полезная вещь)
Ну это не дешифрация. Понятное дело, что любое хэш значение имеет бесконечное число коллизий. Одно дело подобрать одну из коллизий, другое - реальное захешированное значение. Хотя часто можно воспользоваться одним вместо другого.
По поводу CUDA - я думаю, не каждый злоумышленник может ей воспользоваться, тем более для атаки на творчетсво kto-to. Ничего плохого не хочу сказать про kto-to, но думаю, что его сайт не предстваляет интереса для злобных хакеров - только для энтузиастов. Так что соли вполне достаточно.
Кстати, я увидел камень, брошенный в md5, но не увидел ничего предложенного взамен.
Мелкий
Отправлено: 02 Мая, 2011 - 11:21:19
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Haron пишет:
Брутфорс же md5 - сегодня делается в обозримые сроки (Используется CUDA). Неважно, есть соль, или её нетЪ.
Угу, ещё одна жертва маркетинга, как и я в своё время. Вот вам задание:
пароль прибавляется к началу строк то есть хэш = MD5( пароль + строка ). Пароль ОДИНАКОВЫЙ для обоих строк.
мой пароль содержит от 20 до 30 символов и имеет только анлгийские большие и маленькие буквы (вобщем длинной около 150 бит) ну это чтобы вам было проще
----- PostgreSQL DBA
kto-to
Отправлено: 02 Мая, 2011 - 19:06:12
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2011
Помог: 0 раз(а)
Haron, DlTA, Champion, Мелкий, благодарю за ответы!
1. А что mysql_escape_string() пропустит? По идее, БД должна уметь обрабатывать любые данные, просто их надо предоставить в нужном виде, или я чего-то не так понимаю? Как там SQL-inj провести?
2. Слышал, что md5 лучше использовать с солью. Переделаю. А, на самом деле, какая реальная альтернатива md5?
3. Для буферизации, пока, рано. Тут вывода еще нет. Но обязательно учту, когда буду писать вывод.
4. Да, со структурой БД у меня беда. Переделаю.
5. Подключение к БД сознательно не стал выносить в отдельный файл, потому, что include() замедлит скорость работы скрипта.
6. Оправдано ли использование trim()... Думаю, что стоит оставить, потому, что пробелы по краям редко ставятся сознательно. Хотя... Лишняя функция - лишнее время.
7. $_SERVER['DOCUMENT_ROOT'] - это да. Переделаю.
8. По поводу комментариев уже сломал себе голову... Выносить блоки в функции - увеличить время выполнения сценария, а совсем без комментариев код слабо читабельный.
9. Хотелось бы, чтоб обошлось без этого, но хакерские атаки (не знаю, на сколько профессиональные, но заказные) скорее всего будут.
Да, по поводу библиотеки абстракций от БД... Опять же, она облегчает процесс написания, но замедляет выполнение сценариев. Да и приложения сторонних разработчиков, без крайней необходимости, я использовать не хочу.
Мелкий
Отправлено: 02 Мая, 2011 - 19:32:02
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
1. тоже любопытно. Для базы данных mysql_escape_string вполне достаточно.
2. sha1 есть ещё.
5 & 6 & 8. Это называется "преждевременная оптимизация". Забейте на наносекунды, для них всё равно PHP не подходит и делайте так, чтобы это было удобно.
----- PostgreSQL DBA
kto-to
Отправлено: 02 Мая, 2011 - 20:16:38
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Май 2011
Помог: 0 раз(а)
2 Мелкий
О sha1 прочитал. Я так понимаю, что принцип, по сути, такой же, как и у md5. Существенной разницы между ними, я найти не могу. Единственное, возможно использовать их совместно. Или я ошибаюсь?
Преждевременная оптимизация, возможно. Но нет ничего более постоянного, чем что-либо временное. Не хочется в итоге получить две килотонны медленного кода, который надо везде подправить. Возможно php не самый быстрый язык, но именно он мне в данной ситуации позволит относительно быстро добиться цели. И именно от него я сейчас намерен получить максимальную скорость.
Haron
Отправлено: 02 Мая, 2011 - 21:06:48
Частый гость
Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010 Откуда: Оттуда
Помог: 5 раз(а)
kto-to пишет:
Единственное, возможно использовать их совместно. Или я ошибаюсь?
Совместно - да, хорошая идея
kto-to пишет:
Преждевременная оптимизация, возможно. Но нет ничего более постоянного, чем что-либо временное.
И по поводу абстракций...
Пример - три функции делающих что либо (На входе $var - на выходе $c)
$a = func1($var);
$b = func2($a);
$c = func3($b);
Как думаете, что быстрее и читабельней?
Использование подобных повторяющихся конструкций в коде 100500 раз?
Или единственная конструкция вынесенная в функцию? (Необязательно в отдельный файл)?
----- И чё?
Champion
Отправлено: 02 Мая, 2011 - 21:13:24
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Haron пишет:
Совместно - да, хорошая идея
Плохая идея. Похоже на панику. Шифровать всем чем можно. md5 + соль и всё будет здорово.
kto-to пишет:
По поводу комментариев уже сломал себе голову... Выносить блоки в функции - увеличить время выполнения сценария, а совсем без комментариев код слабо читабельный.
Правильно сказали - это преждевременная оптимизация. Такой код гораздо сложнее сопровождать, в нем проще ошибиться - и все ради выйгрыша времени, который толком и засечь-то не удастся.
OrmaJever
Отправлено: 02 Мая, 2011 - 21:20:57
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Нащёт шифровки, чистая md5 очень устаревает т.к. уже много сервисов по подборке, с сольюя думаю тоже могут распаковать. Я раньше выдрал функцию из phpbb3, она похожа на md5 но мало известна
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
EuGen
Отправлено: 02 Мая, 2011 - 21:23:07
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Для БД используйте готовые адаптеры (чтобы не писать свои). Zend к примеру.
Остальное можно вынести в модели - создав соответствующие классы.
Объектный подход почти всегда сопутствует масштибаруемости и гибкости - конечно, если применен верно.
Почитайте также про паттерны проектирования.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Мелкий
Отправлено: 02 Мая, 2011 - 21:58:17
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
kto-to пишет:
Не хочется в итоге получить две килотонны медленного кода, который надо везде подправить.
Именно к этому вы и идёте. В зависимости от личных способностей, килобайтах на 20++ кода начнёте нещадно путаться, потеряете контроль над кодом и придёте к решению, что всё это надо выбросить и писать нормально - так, чтобы было удобно разработчику, ведь его время куда дороже машинного.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.