суббота, 26 сентября 2009 г.

HTML Guardian де-обфускация

Задача. Есть javascript с защитой от дурака, но страница прошла обфускацию с помощью продукта HTML Guardian. Необходимо расшифровать.

Все, что нужно для этого вписать в body следующий вызов
body onunload="alert(document.body.innerHTML)"

После обновления страницы можно читать код в нормальном виде.

Забавный взлом с элементами волшебства :)
Читать дальше...

суббота, 19 сентября 2009 г.

Мониторинг ресурсов и информация о железе в GNU/Linux

В данной заметке содержится информация об утилитах GNU/Linux, позволяющих производить мониторинг ресурсов компьютера, а также выводить информацию об установленном компьютере "железе".

Информация о процессоре
Информацию о частоте процессоре, объеме кэша и множество другое можно получить следующим образом
cat /proc/cpuinfo


Информация о памяти в системе
Информацию об установленных планках можно получить с помощью команды
sudo dmidecode -t memory

Информация о свободной и используемой памяти в системе выводим с помощью
free

Например,

gurza@cave:~$ free
total used free shared buffers cached
Mem: 509144 502728 6416 0 13348 66424
-/+ buffers/cache: 422956 86188
Swap: 995988 494180 501808

где
total - всего доступной физической памяти. Некоторая область оперативной памяти может быть зарезервирована ядром, поэтому показатель total может быть меньше реального объема оперативной памяти.
used - используется памяти (used=total-free)
free - незадействованая память. На самом деле память задействованная в кэшах(cached) тоже является свободной и может быть использована в любое время, если есть на то нужда какого-то процесса. Работает принцип "свободная память - потерянная память".
shared - память распределенная между процессами, но по непонятной причине всегда показывает 0 :)
buffers - память используемая в буферах.
cached - память используемая для кэширования.
-/+ buffers/cache - использованная память без учета буферов и кэшей/свободная память с учётом буферов и кэшей
swap - использование swap-области


todo...
Читать дальше...

вторник, 11 августа 2009 г.

PHP: определение возраста

Проблема: На сайте могут регистрироваться только совершеннолетние пользователи. При регистрации нового пользователя спрашивается его дата рождения. Необходимо определить достиг пользователь совершеннолетия или нет?

Решение.
В начале необходимо обработать данные, введенные пользователем. В данном случае пользователь вводит дату в формате DD.MM.YYYY, иными словами имеем
$date="11.08.1984";

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

$arr = explode('.',$date);
$day = $arr[0];
$month = $arr[1];
$year = $arr[2];

Функция explode() используется для разделение строки на элементы по разделителю (первый параметр). В данном примере разделитель - точка.
Далее формируем строку, которую можно было бы передать функции strtotime(), которое возвращает метку времени в Unix.

$date1 = arr[2].'-'.arr[1].'-'.arr[0];

И вот кульминация :) На многочисленных сайтах в сети расписываются сложные функции, которые пытаются подсчитать количество високосных лет, делят, умножают... Я это сделал красиво
echo (gmdate('Y', time() - strtotime($date1)) - 1970);


З.Ы. Камень в M$ :)
PHP Manual: gmdate

The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer). However, before PHP 5.1.0 this range was limited from 01-01-1970 to 19-01-2038 on some systems (e.g. Windows).

А если почитать что писали в мануале к PHP4, например, из данного учебника.

Замечание: В семействе ОС Microsoft Windows системные библиотеки, реализующие эту функцию, содержат ошибки, поэтому функция gmdate() на этих системах не поддерживает отрицательные значения аргумента timestamp.

В операционных системах Unix/Linux эта проблема не возникает, так как системные библиотеки в этих системах реализованы корректно.

PHP не может исправить ошибки в системных библиотеках. Для решения этой и подобных проблем обращайтесь к производителю операционной системы.


Последний абзац приятно улыбнул)))

Реализация проверки даты на сайте (попросил расшарить один человек)

if (isset($_GET['bday'])) {
if (!eregi('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}$', $_GET['bday'])) {
$message = 'Некорректный формат даты.
';
$message .= 'Введите пожалуйста Вашу дату рождения в формате дд.мм.гггг (например, 29.11.1985).';
} else {
$arr = explode('.',$_GET['bday']);
$day = $arr[0];
$month = $arr[1];
$year = $arr[2];

$bday = $arr[2].'-'.$arr[1].'-'.$arr[0];
if ( $bday=strtotime($bday) ) {
$bday = (gmdate('Y', time() - $bday) - 1970);
} else {
$valid = 'false';
$message = 'Некорректный формат даты.
';
$message .= 'Введите пожалуйста Вашу дату рождения в формате дд.мм.гггг (например, 29.11.1985).';
echo "[{val:'$valid',msg:'$message'}]"; exit;
}
if ( $bday>=18 ) {$valid = 'true'; $message='';
} else {
$valid='false';
$message = 'Извините, но согласно правилам регистрироваться на сайте могут только совершеннолетние.';
}
}
}


