Фильтрация данных в PHP

you should always be wary of any data provided by outside services

Все данные, поступающие в php-скрипт (да и вообще в любую программу) “извне” следует проверять на “корректность”. Это может быть как защита “от дурака”, так и от “злобного хакера”.

Характерные уязвимости в PHP-скриптах и фильтрация данных

0. Убедитесь, что переменная “та, что надо” (при включении register_globals, существует возможность вместо $_SESSION или $_COOKIE переменной обратиться к $_GET или $_POST; не лишним будет проверить HTTP_REFERER)
1. Все переменные, которые предполагают числовое (целое,дробное, дата-время) значение следует привести к соответствующему типу;
1* Имеет смысл проверить на допустимость (неотрицательное, меньше допустимого максимума,несуществующая дата) в зависимости от контекста;
2. Все строковые переменные, которые имеют ограничение по длине следует “укоротить”
3. Все строковые переменные следует “очистить” от недопустимых символов (можно воспользоваться, например, функцией preg_replace с заданием соответствующего шаблона регулярного выражения - для email, для имени домена, для логина пользователя и т.д.)
4. Во всех данных, попадающих в запрос к базе данных следует экранировать спецсимволы (addslashes/mysql_escape_string… - кавычки, проценты в LikE и т.д.) SQL-инъекции (SQL injection)
5. Все данные, которые выводятся в браузер следует “почистить” от недопустимых HTML-тэгов (xss-уязвимости через тэги начиная от

Начиная с версии 5.2.0 в PHP присутствуют специальные функции для фильтрации данных, см. filter_var. Встроенные константы позволяют не задумываться о регулярных выражениях для email, например (хотя, общее понимание лишним не будет)

Конечно, статья не претендует на полный и исчерпывающий перечень рекомендаций по безопасности и фильтрации в PHP. Это скорее очень краткий обзор некоторых уязвимостей PHP-скриптов (не самого PHP) и информации, как их не допустить в собственных скриптах.

Если будут рекомендации по дополнению списка или корректировке - добро пожаловать в комментарии. Или Orphus =)

Ссылки по фильтрации данных в PHP
http://ru.php.net/manual/en/book.filter.php
http://phpclub.ru/detail/article/2003-12-01
http://phpclub.ru/detail/article/2003-09-23
http://itstep.wordpress.com/2010/05/31/php-vs-aspx/
http://www.webpeeps.ru/article/12

Опубликовано Январь 8, 2011 | автор: levik  |  Без комментариев »

PLESK watchdog new year error: WDExc (pack-sysstats 2011-year-problem)

С новым 2011 годом панель Plesk от Parallels поздравила порцией ошибок:

/usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats day
/usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats week

ERROR: WDExc
Error occurred while processing database query: ‘MySQL query failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘group by service_id, type, round(unix_timestamp(time) / 200, 0) having count(val’ at line 3′

0: /usr/local/psa/admin/plib/modules/watchdog/wdlib.php:1050
wd__db_query(string ’select service_id, type, unix_timestamp(min(time)) as min_time, unix_timestamp(max(time)) as max_time, avg(value) as avg
from module_watchdog_sys_stat where
group by service_id, type, round(unix_timestamp(time) / 200, 0) having count(value) > 1 limit 10000;’)
1: /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats:68
pack_statistics(integer ‘200′, boolean  false, boolean  false)
2: /usr/local/psa/libexec/modules/watchdog/cp/pack-sysstats:49

Что интересно, видимо не меня одного - поскольку обсуждение пошло довольно бурное (правда по началу без каких-либо комментариев со стороны разработчиков) - такие поздравления стали приходить ежедневно на всех серверах с включенным модулем watchdog. При этом версии панели встречаются самые разные 8.*, 9.*

http://forum.parallels.com/showthread.php?t=107458&page=2
Читать целиком »

Опубликовано Январь 2, 2011 | автор: levik  |  Без комментариев »

Синий экран ошибка 0xC0000218: UNKNOWN_HARD_ERROR (BSOD)

Компьютер постоянно перезагружается - отключаем автоматическую перезагрузку после “Краха” системы:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\CrashControlAutoReboot 0

Если компьютер порадовал ошибкой 0xC0000218 на синем экране “смерти”…

Stop 0xc0000218 (0xe11a30e8, 0×00000000, 0×000000000, 0×00000000)
UNKNOWN_HARD_ERROR

или

Stop: 0xc0000218 {Registry File Failure}
Windows не может загрузить ветвь реестра :
\SystemRoot\System32\Config\SYSTEM

(у меня был первый вариант с UNKNOWN_HARD_ERROR)

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

Отключение внешней памяти ни к чему хорошему не привело, а вот ошибка жесткого диска была более вероятна. Восстановить резервную копию реестра (скорее всего она будет далеко “не первой свежести” - мне посчастливилось откопать реестр “чистой” системы) можно из файла:
SystemRoot/System32/Config/Software/Software.bak

(загружаемся с LiveCD/LiveUSB, сохраняем текущий поврежденный файл реестра на всякий случай, и восстанавливаем файл реестра из бэкапа по ману от Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;307545)

Да, надо отметить, что операционка была Windows 2000 и системный каталог - C:\WinNT\ :) и никакого восстановления системы. :)

