Защита ajax приложения от CSRF

Как происходит такая атака рассказанно в Ruby on Rails Security Guide, возьму от туда лишь картинку иллюстрирующую процесс атаки:

Предотвратить такую атаку в классическом (не ajax) приложении можно только одним мало приятным способом – дописывать к каждый ссылке и к каждой форме параметры с токеном. В случае ajax приложения мы можем сделать защиту более удобной – без лишних токенов в ссылках.

Как это устроено?
Мы добавляем к каждому запросу заголовок X-CSRF-Token и проверяем этот токен классическим путем.
Передаем токен от сервера клиенту в виде куки, а при ajax запросе просто добавляем его к заголовкам. Кука действительна только в рамках домена, поэтому у нас её не утащат (надеемся что других уязвимостей в нашем web-сервисе нет)

У нас есть 3 случая которые нужно проверять на стороне сервера:

  1. Ajax запрос с верным токеном – всё ок, показываем страницу, выдаем новый токен
  2. Ajax запрос с неверным токеном – шлем лесом (скорее всего левый ajax запрос с другого сайта)
  3. НЕ-Ajax запрос

Последний случай требует специальной обработки, т.к. это именно img src=»..» или iframe src=»…», но так же это может быть первый вход в приложение или F5 или открытие ссылки в новой вкладке.
В случае если к нам пришел такой запрос я выполняю следующий код:

if (preg_match('/\?/i',$_SERVER['REQUEST_URI'])){
$token = "&csrf_token=".$token;
}else{
$token = "?csrf_token=".$token;
}
$url = $_SERVER['REQUEST_URI'].$token;
echo "
-html
-body
Loading....
-script type='text/javascript'
if (parent.document.location.href == document.location.href){
document.location.href='".$url."';
}
-/script
-/body
-/htm;
";
die;

Что он делает (сорри форматер в блоге сломался)? Он выполняет js. о! в теге img js не выполнитсья!
На случай iframe мы проверяем parent.document.location.href == document.location.href – если это iframe – то редирект не произойдет.
Нам осталось только дописать что если токена нет в заголовках, будем ждать его в $_GET.

Таким образом мы защитились от CSRF лучше других: мы не только не даём делать действия, но и не даем узнать информаию пользователя (обрубается любой запрос без токера), мы защищаемся не только от дургих доменов, но и от своего :-) если у нас найдут XSS и воткнут туда img src=’..’ или iframe src=»..» оно злоумышленику не поможет.

Всем удачи!

Рубрика: web | Добавить комментарий

Rails 3 + Unicorn + дефолтный конфиг rails = падения

В дефотлином конфиге config/environments/production.rb написана строчка:
config.cache_classes = true
а она не совместима с опцией конфигурации unicorn:
preload_app true

поэтому одну из этих опций надо ставить в false – и загадочные падения прекратятся.

Примеры таких падений:
undefined method `each’ for nil:NilClass
mysql2 (0.2.6) lib/active_record/connection_adapters/mysql2_adapter.rb:635:in `select’

по прочие undefined method …. for nil:NilClass вылезающие рандомно )

Рубрика: web | Добавить комментарий

Centos 5.7 memcahed – установка

Возникла задача установить memcached на centos 5.7. Вот так я его ставил:
yum install libevent libevent-devel #ставим либы
rpm -iUhv http://checkinstall.izto.org/files/rpm/checkinstall-1.6.1-1.i386.rpm #ставим checkinstall

Качаем исходники, распаковываем, собираем:
curl -O http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
tar -zxvf memcached-1.4.5.tar.gz
cd memcached-1.4.5
./configure --prefix=/usr
make
checkinstall #собираем пакет
rpm -i /usr/src/redhat/RPMS/x86_64/memcached-1.4.5-1.x86_64.rpm #устанавливаем memcached
memcached -u root -d # запускаем memcached

Всё оказалось просто)

Рубрика: web | Метки: , , , | Добавить комментарий

Установка nginx из исходников на ubuntu + HTTP_Push_Module

