Борьба со спамерством на Linux сервере

 Заразили мой блог спамерским вирусом

Боролся несколько часов). Вроде как нагрузка на сервер упала. Очень помогла статья с блога. Привожу здесь копипаст, чтобы не потерять. Источник.

Здравствуйте. Если вас интересует, как заблокировать доступ по IP к сайту нежелательным личностям, спамерам и прочим, то вам надо создать или отредактировать файл .htaccess и воспользоваться командой Order Allow,Deny либо Order Deny,Allow. Между ними есть разница:

  • Order Allow,Deny
    Сначала обработаются разрешающие правила Allow, потом запрещающие Deny, а всё, что не попадает под них, будет запрещено
  • Order Deny,Allow
    Сначала будут обработаны запрещающие правила Deny, потом разрешающие Allow, а все, что не попадут под них, будут разрешены по умолчанию

Обратите внимание на синтаксис, никаких лишних пробелов, иначе можно вызвать ошибку 500 Internal Server Error

Если это касается всего сайта, файл создаётся в корне, если нужно закрыть лишь определённую его часть, например, админку, файл .htaccess должен располагаться непосредственно в этом разделе.
Ну, и конечно же, ваш сервер (бекенд или рабочий) должен быть Apache. Если ваш рабочий сервер NGINX + php-fpm, то править придётся конфигурационный файл nginx.

Забанить спамера по IP диапазону

1
2
Order Deny,Allow
Deny from 192.168.1.1

Это был пример того, как забанить IP (192.168.1.1) спамера, не закрывая доступа всем остальным. Ещё можно пропустить последний октет IP-адреса, Deny from 192.168.1 , тогда будут забанены все пропущенные IP адреса. Однако, вы же понимаете, статичный IP блокировать глупо, он, скорее всего, динамический, поэтому мы берём IP и отправляемся определять подсеть с диапазоном IP, откуда он пришёл. Для этого воспользуемся любым Whois-сервисом, например, этим, ищем строку CIDR или, если её нет, NetRange

Определяем подсеть IP

Определяем подсеть IP

Нам повезло, CIDR (Classless Inter-Domain Routing, Бесклассовая адресация) присутствует, а именно в таком формате лучше всего записывать диапазон IP в htaccess

1
2
Order Deny,Allow
Deny from 192.168.0.0/16

Если CIDR отстуствует, рекомендую воспользоваться калькулятором IP-диапазона в CIDR и данными из NetRange, чтобы получить CIDR.

C#. HelloWorld. I love you C#

Попрактикуемся в C#. Традиционный Hello world

8

 

Delphi. UniGUI. Делаем витрину (showcase) 2 часть

В прошлом посте мы сделали подготовочку. Структуру базы данных, определили основные сущности программы, создали под них таблицы в базе и модули в прекрасной IDE Delphi.

В данном посте добавим функцию добавления товара, выделения товара, удаления товара, а также наладим листание страниц товаров, перестройку витрины в зависимости от новой ширины. Ну и исправим пару мелких глюков в алгоритме. Вот что у нас получится.

Общий вид витрины

90

Выделение товара

91

Добавление товара

94

Перелистнем на следующую страницу

93

Изменим размер формы – как видно товары перестроились в зависимости от новой ширины.

95

Исходники

Continue reading

Delphi. Uploading to Keep2Share. Half Successfull Atempt…

Поступил ко мне небольшой заказ на автоматизацию заливки файлов на файлообменник Keep2Share.cc Всего было у меня 2 попытки делания данного проекта. Сначала опишу неудачную попытку, а в другом посте удачную. Задача стояла таким образом, чтобы сделать заливку напрямую из Delphi программы на сервере Keep2Share.cc

К счастью, у Keep2Share.cc есть API.  Это API работает прекрасно со скриптами PHP,  о чем приводится пример на той же странице с API.

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

Согласно API все транзакции проходят в JSON формате, я научился получать токен авторизации, отправлять тестовый запрос, а вот загружать файл не научился, хотя удалось получить от сервера всю необходимую информацию для отправки файла на сервер. Проблема оказалась в том, что я не смог до конца корректно перевести CURL запрос в INDY. cURL я так понимаю это библиотека, аналогичная InDY, только для C подобных языков.

Получение токена авторизации

77 Continue reading

Delphi. Как подменить и зашифровать произвольный url в браузере, загрузив контент на свой хостинг ?

Данная задача возникла в связи с тем, что понадобилось зашифровать url. Решил её частично. То есть, для простых сайтов без горы скриптов – все будет работать идеально. С горой скриптов все будет работать почти идеально, если сервер сайта наш и там можно будет разрешить кроссдоменные запросы. Это почти – означает тонкую работу со скриптами. Вообще, как я понял, такие трюки запрещены в целях безопасности. Но задачу решать как-то надо было.

Способ №1 – независимый

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

-скачать HTML код страницы с сервера-источника

