LINUX.ORG.RU

[php, mysql] ламерский вопрос по безопасности


0

0

мне надо написать сайт для нашей фотостудии. пару тредов уже создавал.

вот что меня беспокоит:
насколько будет безопасен мой индускод, если для посетителей не будет никаких регистраций и прочее, а только «добавить в закладки» (готовым скриптом контактика), написать в гостевуху и т.п.

все «передаваемые на сервер значения переменных» сведутся лишь к выбору фоток по ключевому слову, да категории.

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

хостинг - не домашний, виртуальный юниксовый на хц.ру


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

Вырубить нафиг все magic_quote_gpc как сбивающие с толку и внимательно смотреть, чтобы ни в один запрос не шли никакие сырые данные.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> внимательно смотреть, чтобы ни в один запрос не шли никакие сырые данные.

можно чуть детальней?)
всмысле «скажи конкретнее, что гуглить» = )

ставить проверку на ввод из адресной строки? все что не разрешено - все игнорить?

dk-
() автор топика

>все «передаваемые на сервер значения переменных» сведутся лишь к выбору фоток по ключевому слову, да категории.

Вот тут внимательнее. Распространённые классические ошибки:

directory traversal (file.php?page=../../../etc/shadow)

и sql-инъекции (file.php?category=cat_photos; DROP TABLE photos;)

anonymous
()

Заюзай какой-то фреймворк, ну или хотя бы ORM. Это и упростит задачу и заодно подымет уровень безопасности.

urxvt ★★★★★
()

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

Вариант №1: выкинуть ПХП.

Вариант №2: не изобретать велосипед.

anonymous
()
Ответ на: комментарий от dk-

можно чуть детальней?)

Предполагается, что ты не используешь ни ORM'ов, ни PDO всяких. Тогда запросы у тебя идут, типа

mysql_query("SELECT * FROM keywords WHERE keyword = '".mysql_real_escape_string($keyword)."'");
или
mysql_query("SELECT * FROM keywords_map WHERE keyword_id = ".intval($keyword_id)."");

То есть не подставляй сырые данные со входа в духе

$keyword = $_GET['kw'];
mysql_query("SELECT * FROM keywords WHERE keyword = '{$keyword}'");

В последнем случае - это прямая дорога к SQL-инъекции. Хотя сейчас в PHP с этим стало сильно лучше, но не нужно рисковать :) Ну и, что куда важнее, чтобы система не сыпалась с ошибками, если юзером будет вводиться что-то с кавычками.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

что легче для изучения на ходу ? ;) да для примитивных проектов.

2.
велосипедостроение это да... одна из моих черт.

но все готовые движки - не подходят. или требуют СТОЛЬКО напильника, что проще писать.

заказывать... ну итак есть куда деньги тратить после расширения студии, да и самому интересно.

dk-
() автор топика
Ответ на: комментарий от anonymous

Хотите прикол расскажу про directory traversal. Когда-то нашел в одном проекте нашей конторы такое, ну и доложил старшему программисту, так сказать. Так он сказал что это ерунда ибо на нашем хостинге чего-то там как-то настроено что данную уязвимость нельзя эксплуатировать.
Чего-то вспомнилось, и аж настроение поднялось. И да, я там до сих пор работаю. :)

urxvt ★★★★★
()
Ответ на: комментарий от dk-

Я когда-то читал мануалы по Симфони и туговато они мне давались. Но потом делал проект на Yii, делать на нем проект и изучать его в процессе оказалось очень просто.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Между прочим, directory traversal встречался даже на достаточно серьёзнях государственных сайтах (если их можно назвать серьёзными) :)

Так он сказал что это ерунда ибо на нашем хостинге чего-то там как-то настроено что данную уязвимость нельзя эксплуатировать.

Он, скорее всего, что-то когда-то слышал про chroot.

anonymous
()
Ответ на: комментарий от dk-

>но все готовые движки - не подходят. или требуют СТОЛЬКО напильника, что проще писать