Вот сценарий игры на бубне для установки nginx+HTTP_Push_Module на Ubuntu.
1) качаем тарболл: wget http://nginx.org/download/nginx-1.1.7.tar.gz
2) распаковываем: tar -zxvf nginx-1.1.7.tar.gz; cd nginx-1.1.7
3) качаем тарболл с push_module: wget http://pushmodule.slact.net/downloads/nginx_http_push_module-0.692.tar.gz
4) распаковываем: tar -zxvf nginx_http_push_module-0.692.tar.gz
5) Ставим зависимости: sudo apt-get install libpcre3-dev libssl-dev
6) конфигурируем сборку: ./configure –prefix=/usr –conf-path=/etc/nginx/nginx.conf –with-http_ssl_module –with-http_realip_module –with-http_gzip_static_module –add-module=../nginx_http_push_module-0.692 –error-log-path=/var/log/nginx-error.log –pid-path=/var/run/nginx.pid
7) Собираем: make
8) ставим утилиту для сборки пакета: sudo apt-get install checkinstall
9) Создаем директорию для конфига: sudo mkdir /etc/nginx/
10) собираем и ставим пакет: sudo checkinstall (надо будет ответить на пару вопросов)

Прописываем в конфиге путь к логу:
access_log /var/log/nginx.access.log main;

Качаем стартовый скрипт, который я написал: /etc/init.d/nginx

Даем права на запуск: sudo chown +x /etc/init.d/nginx
Запускаем: sudo /etc/init.d/nginx start

Бонус: nginx_1.1.7-1_amd64.deb – уже собранный пакет под x86_64 архитектуру

Внимание: с -O3 не собирать.

Рубрика: nginx, web | Метки: , , , | Добавить комментарий

Как обновить CentOS с 5.5 на 5.7

Я недавно сделал yum list updates и понял что на mirror.yandex.ru CentOS 5.5 больше не поддерживается… Ну значит будем обновляться :-)

Обновляться буду в 2 этапа с 5.5 на 5.6 и с 5.6 на 5.7.
В первую очередь сделаем бэкапную версию нашей vps (у меня это выглядит как lvm-снапшот). Потом изменим в /etc/yum.repos.d/CentOS-Base.repo циферки в url с 5.5 на 5.6.
Чтобы увидеть что поменяется в системе и оценить что может сломаться делаем:
yum list updates
У меня всего приехало 156 обновлений. Для того чтобы скачать и установить обновления надо выполнить:
yum update
Перезагружаемся на новое ядро:
reboot
После перезагрузки (если та прошла успешно и всё взлетело) любуемся на:
[root@kitten ~]# cat /etc/redhat-release
CentOS release 5.6 (Final)
[root@kitten ~]# rpm -q centos-release
centos-release-5-6.el5.centos.1

Обновление с 5.6 на 5.7 происходит аналогично, на этот раз приезжает 131 обновление :-)

[piroman@kitten ~]$ cat /etc/redhat-release
CentOS release 5.7 (Final)
[piroman@kitten ~]$ rpm -q centos-release
centos-release-5-7.el5.centos

Чуть позже обновлюсь на CentOS 6.0

UPD: Если у Вас стоял postfix с поддержкой mysql (из centos+) надо после обновления до 5.7 выключить его в /etc/yum.repos.d/CentOS-Base.repo в секциях base и updates. Для этого надо дописать к секциям exclude=postfix. И потом включить его в centosplus, дописав includepkgs=postfix. Потом забекапить конфиги, сделать yum remove postfix && yum install postfix и вернуть конфиги на место. Не забыть – влючить постфикс

Рубрика: Без рубрики | Метки: , | Добавить комментарий

Составляем документацию

Вот и настала пора обновить документацию к LynxCMS. Как я писал она доросла до версии 1.02 Beta. Составленная документация актуальна к 1.01 Alpha.