-подменить все относительные пути (href и src action) на абсолютные, указав сервер-источник

-получившийся HTML код выдать из под другого сервера, адрес которого можно шифровать как угодно.

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

Ограничение №1

Ограничение этого способа в том, что мы прячем только одну страницу. Если на ней есть ссылки, то сервер-источник будет обнаружен при переходе на неё. Но для задачи шифрования одной ссылки – этого вполне достаточно.

Ограничение №2

Ещё одно ограничение, если страница на скриптах фрэймворка, то такой подход тоже может не работать полностью. Тут нужно думать над каждым случаем отдельно.

Ограничение №3

Кросс-доменнные запросы как известно запрещены,

В частности, я работал с сайтом на Yii и при отправке Submit получил ошибку в отладчике браузера

но если есть доступ на сервер, то с помщью php мы можем прописать в скрипте сервера, к которому обращаемся, строку в самом начале файла, разрешающую кроссдоменные запросы

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

 

ШАГ № 1 – Загрузим произвольный сайт на своем сервере

8 Continue reading

Delphi. FireMonkey. Первое приложение под Android – “Позвони маме”

9

В Delphi, насколько я вижу, под Android можно писать на Firemonkey – и тогда мы получим нативное приложение. А можно писать при помощи UniGUI фрэймворка и тогда мы получим приложение работающее через браузер, основанное на популярной библиотеке jQueryMobile.

Плюс первого подхода (приложения на FireMonkey), насколько я понимаю в скорости, производительности программы, а также в том, что есть доступ к железу (вспышка, датчики и др.), минус в том, что такое приложение запустится не на всех устройствах, насколько я вижу по информации с форумов. Но на большинстве.

Ещё один плюс – приложение может быть полностью автономным, не зависящим от сети. Если, скажем использовать базу данных SQLite для каких то небольших приложений.

Также лично для меня, человека работающего с mySQL есть ещё один финт в работе с FireMonkey – напрямую, я оказывается не могу подключиться, в связи с ограничениями в FireDAC – библиотекой доступа к данным, выход – либо переход на другие компоненты либо через DataSnap.

Плюс второго подхода (приложения на UniGUI) состоит в том, что такое приложение будет работать практически везде, где есть браузер и интернет. На айфонах, айпадах, планшетах и так далее. Наверное, это даже удобнее, нежели 100 приложений под разные платформы. То есть, мы выходим за рамки конкретной платформы. Само приложение будет работать через сеть.

Минус этого подхода в том, что у нас практически нет доступа к железу. Но если этого не требуется, а для большинства задач этого достаточно – то всё в порядке. Также хорошо то, что вся мощь javascript библиотек будет под рукой и её можно будет использовать как напрямую, так и через язык Delphi. Другое ограничение – постоянный доступ к сети, но с этим проблем вроде бы нет в современном мире.

Есть ещё и третий подход)) Соединить первый и второй подходы – а именно – завернуть UniGUI приложение в FireMonkey. То есть, если, скажем нам нужно разместить наше приложение в магазине PlayMarket – мы просто берем TWebBrowser и прописываем в нём ссылку на наше приложение на UniGUI в сети. Continue reading

Delphi. TRichView. Как записать контрол в базу и прочитать его оттуда?

Код для примера, без обработки ошибок. Предполагается, что подключение у нас уже создано в отдельном модуле и на форме добавлен компонент FDQuery. Также в базе создано BLOB поле.

Запись в базу через поток MemoryStream

Чтение из базы через поток MemoryStream

Какие тонкие места могут быть?

-Опущу здесь обработку ошибок.

-Во-первых memory stream, если данных будет слишком много, memorystream может не справиться, возможно лучше будет использовать filestream.

-Во-вторых BLOB поле. Чтобы сервер БД не падал, лучше заранее побеспокоиться о максимально возможном значении BLOB поля

5

Delphi. TRichView. Сохранение добавленных картинок в определенную директорию

25

Для меня работа с картинками, в TRichView не была очевидна, поэтому пару дней пришлось поразбираться с тонкостями и нюансами. Мне был интересен аспект сохранения картинок при экспорте в HTML формат (например, методы SaveHTMLEx и SaveHTMLToStreamEx).

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

Я также пробовал искать возможность сохранения картинки “как есть”, то есть имя + расширение, например, FileName.gif, но пока до конца не разобрался. Вот здесь находится полезный пост на эту тему. В принципе, я даже написал тестовый код, но проблема в том, что я не знал, в какой момент его нужно добавить, по идее, в момент If OpenDialog.execute… Continue reading

Delphi. Как открыть папку и узнать об ошибке, если что?

На многих форумах на вопрос – как открыть папку дают примерно такой ответ, а вот так…

На примере папки files, лежащей в директории приложения

Но если немного почитать MSDN и различные умные блоги, то получится вот так…

Такой код хоть и громоздкий, зато даст информацию об ошибке в случае чего.