Если восстановление поврежденных файлов реестра прошло безуспешно, пробуем другие варианты:
http://www.oszone.net/1198/

Опубликовано Декабрь 20, 2010 | автор: levik  |  Без комментариев »

JQuery календарь - календари на Jquery

Широкое распространение JQuery привело к довольно большому количеству красивых javascript-календарей. Иногда достаточно выбрать нужную дату и подставить в текстовый input. Когда необходимо выбрать несколько дат - начинаются небольшие заминки.

Итак, в поиске JQuery календаря с возможностью множественного выбора дат, наткнулся на статью:
coolwebmasters.com/script-library/834-jquery-calendar-plugins.html

jQuery UI datepicker (”официальный” календарь на JQuery) - выбор тем (естественно, возможность изменить), мультиязычность, выбор промежутка дат…
jqueryui.com/demos/datepicker/
emirplicanic.com/javascript/jquery-highlight-multiple-date.php - подсветка нескольких дат

jQuery Datepicker - очень удобный календарь, большое количество функций (выбор периода, множественный выбор дат, мультиязычность.. в общем, рекомендую)
keith-wood.name/datepick.html

jQuery date picker plug-in от kelvinluck.com - множественный выбор
kelvinluck.com/assets/jquery/datePicker/v2/demo/index.html

Свой выбор остановил на календаре от keith-wood

Опубликовано Декабрь 14, 2010 | автор: levik  |  Без комментариев »

Поиск, замена и регулярные выражения в Windows

Notepad Plus Plus позволяет выполнять поиск по маске регулярного выражения. При этом можно задать область поиска - выделенный текст, текущий файл, открытые файлы, каталог.

Для замены с использованием регулярных выражений в Notepad Plus Plus можно указывать подмаску - найденное вхождение регулярного выражения в скобочках в формате \1 \2 (обратный слэш + номер подмаски).

В Macromedia (ныне - Adobe) Dreamweaver есть возможность поиска по регулярным выражениям. Возможность поиска по каталогу (или по сайту, если сайт “прописан” в программе). Комбинируя их, можно получить аналог поиска и замены по нескольким файлам в Linux

Заменить все вхождения <strong>текст для поиска</strong> в выводе (в тексте) на аналогичный тэг но уже в коде
Find/Найти:
<strong>([^&]+)</strong>
Replace/Заменить:
<strong>$1</strong>

В выпадающем списке (Find in/Искать в) - выбираем текущий документ, каталог, сайт, выделенный текст. В общем, место, где следует произвести замену… И заменяем :)

Быстрая замена e-mail на mailto (Notepad plus plus): ([^<>\s]+@[^\s<]+) заменить на  <a href=”mailto:\1″>\1</a>

Опубликовано Декабрь 11, 2010 | автор: levik  |  Комментарий (1) »

Безопасность linux сервера - мелкие хитрости

Мелкие хитрости, которые могут обезопасить сервер на Linux от таких же мелких хулиганов. :)

Сообщение о входе root-пользователя

(Если сообщения не отправляются - можно ознакомиться с некоторыми решениями проблемы mail на сервере с Debian)
Настраиваем отправку e-mail уведомлений при входе root-пользователя в /root/.bashrc:
echo -e "Root Shell Access on `tty` \n `w`" | \ mail -s "Alert: Root Access" mail@example.com

Аналогично можно настроить для SUDO-юзеров:
echo -e "Sudoer Shell Access on `tty` \n `w`" | \ mail -s "Alert: Sudoer Access" mail@example.com

Прячем SSH

Исправляем в /etc/ssh/sshd_config порт на произвольный от 1024 до 65535, не забываем про уже занятые порты (mysql, например), и запрещаем удаленный вход root-пользователя:
Port 65535
PermitRootLogin no

sudo /etc/init.d/sshd restart

Не помешает установить fail2ban
http://blog.sozinov.eu/2007/03/fail2ban.html