И кстати, а вы знаете какая бывает документация к таким продуктам? А вот следующая:

  • Внутренняя документация разработчика
  • Внутренняя документация о нагрузочных испытаниях
  • Документация верстальщика – (как сверстать шаблон под LynxCMS)
  • Документация разработчика – (как написать свой плагин/модуль/web-приложение) под LynxCMS
  • Документация пользователя – (как этим всем пользоваться контент-менеджеру)

Предстоит большая работа по созданию скринкастов для пользователей, примеров кода для верстальщиков и пр.

Рубрика: web | Добавить комментарий

LynxCMS 1.02 Beta

LynxCMS дожил до Beta версии. Основные фичи:

  • Работающая CMS занимает в оперативной памяти 1Мб (для сравнения WordPress настроенный по дефолту кушает 10 Мб).
  • Встроенная система интеграции web-приложений работающих по принципу MVC.
    • На одном сайте можно держать N (или даже M ) независимых web-приложений.
    • К ним можно прикрутить единую авторизацию.
  • Встроена поддержка плагинов обрабатывающих контент страницы и преобразующих его

В сборку LynxCMS 1.02 Beta вошли следующие модули и плагины:

  • LynxCMS AntiSPAM – Система защиты от спама в WEB-формах (версия 0.1 Beta)
  • LynxCMS Math – Поддержка математических функций в контенте страницы. (версия 0.1 alpha)
  • JS FormValidation – Валидация форм с помощью JS.

Исходный код по прежнему не выкладываю, до версии 1.xx Stable точно, а возможно и закрою с сделаю CMS платной (да-да я жадный).

Когда же будет Stable?

Стабильная версия будет только после того как на LynxCMS 1.xx будет создано 3 сайта и они проработают не менее полугода без багов и замечаний. Так же для Stable версии необходимо чтобы все модули и плагины были стабильной версии и проработали на сайтах не менее 3х месяцев.

Всем заказчикам сайтов на LynxCMS 1.xx мы даем гарантию того что все найденные  баги будут исправлены и их сайты будут в конечном итоге переведены на LynxCMS 1.xx Stable.

Всем удачи.

Рубрика: LynxCMS | Метки: , , , , , , , , , | Добавить комментарий

WTF code!

Эта статья для начинающих программистов которые спрашивают «Зачем красиво оформлять код?», «Зачем делать foreach ($posts as $post)» когда можно for ($i=0; $i<count($posts); $i++);?»

Обычно на такие вопросы отвечают «чтобы читалось», но человек, который пишет этот код может его сам прочитать в любом случае и не знает может его прочитать другой или нет.

Я хочу написать о том почему же нельзя дупускать говнокод (WTF code) и зачем писать красиво.

Вот мои доводы за красивый код:

  • Такой код сразу понятен, видна структура и минимизировано количество лиших переменных.
  • Стандартные методы такие как foreach ЗАТОЧЕНЫ под свои операции и делают их быстрее и меньше тратят RAM.
  • Такой код легко исправлять.
  • Такой код можно быстро рефакторить.
  • Такой код нестыдно выкинуть в опенсорс.
  • Такой код позволяет избежать проблем с областями переменных (как в примере с foreach, переменная $i может где то уже использоваться, а мы забыли :-) )

Вот несколько примеров говнокода и примеры его исправления:
if ($isok){
return true;
}else{
return false;
}
А надо:
return $isok;

Вот еще:
$('#error-text')[0].innerHTML='Ошибка!';
А надо:
$('#error-text').html('Ошибка');

В данных примерах нормальный код спасает от избыточности и проблем с кроссбраузерностью.

А вот пример говнокода который оочень медленно работает:
$posts=$TLQUERY->query('SELECT * FROM posts;');
for ($j=0; $j<10; $j++){ $post[j]->render();
}

А исправить надо так:
$posts=$TLQUERY->query('SELECT * FROM posts LIMIT 10;');
foreach ($posts as $post)
$post->render();
}

Пишите красивый код! Всем удачи!

Рубрика: Управление проектами | Метки: , , , , , | Добавить комментарий