На моём движке всё это в считанные минуты пишется. Но под него нет документации ;)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Для меня тут главное было то как он отреагировал на это. Это поправить можно было одним strreplace'ом, в крайнем случае но Nobody cares...

urxvt ★★★★★
()
Ответ на: комментарий от KRoN73

Я то и не сомневался. Это была шутка юмора ;)

urxvt ★★★★★
()
Ответ на: комментарий от KRoN73

подверждаю.
был глюк - все «поехало» и цветом красным добавилось «сверху»
и было видно много кода в таблицах.
а теперь все ок опять.

dk-
() автор топика
Ответ на: комментарий от dk-

На голом пхп уж точно противопоказанно писать. Тут нужен фреймворк, там много рутины, в том числе и по безопасности, уже сделано.

Symfony, Yii это перебор для небольших задач. Смотри небольшие фреймоврки, такие как CodeIgniter, Kohana.

Как вариант, можешь посмотреть на Python. Там тоже всякие фреймворки. Django это как Symfony, не для мелочи.

anonymous
()
Ответ на: комментарий от KRoN73

Странно... Теперь нормально, но еще пару минут была ошибка про не найденный файл/катало. Причем я тогда обновил страницу пару раз.

urxvt ★★★★★
()
Ответ на: комментарий от dk-

Гы. Глянул в логи, понял. Я там, раз уж ссылку кинул, на главной дописал ссылки на timeline trac'ов. Бэкенд на главной - в plain/text'е. mc, в котором правил файл, при открытии создаёт временный файл, который система и не переварила :)

Вообще, дурацкий бэкенд в виде «одно свойство объекта - один файл», но из plain/text'овых - самый быстрый :)

...

Кстати, вот близко к сабжу, в начале года делал «знакомой знакомого» сайт: _http://millystudio.ru/

Правда, тут ключевых слов нет, только категории. И код, к сожалению, показать не могу.

А вот просто работа с ключевыми словами: http://forums.balancer.ru/tags/ - тут код лежит на http://trac.balancer.ru/bors-airbase/browser/classes/bors/balancer/board/keyw...

Но это самый первый вариант работы с ключевыми словами на сайте, поэтому самый некрасивый. Сейчас можно в несколько раз сократить, но пока без надобности.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

такие как CodeIgniter, Kohana.


Если Kohana это ещё нечто допустимое, то CI это такой отстой, что даже отстой.

Viglim
()
Ответ на: комментарий от urxvt

Вот не люблю я фрейморки, где нужно писать

 $this->render('tagsCloud', array( 'tags' => $tags, 'tagWeights' => $tagWeights, )); 

«Машина должна работать. Человек - думать». Пусть такой фигнёй контроллер фреймворка занимается. А задача программиста - подготовить данные :)

У меня по дефолту рендеринг всюду автоматический. Хотя в особых случаях, понятно, можно или свой рендерер повесить, или вообще на низком уровне всё отдать. Мне, кстати, именно поэтому Django не понравился. Очень много рутинной писанины.

...

Кстати, как там в Yii с ORM? В облаке тэгов, надеюсь, количество запросов не зависит от количества тэгов?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

В облаке тэгов, надеюсь, количество запросов не зависит от количества тэгов?


Нет, если скажем, нужно отобразить бд-таблицу как html-таблицу, то просто создаёшь CActiveDataProvider и рендеришь через, например CGridView. То есть делается один запрос, результаты пишутся в массив, и они по очереди рендерятся.

Viglim
()
Ответ на: комментарий от KRoN73

«Машина должна работать. Человек - думать». Пусть такой фигнёй контроллер фреймворка занимается. А задача программиста - подготовить данные :)

Вот с этим я согласен. Видно у автора просто свой накрут.

Кстати, как там в Yii с ORM? В облаке тэгов, надеюсь, количество запросов не зависит от количества тэгов?

Честно говоря, сложных связей я на нем не делал, но судя по их ченджлогу они быстро прогрессируют. Да не должно зависеть от количества тегов, это было бы вообще ... :)