Можно поставить rkhunter - он будет периодически интересоваться изменением критически важных файлов (и не только).

И позакрывать все порты :)  Лишние..

http://secure-ubuntu-server.blogspot.com/

upd: http://silverghost.org.ua/2011/01/31/zashhita-servera-i-ezhednevnyj-audit/

http://rus-linux.net/nlib.php?name=/MyLDP/sec/openssh.html

Опубликовано Декабрь 8, 2010 | автор: levik  |  Комментарий (1) »

Ajax - как скачать (сохранить на компьютер) файл

При работе с web-формами генерация содержимого страниц без перезагрузки с использованием технологии AJAX удобна и широко используется. Как быть, если требуется сохранить результат динамически сформированной страницы на локальный компьютер. Конечно, можно выделить нужное, “скопипастить” и сохранить, например в Word. Однако, для удобства пользователя можно предусмотреть возможность получения файла с данными с сервера (экспорт в документ Word, например). Задачу формирования документа в нужном формате пока пропустим (для эксперимента можно воспользоваться “болванкой” test.doc, например) и сразу перейдем к сохранению файла. Однако, не будем забывать, что файл должен генерироваться на основе данных формы и передаваться они будут методом POST (у GET-метода имеются существенные ограничения на длину запроса, что для формирования документов может быть критично)

Подводные камни Ajax-сохранения файла.

Особенность скачивания файлов с использованием Ajax-технологии в том, что “по умолчанию” файл, отдаваемый сервером, попадает туда, откуда был сделан запрос - в JavaScript. То есть после отправки запроса на сервер, браузер, получая ответ, не предлагает “стандартно” сохранить или открыть файл, продолжает выполнение заданного скрипта.

Как скачать файл Ajax-ом?

Итак, если сформулировать задачу более точно, то требуется отправить POST-запрос на сервер и сохранить полученный файл без перезагрузки страницы. Причем, учитывая информацию предыдущего параграфа, отправка запроса должна быть из “реальной” формы и производиться стандартными средствами браузера.

Вариант 0: отправляем данные AJAX, методом POST. Однако, обратно получаем не сам файл, а условный “ключ”, к которому привязываем специально созданный на сервере “промежуточный” файл.  Теперь переход по ссылке с нужным ключом и позволит сохранить нужный файл.

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

Вариант 2 очень похож на предыдущий. С мааленьким изменением - всё действо происходит в отдельном IFRAME-элементе, который также формируется динамически. Делается это на случай, если браузер вместо попытки сохранить файл решит уйти с предыдущей страницы с заполненными данными.. В этом случае переход будет осуществлен во внутреннем документе, основная же страница перезагружена не будет.

Если быть более точным, то отправка и сохранение файла “не совсем AJAX” ( :) совсем не AJAX). Однако, без перезагрузки страницы.

AJAX скачать файл - подборка ссылок:
http://habrahabr.ru/blogs/personal/66772/ - вариант с сохранением временного файла
http://code.msdn.microsoft.com/AjaxFileDownload
http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/

AJAX-загрузка файлов:

http://habrahabr.ru/blogs/jquery/50223/
http://vremenno.net/html-css/file-uploaders-overview/

Опубликовано Декабрь 6, 2010 | автор: levik  |  Без комментариев »

WEB WYSIWYG-редакторы на javascript (онлайн-редакторы)

* статья дополняется. Если Вы знаете WYSIWYG редактор, который здесь не упомянут - пишите в комментарии

TinyMCE - один из наиболее популярных web-WYSIWYG-редакторов. Используется в административных разделах многих популярных CMS.

FCKeditor (CKEditor) по распространенности, возможно, не уступает TinyMCE. Как правило, существует возможность легкого перехода между TinyMCE и (F)CKEditor, если один из них идет редактором по умолчанию в CMS

SPAW Editor - не особо распространенный редактор, однако, довольно удобный. С подробным описанием настройки и установки на русском языке можно ознакомиться здесь.

Wymeditor - “легкий” редактор, который можно без особых настроек выложить для доступа Web-пользователям (не администраторам). При использовании “тяжеловесов” с возможностью загрузки файлов следует быть аккуратным.

Imperavi - визуальный редактор на JQuery. Посмотреть-потрогать и скачать можно здесь:
http://imperavi.ru/redactor/

elrte.ru  - elRTE + elFinder редактор и файловый менеджер для него

http://vremenno.net/js/free-wysiwyg-editors-review/ - более полный список-обзор WYSIWYG-редакторов. Несмотря на краткое описание каждого редактора, общее представление о них составить можно. Возможно, кто-нибудь подберет альтернативу уже имеющимся в арсенале Web-редакторам.