Обработка изображений в Ruby

Делая очередной сайт, на котром размещается куча фотографий товара, я написал скрипт зажимающий фотки по размеру и оптимизирующий jpeg.

Скрипт я писал на языке Ruby, т.к. он простой и удобный для таких задач. Пришлось поставить себе на CentOS гем ImageMagic (как написано в этом посте), полчиса покопаться в документации и написать скрипт за 5 минут.

Ruby – язык, удобный для написания малениких скриптов, а вот писать на нем что то крупно – увы…

Всем Удачи!

Рубрика: web | Метки: , , , , , , | Добавить комментарий

Долгожданная версия myConfig.ru )

Вот и вышли долгожданная версия моего сайта http://myConfig.ru.
К услугам добавилось оказание услуг рекламы, а хостинг потерпел большие изменения: поменялись тарифы, мы перенесли отдачу статики на nignx, а панелью управления стал ISPManager.

Всем радоваться полчиса!

Рубрика: web | Добавить комментарий

Управление проектами: быстрая разработка и версирование

Вопрос о том как выпустить качественный продукт в кратчаёшие сроки встаёт у любой команды программистов.

Некоторые руководители применяют scrum, который реально не ускоряет разработку, а только разбивает длительную зарзаботку на короткие участки – руководить проще, а тольку – ноль.

Моя же задача, не упростить руководство проектом, а ускорить разработку. Как?

Классика
Обычно делают как:

  • Первый релиз
  • Второй релиз + багфикс к первому
  • Третий релиз + Багфикс ко второму
  • И так до бесконечности

По такой методологии – качественного финального релиза не будет никогда. Новый релиз – новые баги, их фиксят, делая ещё более новые баги. В один момент разработка прикрывается (кладётся на некритичные баги) и остаётся поддержка пользователей, с разъяснениями «как пользоваться этим и как не напороться на баги».

Мой метод: Bug Revision
Я работаю так:

  • Первый релиз
  • Фикс критичных багов, фикс багов юзабилити
  • Второй релиз
  • Фикс критичных багов, фикс багов юзабилити
  • Ревизия на баги: бросаем всю команду на тестирование багов, доплачиваем менеджеру за «тупое пользовательское тестирование» и его тоже бросаем на тесты, аналогично делаем с секретарями, уборьщицами и остальными.
  • Бросаем всю команду разработчиков на фикс багов
  • Выпускаем финальный, реально работающий без багов, стабильный релиз

После такой «Ревизии на баги» – ловяться такие баги, которые не приходят в голову даже самому матёрому тестировщику, они фиксяться и продукт реально стабильно работает. Если что то и останеться – то редкие часные случаи, их можно будет пофиксить в процессе поддержки пользователя.

Всё это работает только при условии подхода к тестам, как я писал в предыдущем посте)))

Удачи!

Рубрика: Управление проектами | Метки: , , | Добавить комментарий

Управление проектами: тестирование

Какое бывает тестирование?
Я разделяю тестирование на следующие части:

  • Unit-тестирование (автоматическое)
  • Функциональное тестирование (автоматическое)
  • HA-тестирование (автоматическое)
  • Тестирование интерфейса (руками)
  • Пользовательское beta-тестирование (руками пользователей)

Unit-тестирование

В моём случае разработки web-приложения (SaaS-системы ffsh.ru) на Ruby-on-Rails это тестирование моделей. Для тех кто не в курсе – это фактически тестирование работы с данными, базой и сопутствующие операции.

Об автоматическом тестировании идёт много споров: нужно/не нужно, отнимет время/сэкономит и т.д.. Я считаю что Unit-тестирование необходимо! Оно поможет избежать потери данных, нарушения их целостности, нарушений логики работы с данными. Времени и сил оно отнимает гораздо меньше, чем на восстановление потерянных/битых данных.

Благо в Ruby-on-Rails сделано многое для того чтобы писать Unit-тесты быстро и легко.

Функциональное тестирование