Подразумевается, что после выполнения данной проверки будет сформирован ответ в формате json, вида [{val:'$valid',msg:'$message'}]. На самом деле без полного кода проверки формы регистрации этот кусок кода нельзя просто взять и использовать. Но если кому-нибудь лень написать элементарное регулярное выражение, то можете скопировать с моей реализации :)

Читать дальше...

суббота, 3 января 2009 г.

Первоначальная настройка сетевых интерфейсов

В данной статье будет рассмотрена первоначальная настройка сетевых интерфейсов (беспроводные сетевые интерфейсы не рассматриваются) в операционной система Debian GNU/Linux. Конфигурирование будет производиться путем редактирования специфичных для Debian конфигурационных файлов, а также будут приведены примеры использования профессиональной утилиты администрирования сети ip.

Установка утилиты ip
Вообще говоря, первоначальное конфигурирование сетевых интерфейсов можно легко произвести и без утилиты ip, пользуясь стандартной утилитой ifconfig, которая присутствует в каждом (думаю, что не ошибся) дистрибутиве GNU/Linux. Но помимо конфигурирования сети нашей целью будет являться освоение утилиты ip, которая, безусловно, понадобится нам впоследствии. Установка производится командой
root@debian:~# apt-get install iproute

Настройка IP-адреса сетевых интерфейсов
Прежде чем приступать к конфигурированию сети, необходимо узнать названия сетевых карт для соответствующих интерфейсов. Сделать это можно, выполнив команду
root@cave:~# dmesg | grep -i eth
r8169 Gigabit Ethernet driver 2.2LK-NAPI loaded
eth0: RTL8169s/8110s at 0xffffc20000030000, 00:0f:ea:66:40:f6, IRQ 193
eth1394: eth0: IEEE-1394 IPv4 over 1394 Ethernet (fw-host0)
r8169: eth1: link up
В примере, показанном в листинге выше, все достаточно просто. В компьютере установлено только два контроллера, причем меня интересует настройка только Ethernet сетевой карты Realtek, которой соответствует сетевой интерфейс eth0. Приведу еще один пример
root@gn:~# zcat /var/log/messages.6.gz | grep -i eth
Nov 10 19:11:51 gn kernel: e100: eth0: e100_probe: addr 0xfe9fd000, irq 169, MAC addr 00:30:48:22:2B:F8
Nov 10 19:11:51 gn kernel: e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection
Nov 10 19:11:51 gn kernel: e1000: eth3: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex
Во-первых, стоит заметить, что использовалась другая команда для определения соответствия сетевых карт и интерфейсов. Дело в том, что команда dmesg выводит на экран только содержание файла /var/log/messages, но так как сервер gn, листинг с которого приведен в примере, имеет uptime порядка 50 дней, то записи стоит искать в более старом файле. Сетевой интерфейс eth0 соответствует интеловской сетевой карте, встроенной на материнской плате, eth1 и eth3 – две гигабитные карты, которые когда-то использовались для соединения двух различных сегментов сети. Получив эту информацию можно переходить к настройке.

Настройка статического IP адреса
Открываем файл /etc/network/interfaces своим любимым текстовым редактором и создаем следующие записи
root@cave:~# cat /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth1
iface eth1 inet static
address 192.168.1.11
netmask 255.255.255.0
gateway 192.168.1.1
Рассмотрим настройки более подробно. Запись auth eth0 означает, что интерфейс должен быть автоматически запущен при загрузке операционной системе.
iface eth1 inet static
Означает, что происходит конфигурирование сетевого интерфейса eth1 и что IP-адрес будет задан статическим.
address 192.168.1.11 – непосредственно IP-адрес, присваиваемый сетевому интерфейсу;
netmask 255.255.255.0 – маска сети;
gateway 192.168.1.1 – шлюз, который должен осуществлять маршрутизацию в сети.
Настройка динамического IP адреса
Рассмотрим пример файла /etc/network/interfaces, позволяющий сконфигурировать сетевой интерфейс для получения динамического IP-адреса.
root@cave:~# cat /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth1
iface eth1 inet dchp
Легко видеть, что строка iface eth1 inet dchp определяет получение сетевого адреса по протоколу DHCP, то есть сетевой интерфейс получит динамический IP-адрес.
Замечание. Для получения динамического адреса в операционной системе GNU/Debian должен быть установлен пакет DHCP-клиента.
root@cave:~# dpkg -l | grep dhcp
ii dhcp3-client 3.0.4-13 DHCP Client
ii dhcp3-common 3.0.4-13 Common files used by all the dhcp3* packages
Замечание. Обычно, для облегчения работы пользователей компьютерной сети системный администратор настраивает DHCP сервер таким образом, чтобы он передавал адреса первичного и вторичного DNS серверов при выдачи динамического адреса. Поэтому для некоторых настройка сети ограничивается записью двух строчек в файл /etc/network/interfaces. Но не лишним будет знать, как все-таки прописать руками доверенные DNS сервера в систему.