http://xheditor.com/

nicedit.com

Удачи!

Опубликовано Декабрь 3, 2010 | автор: levik  |  Комментарии (2) »

Очередной Winlock - Спасибо за размещение рекламного модуля

Компьютер после загрузки выдаёт “Спасибо за размещение рекламного модуля”, голубое окошко с требованием пополнить счет абонента через терминал оплаты. Одновременно с этим блокируется клавиатура и мышка (кроме Alt+Ctrl+Del кнопки не работают)

[фото coming soon]

Полный текст рекламного баннера (частично..) приведен ниже:

Спасибо за размещение рекламного модуля

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

Желание улучшить технику глубокого минета…

В этом помогут материалы сайта сообщества любителей…

Если по каким либо причинам, Вы хотите удалить данный рекламный модуль
согласно акцептированного ранее соглашения, Вам необходимо совершить следующие действия

Пополните счет абонента Билайн через терминал экспресс-оплаты … на сумму 460 руб.

В окне ниже введите код операции с чека

Внимание! Просим Вас внимательно вводить код, в случае неправильного

У Вас больше не будет возможности досрочного прекращения размещения рекламного баннера

Оплатите в терминале и попробуйте через два часа

Загрузился в безопасном режиме (получилось так, что под другим пользователем - возможно, это существенно), выбрал восстановление системы и откатился на ближайшую точку восстановления. После перезагрузки рекламный модуль с требованием отправить СМС не появился.

Дальше разбираться не стал.

Раньше блокировщики просили отправить СМС (еще один СМС-вирус), сейчас перешли на терминалы - видимо, решили сэкономить на комиссии агрегаторам.

Опубликовано Декабрь 1, 2010 | автор: levik  |  Комментарии (8) »

Произошла ошибка при установке устройства отказано в доступе

При попытке установить принтер (аналогичная ситуация может произойти с любым устройством - сканером, видеокартой..) на компьютер с ОС Windows XP (SP2?) уже на последнем шаге установки драйверов (все нужные файлы скопированы в системный каталог), вдруг компьютер выдает сообщение об ошибке:

Произошла ошибка при установке устройства. Отказано в доступе

Первая мысль - не хватает прав.. однако, установка драйверов производится под учётной записью администратора. Администратор “реальный”, работающий, действующий.. Значит всё не так просто.

Да.. ещё. Если установка производится от имени другого пользователя (меню “Запуск от имени”), возможно, имеет смысл выполнить полноценный вход в систему под администратором.

Device setup error. Access is denied

После непродолжительных поисков ситуация стала проясняться: ошибки могут возникать из-за ограничений для одного или нескольких разделов реестра - после установки драйверов, система просто не может изменить нужные ключи реестра и “вылетает” с ошибкой.

Ограничения на разделы реестра могут устанавливаться программами (в обсуждениях “мелькал” Comodo Antivirus и AVG), причем так, что у администратора не будет хватать прав на их изменение. Любая установка устройств должна выполняться с правами администратора, однако после установки ограничений любому администратору в доступе будет отказано. Таким образом, когда установка подходит к моменту изменения ключей реестра, она завершается с ошибкой доступа.

Что делать, если произошла ошибка при установке - отказано в доступе?

Вариант первый самый простой (и, скорее всего, он не сработает) - перезагрузить компьютер; перезагрузить в безопасном режиме - если файлы заблокированы работающей программой, то после перезагрузки в безопасном режиме есть вероятность их “разблокировки”.

Вариант второй является логическим продолжением первого - после перезагрузки отключаем все антивирусы и файерволлы. Довольно часто именно программы безопасности блокируют изменение реестра. Однако, в этом случае следует понимать риск, желательно отключить компьютер от интернет и от сети (если возможно - мало ли, вдруг принтер сетевой) После удачной установки желательно перезагрузить компьютер.

Вариант третий - используем утилиту “от производителя” - Microsoft Fix It. Программа имеет дружелюбный интерфейс, лицензионное соглашение. Однако, во время работы следует набраться терпения - может показаться, что она зависла. Скорее всего, дело в большом количестве файлов, которым нужно изменить доступ.

Четвертый вариант (похож на третий в “полуавтоматическом” режиме) при помощи утилиты subinacl.exe
http://support.microsoft.com/kb/949377/en-us/#letmefixit - довольно подробная инструкция на английском языке

В моём случае вполне успешно сработала утилита Microsoft - весь доступ был восстановлен примерно минут за двадцать.

Опубликовано Ноябрь 26, 2010 | автор: levik  |  Комментарий (1) »