Функциональное тестирование – это автоматическое тестирование взаимодействия web-приложения с пользователем. Я не уделяю ему много времени и использую только узких местах. Почему? Эти тесты отнимают кучу времени, а критических багов почти не находят. При этом все те же самые операции выполнит тестировщик на этапе «Тестирование интерфейса»

HA-тестирование

HA-тестированием я называю тестирование конструкции под нагрузкой. Для этого я провожу на свой сервер DDoS-атаки, выполняю эмуляцию захода N пользователей одновременно и т.д. Эти тесты необходимы! Многим кажется: «у меня не популярный проект и пользователи туда не ломанутя». Рано или поздно ломанутся и это может стать последним днём для безотказной работы сервиса – он может не только тормозить под нагрузкой, но и вообще упасть (например при DDoS-атаке)

Этому тестированию уделяется много внимания, но времени занимает оно не много: тесты достаточно написать 1 раз и исправлять с появлением нового функционала. Запуск тестов секундное дело, чтение отчёта – минутное.

Тестирование интерфейса
Его я разделяю на 3 этапа:

  • Проверка разработчиком
  • Проверка профессиональным тестировщиком
  • Проверка «тупым пользователем»

Проверка разработчиком

Как известно свой код надо запускать. Но не только запускать, а проверять его до тех пор пока не появиться внутренее ощущение «оно работает», но ни как не «вроде работает». Разработчик знает узкие места и проверяет именно их – это помогает избежать критических ошибок из серии: всё упало, страница временно недоступна, 504 и тд

Проверка профессиональным тестировщиком

Это тоже необходимый момент. Разработчик сказал: «оно работает», но оно НЕ работает! Нужно проверить не только узкие места, но и проблемы с вёрсткой, кривизну ajax-ов и прочее, ну и конечно то что уже проверил разработчик – глаз то у него уже намыленный.

Проверка «тупым пользователем»

Она тоже необходима: «пользователь сделает то, что не придёт в голову ни разработчику, ни тестировщику». Оно именно так. Это важный момент – ведь именно такие «мелкие» баги пользователи и считают самыми страшными. Да, да. Они ничего не понимают в структуре данных, в коде, в ajax и вёрстке. Но они видят что «оно глючит» и это может привести к насмешкам над сервисом, позору, негативному «сарафанному радио»

Пользовательское beta-тестирование

Это последний этап перед окончательным релизом – взгляд реального пользователя, оценка качества, юзабилити. Это помогает допилить сервис до состояния, когда продукт можно отдавать в массы, рекламировать и продавать

Всем удачи!

Рубрика: Управление проектами | Метки: , , , , | Добавить комментарий

выравнивение div переменной ширины по центру другого div переменной ширины

Вот такой я нашел способ

item1 | item2 | item 3


<div style="border: 1px #000 solid; margin-right: 150px; padding: 2px; text-align: center; text-align: -webkit-center; text-align: -moz-center;"> <div style="border: 1px #f00 solid; display: table-cell; margin: 0 auto;">  item1 | item2 | item 3 </div></div>

работает везде, кроме IE6 (ну и фиг бы с ним :-) )

Рубрика: web | Добавить комментарий

как побороть: FUNCTION test.PREG_CAPTURE does not exist

Дело оказалось в том что это внешняя функция и для неё нужно установить библиотеку.
Дело это было на CentOS 5.5 (x86_64)

вобщем ставить либу нужно так:

# wget http://www.mysqludf.org/lib_mysqludf_preg/lib_mysqludf_preg-1.0.1.tar.gz
# tar -zxvf lib_mysqludf_preg-1.0.1.tar.gz
# cd lib_mysqludf_preg-1.0.1
# ./configure --prefix=/usr --libdir=/usr/lib64/mysql
# make && make install

После этого нужно прописать в секции mysqld в файле /etc/my.cnf следующее:

plugin_dir=/usr/lib64/mysql

Перезапустить mysqld

# /etc/init.d/mysqld restart

Зайти в консоль mysql (под root) и установить функцию:

mysql> CREATE FUNCTION preg_replace RETURNS STRING SONAME 'lib_mysqludf_preg.so';

Проверить можно так:

mysql> SELECT PREG_REPLACE('/(.*?)(fox)/' , '$1dog' , 'the quick brown fox' );
+-----------------------------------------------------------------+
| PREG_REPLACE('/(.*?)(fox)/' , '$1dog' , 'the quick brown fox' ) |
+-----------------------------------------------------------------+
| the quick brown dog |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

Рубрика: mysql, web | Метки: , | Добавить комментарий

MongoDB: как я начал

Установка MongoDB на CentOS
Собственно установка MongoDB и драйвера для ruby 1.9.2 на CentOS было простым делом:

# yum install mongodb-server mongodb mongodb-devel
# gem install mongo
# mkdir /var/lib/monodb
# chown mongo /var/lib/mongodb
# /etc/init.d/mongod start

Первым делом я проверил работоспособность сервера:

# mongo test
MongoDB shell version: 1.6.4
Tue Dec 28 10:25:58 *** warning: spider monkey build without utf8 support. consider rebuilding with utf8 support
connecting to: test
>

Варнинг про utf-8 мне не понравился, я решил разобраться в вопросе.
Всё оказалось довольно просто, я скачал оффициальную версию релиза от сюда:
http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.4.tgz
И подменил бинарик /usr/bin/mongo, ругани больше не было :-)

# mongo
MongoDB shell version: 1.6.4
connecting to: test

Первый опыт
коннектимся в mongodb:

$ mongo
MongoDB shell version: 1.6.4
connecting to: test
> use shop_test;
switched to db shop_test

Создаем набор данных:

> db.createCollection('test');
{ "ok" : 1 }

Пробуем различные операции с данными (вставка, выбока всего, выборка по условию):

> db.test.insert({name: 'Vasya', sity: ["piter","kazan"]});
> db.test.find();
{ "_id" : ObjectId("4d1997c2876e9315e8a4f086"), "name" : "Vasya", "sity" : [ "piter", "kazan" ] }
> db.test.find({sity: ["piter"]});
> db.test.find({sity: "piter"});
{ "_id" : ObjectId("4d1997c2876e9315e8a4f086"), "name" : "Vasya", "sity" : [ "piter", "kazan" ] }
> db.test.find({sity: "volgograd"});

Рубрика: web | Метки: , , , , , | Добавить комментарий

Как узнать скорость работы сайта под нагрузкой?

Для этого есть сервис http://loadimpact.com/

Вот результаты теста этого блога:
ссылко

к сожалению максимум только 50 кользователей. Большой пузатый сервер бесплатно не проверишь

Рубрика: web | Метки: , , | Добавить комментарий

Игорь Сысоев: как правильно писать конфиги nignx

Видео с доклада Игоря Сысоева на конференции DevPoint.ru.
В ней не будет рассказов о проксировании запросов или высоких нагрузках, автор расскажет как правильно писать конфиги для nginx.

Рубрика: nginx, web | Метки: | Добавить комментарий

скрыть web от чужих глаз: моя паранойя

Встала задача защитить web. Нужно чтобы никто не знал о существовании web-а, а если узнал то туда не попал.
Имеем виртаулку с CentOS 5.5, сервер apache из репозитория и прямые руки.

Безопасность буду строить по уровням доступа:
* фаервол – остеит много возможных неприятностей. Ну мы конечно помним что когда отсеиваем кучу путей пролезть к нам – они все мелкие и простые. фаервол поможет нам скрыть существование сервиса.
* авторизация – для тех кто прошел фаервол и уже знает о сервисе сделаем авторизацию
* шифрование – это для тех кто обошел фаервол и знает про наличие пароля и хочет его отсниферить.

Первое: закрыть доступ фаерволом для всех, кроме себя. В CentOS по умолчанию закрыты все лишние порты при том с правильным icmp-ответом:

Unable to connect to remote host: No route to host