Настройка адресов DNS-серверов
Задать адреса DNS-серверов в GNU/Debian можно в файле /etc/resolv.conf, отредактировав его в любимом текстовом редакторе. Например, так
root@cave:~# vim /etc/resolv.conf
Адреса прописываются следующим образом
nameserver 192.168.1.1
nameserver 4.2.2.2
Отметим, что записей nameserver может быть произвольное количество.

Изменение MAC-адреса сетевого интерфейса
Вопрос изменения MAC-адреса волнует, хоть это может показаться странным, многих пользователей. Очень часто провайдер делает привязку MAC-адреса сетевого интерфейса к порту управляемого свитча, чтобы ограничить количество устройств, которые пользователь услуг данного провайдера может использовать. Универсальным решением в такой ситуации для пользователя становится установка собственного активного сетевого оборудования, которое будет предоставлять доступ к ресурсам провайдерам внутренней сети пользователя. Но иногда банально не хочется звонить провайдера лишь по тому, что у пользователя появился на несколько дней, неделю новый лаптоп, с которого необходим доступ к сети. Но этим примером, конечно, не исчерпывается весь список, когда нужно сменить MAC-адрес сетевой карты.
Приведу несколько способов изменения MAC-адреса в GNU/Debian. Если требуется использовать новый MAC достаточно длительный промежуток времени, то его целесообразно задать в файле /etc/network/interfaces. Делается это следующим образом
auto eth0
iface eth0 inet dhcp
hwaddress ether 01:02:03:04:05:06
Конечно, вместо 01:02:03:04:05:06 – необходимо указать нужный Вам MAC. Отметим, что при использовании стационарного IP-адреса MAC-адрес будет прописываться точно также.
Если требуется задать MAC-адрес только для данной сессии (имеется в виду, что после перезагрузки компьютера будет использоваться MAC по умолчанию).
root@cave:~# ifconfig eth0 down
root@cave:~# ifconfig eth0 hw ether 01:02:03:04:05:06
root@cave:~# ifconfig eth0 up

Применение настроек
Чтобы настройки сетевых интерфейсов (касается внесения изменений в конфигурационные файлы resolv.conf и interfaces) вступили в силу в GNU/Debian необходимо выполнить следующую команду
root@cave:~# /etc/init.d/networking restart

Мониторинг настроек и работы сетевых интерфейсов
Для наблюдения за состоянием сетевых интерфейсов мы будем использовать утилиту ip.
root@debian:~# ip addr show
Позволяет вывести на экран сведения о всех сетевых интерфейсах системы. Для вывода информации по конкретному интерфейсу нужно использовать команду
root@debian:~# ip addr show eth0
Чтобы узнать какие используются DNS-сервера в системе, необходимо выполнить команду nslookup.
gurza@hird:~$ nslookup
> server
Default server: 193.232.114.64
Address: 193.232.114.64#53
Default server: 212.192.229.127
Address: 212.192.229.127#53
В приведенном примере на компьютере hird используются два DNS-сервера, с IP-адресами 193.232.114.64 и 212.192.229.127 соответственно. Связь осуществляется по стандартному 53 порту.
В качестве запроса в консоли nslookup можно задавать IP-адреса, чтобы получить в ответ доменное имя
gurza@hird:~$ nslookup
> 4.2.2.2
Server: 193.232.114.64
Address: 193.232.114.64#53

Non-authoritative answer:
2.2.2.4.in-addr.arpa name = vnsc-bak.sys.gtei.net.
а также доменные имена, чтобы получить в ответ IP-адреса.
gurza@hird:~$ nslookup
> gurza.ipib.msu.ru
Server: 193.232.114.64
Address: 193.232.114.64#53

Name: gurza.ipib.msu.ru
Address: 212.192.237.30
Временно перенаправить запрос к другому DNS-серверу можно следующим образом
gurza@hird:~$ nslookup
> server 4.2.2.2
Default server: 4.2.2.2
Address: 4.2.2.2#53
> lab110.imec.msu.ru
Server: 4.2.2.2
Address: 4.2.2.2#53

Non-authoritative answer:
lab110.imec.msu.ru canonical name = hird-u.imec.msu.ru.
Name: hird-u.imec.msu.ru
Address: 193.232.114.5


Читать дальше...