Вот например связь тегов с цитатами (в проекте просто список цитат, и к каждой может быть прикреплено множество тегов). Это находится внутри самой модели. ИМХО, все довольно просто. Первые две связи позволяют нам просто узнать сколько цитат связанно с данным тегом.

/**
 * @return array relational rules.
 */
public function relations()
{
    return array(
        'quotesCount' => array(self::STAT, 'Quote', 'QuoteTag(tagId, quoteId)'),
        'approvedQuotesCount' => array(self::STAT, 'Quote', 'QuoteTag(tagId, quoteId)', 'condition' => 'approvedTime'),
        'quotes' => array(self::MANY_MANY, 'Quote', 'QuoteTag(tagId, quoteId)'),
    );
}

urxvt ★★★★★
()
Ответ на: комментарий от Viglim

Я к тому, что, скажем, у нас m2m. И есть отдельно объект ключевого слова, объект, к которому это слово привязывается и объект - связь между ключевым словом и объектом привязки.

Ну, короче, фото, ключевое слово и их связь для конкретики.

Нужно вывести конкретный тэг. В популярных фреймворках мы грузим объект ключевого слова (один запрос) + грузим соответствующие ему связи (хорошо, когда один запрос, но уже даже тут у некоторых может быть N запросов - загрузка связей по одной) + грузим соответствующие объекты (тут почти у всех - M запросов, по числу связей).

В Yii есть оптимизация на эту тему? Ибо тут при объектной работе достаточно трёх запросов (я обычно практикую такой подход), при прямой работе с SQL - одного (но это уже не ORM).

KRoN73 ★★★★★
()
Ответ на: комментарий от urxvt

Во сколько запросов это выльется при выводе?

(убежал по делам, вернусь через несколько часов, продолжим ;))

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

В Yii есть оптимизация на эту тему?

Да, тут используется with, который позволяет указать какие данные мы хотим выбрать. Например. Следующий код вернет все теги.

Tag::model()->findAll($criteria);
А следующий все теги, но в каждом объекте (теге) будет заполнено поле с его цитатами.
Tag::model()->with('quotes')->findAll($criteria);

urxvt ★★★★★
()

Я бы сильно советовал: 1. Либо готовый движок; 2. либо на Python.

Divius ★★
()
Ответ на: комментарий от KRoN73

Сейчас много :) Пишет что lazy loading. А я и не подозревал что оно так. Нужно будет поправить.

urxvt ★★★★★
()

достаточно юзать mysqli а лучше pdo, они сами весь эскейп делают...

anonymous
()
Ответ на: комментарий от KRoN73

чел, твое двигло кал. может он и выходит вперед по какимто узкоспециализированным задачам на как гп не годится никуда/ хватит его тут пеарить, один человк никогда не доогонит стаю

anonymous
()
Ответ на: комментарий от anonymous

>на как гп

Как ето путет па рюски?

хватит его тут пеарить


Насколько я помню, я свой mysql-драйвер на ЛОРе упоминаю первый раз :D И это не смотря на то, что он уже пару лет лежит у меня в obsolete/

один человк никогда не доогонит стаю


А зачем её догонять, если она часто летит куда-то вбок? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от urxvt

> на нашем хостинге чего-то там как-то настроено что данную уязвимость нельзя эксплуатировать.

Safe mode? Ну так с ним других граблей не оберешься :) А вообще, уязвимость детская, ни один серьещный проект так файлы не должен подключать

boombick ★★★★★
()
Ответ на: комментарий от splinter

> Просто не используй метод GET и фильтруй входящие данные с помощью htmlspecialchars.

lol. На htmlspecialchars познания в области уязвимостей заканчиваются? И почему не использовать GET? Страшно? =)))

boombick ★★★★★
()
Ответ на: комментарий от splinter

Не-не, тесты пусть вам гинеколог устраивает :) А к разработке вас на пушечный выстрел подпускать нельзя :)

boombick ★★★★★
()
Ответ на: комментарий от boombick

Я, чесно говоря, совсем не в курсе что там и как на серверах, к ним разработчики доступа не имеют. Согласен, что такой код нормальный программист не напишет.

urxvt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.