Осталось только открыть себе доступ:

# iptables -I INPUT -p tcp --dport 80 -s 192.168.90.13 -j ACCEPT
# /etc/init.d/iptables save

Далее я задумался о том что подменить ip в локальной сети не составляет труда, и сделал basic-авторизацию к web. Для этого (в apache) нужно прописать следующее в файле .htaccess в корне web

AuthType Basic
AuthName admin
require valid-user
AuthUserFile /var/www/html/.htpasswd

и создать файл .htpasswd:

# htpasswd .htpasswd username

и ввести пароль для пользователя username

После этого всего я понял что всё это зря – потому что человек который может подменить ip, точно слышал про arp-спуффинг и пароль он соберет с помощью сниффера. Значит мутим ssl.
Как генерить сертификаты я рассказывать не буду – долго и не интересно, да и в интернете полно такой инфы.
А подключить сертификаты в апаче можно указав пути в сертификату и ключу в файле /etc/httpd/conf.d/ssl.conf

не забудьте закрыть доступ к 80му порту и открыть к 443му.

Ну и последняя маленькая хитрость для того чтобы ввести в ступор того кто прошел все круги ада получая доступ к web: перенесем приложение от корня в http://x.x.x.x/application, а в корне сделаем следующее:

echo "" > index.html

Теперь попав к нам в web товарищ увидит пустую страницу.

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


А теперь о том как это можно взломать:
1) фаервол можно обойти 2мя способами – помена ip или физически сесть за мою машину.
2) basic авторизация подбирается перебором.
3) а с ssl даже мучаться не надо, да и с basic тоже – установить мне келогер на машину и слить пароль :-)


Так вот чтобы не взломали – нужно еще и локально защищаться, кстати и виртуалку с CentOS тоже нужно защитить локально :-)

Рубрика: Hack, web | Метки: , , , , , , , , | Добавить комментарий

rmagick version 2 on CentOS 5.5

Столкнулся с тем что установить гем rmagick на CentOS 5.5 без выкрутасов установить нелься, не собирается.

Собсвенно что нужно делать:

#Подготовим библиотеки для сборки
$ sudo yum groupinstall "Development Tools"
$ sudo yum install rpmdevtool libtool-ltdl-devel freetype-devel ghostscript-devel libwmf-devel lcms-devel bzip2-devel librsvg2 librsvg2-devel libtool-ltdl-devel autotrace-devel
$ sudo yum install libtiff-devel giflib-devel djvulibre-devel libXt-devel

#качаем rpm с сорцами
$ wget ftp://ftp.imagemagick.org/pub/ImageMagick/linux/SRPMS/ImageMagick-6.6.5-8.src.rpm

#собираем rpm
$ rpmbuild --nodeps --rebuild ImageMagick-6.6.5-8.src.rpm

#ставим собранные rpm
$ rpm -ihv --force --nodeps /usr/src/redhat/RPMS/x86_64/ImageMagick*-6.6.5*.rpm

#проверим версию:
$ convert -version
Version: ImageMagick 6.6.5-8 2010-11-18 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC
Features: OpenMP

#стовим гем
$ gem install rmagick

Проверим в irb:

[root@pussycat pkg]# /usr/local/bin/irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> gem 'rmagick'
=> true
irb(main):003:0> require 'RMagick'
=> true

Работает :-)

Удачи!

Рубрика: web | Метки: , , , , , , | Добавить комментарий

Принцип работы простой поисковой системы

Поисковая система ищущая в контенте сайта слова состоит из следующих частей:

  • Поисковый паук – это программа, которая ходит по страницам и собирает контент и ссылки на другие страницы.
  • Индексер (indexer) – это программа которая создает индекс из тех данные что собирает паук
  • База данных – база в которой хранятся данные для поиска, и сам индекс.
  • Клиент поиска – это обычно web-интерфейс, который обращается к базе по ключевым словам и выдает пользователю результат

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

Рубрика: sphinx, web | Метки: , , | Добавить комментарий