Добавлено: Вт, 16 Янв, 2007 07:23 Заголовок сообщения: О защите замолвите слово :)
Вот недописанный, но тем не менее рабочий "Register Globals" с фильтрацией всего чего я мог представить (на всякий случай даже base64 закодирование строки раскрывает, смотрит внутри и закрывает )
foreach($_FILES as $name=>$value) {
global $$name;
$value = end(explode(".", $_FILES['userfile']['name']));
if (preg_match("/php|php3|php4|php5|php6|js|htm|html|phtml|cgi|pl|perl|asp/i", $value)) unset($_FILES['userfile']['name']);
}
?>
С массивом $_FILES я впринципе ничего не делал, просто выудил
эти 5 строк со Slaedа, но это явно не катит, теперь думаю как лучше обрабатывать этот суперглобал...ни у кого мыслей нету?
А что этот код вообще делает, и для чего он? Конечно есть догадки, но боюсь их пока говорить.
Не смог я, к сожалению, осилить код в полной мере, особенно прег_реплейсы вложенные друг в друга, к тому же я не понимаю, зачем вообще Регистер Глобалс нужны (чтобы было опаснее?). Что сумел заметить, что в последовательности тегов не хватает наверное еще и onmouseup/down и onblur кажется ).
С вложенностью это надо подумать, писал быстро поэтому можно заоптимайзить...
А насчёт кода - на мой взгляд весьма очевидно, если говорить о безопасности отсносительно сайтов, то всё сводится к тому чтобы "всякую дрянь в в post\get\cookie\files не совали" (ну и ещё отдаваемые браузером такие штуки как HTTP_USER_AGENT, HTTP_REFERER не грех проверять, т.к. туда спокойной можно напихать хтмл, sql иньекции...). Ну так вот, чем фильтровать каждую переменную в своём творении, не проще ли сделать это один раз, в начале так сказать сессии обработки текущего скрипта? Вот именно проще - а заодно и развернем все данные в глобалы, что будет весьма удобно в дальнейшей работе.
Самый примитивный пример: ну допустим есть кодер некий Крутой. А. и есть юзер Ламер. Б., который на самом деле Хакер. Ц. .
Наш А пишет замечательный скрипт по добавлению в базу каких нибудь данных. И есть у него какой нибудь INSERT, в котором участвует пхпшная переменная получаемая из формы (ну допустим). В запарке наш А забывает её обработать хотя бы тем же addslashes и получает в переспективе проблему на свою голову.
А если бы он подключил 50 строк, приведенных мною выше, то Б остался бы с носом, потому как все его попытки вставить гадость были бы надежно отфильтрованы.
З.Ы. А про обработчики - это я не заморчавился и опять же со слаеда паттерн слизнул, не особо пока дописывал.
З.Ы.Ы. Но от обработки полностью конечно не спасёт, кое где придется intvalить переменные...
А зачем вообще выдирать хтмл-теги? По идее их надо на стадии вывода htmlentities(). А тут странно получается... Т.е. такой глобальный подход всем не угождает, и он должен быть сужен мне кажется.
К тому же возникает вопрос, почему для GET нет проверки на addslashes. А также я попробовал, и UNION (как и все что в sql_patterm) через GET проходит, не удаляется... Хотя, опять же, мне кажется его удалять не стоит. Мало ли...
$_GET => врубаемся, медитируем, понимаем что посредствам гет обычно передают 0-9a-zA-Z (в большинстве случаев).
$_POST => тут всё проще удаляем потенциально опасные теги, добавляем слеши, если magic_quotes_gpc off, удаляем SQL иньекции (паттерн хтмл и очистку надо ещё домысливать). То есть впринципе всё остальное остается....можно дальше уже по вкусу отфильтровать что нужно в проекте.
$_COOKIE => тут удаляем все теги, после этого в оставшемся тексте удаляем всё что не попадает под шаблон <>0-9a-z_-;, ,почему - потому что обычно в кукисах хранится всякая служебная инфа типо айдишников, логинов, ну а спец знаки на всякий пожарный - иногда некоторые используют...
$_FILES => ну тут тип файлов нужно проверять, но асоциативный массив двойной, поэтому тут нужно подумать над фильтрацией...
А зачем вообще выдирать хтмл-теги? По идее их надо на стадии вывода htmlentities(). А тут странно получается... Т.е. такой глобальный подход всем не угождает, и он должен быть сужен мне кажется.
К тому же возникает вопрос, почему для GET нет проверки на addslashes. А также я попробовал, и UNION (как и все что в sql_patterm) через GET проходит, не удаляется... Хотя, опять же, мне кажется его удалять не стоит. Мало ли...
Теперь по твоим вопросам...
Хтмль, пришедший от юзера маст дай и этим всё сказано (вспоминаем BB теги...они не просто так задуманы).
Гет не проверяю на "слеширование" - потому что безсмысленно, всё равно ведь все кавычки паттерном 0-9A-Z-_ обрежет.
Пробовал ты очень странно, я не знаю как попробуй вот так:
foreach($_FILES as $name=>$value) {
global $$name;
$value = end(explode(".", $_FILES['userfile']['name']));
if (preg_match("/php|php3|php4|php5|php6|js|htm|html|phtml|cgi|pl|perl|asp/i", $value)) unset($_FILES['userfile']['name']);
}
echo $tit;
?>
А к скрипту обратись что то вроде myscript.php?tit=SELECTUNION'from'admin<script>alert()</script>
Фрагменты SQL иньекций удалять стоит...безопасность не бывает лишней...вероятность же того, что эти слова будут использоватся юзерами сайта очень активно весьма мала...да и если так будет, то кто мешает изменить пару байт.
И в конце концов - я даю общий подход...изменить степень жетскостки фильтрации - не проблема.
Вообщем у меня через POST получилось просунуть кавычки ' " - сделал форму, текстовое поле с именем tit и кнопку, в текстовом поле пишу %22 - выводится кавычка. Странно почему она прошла. А вот это %55%4E%49%4F%4E не прошло. Также получилось автоматически вызвать javascript-программу при помощи кое-какого хитрого метода.
Про остальное могу сказать, что я со многими принципами такого подхода не согласен (например в этом форуме я спокойной могу написать и UNION и <script>).
Почему в тот раз UNION прошел - потому что я написал $_GET[''] (я сначала подумал что этот скрипт и GET перетирает )
Вот про JavaScript попродробнее скажи - куда ты его пихал? В post?
А кавычка в Посте - я тебе уже говорил, в посте они не фильтруются.
Странно, а это что
Цитата:
foreach($_POST as $name=>$value) {
global $$name;
$$name = urldecode(trim($value));
if (!get_magic_quotes_gpc()) $$name = addslashes($$name);
$$name = preg_replace($sql_pattern, "", preg_replace($html_pattern, "", $$name));
}
Насчет JS, засовывал в пост:
Код:
<image src=%22%22 onerror=alert(%22ok%22)>
Если %22 заменить на ", то кавычка слешится.
Код:
foreach($_REQUEST as $name=>$value) {
global $$name;
$$name = htmlspecialchars(stripslashes(urldecode(trim($value))), ENT_QUOTES);
}
В данном случае удаляются все слеши, но проверки на magic_quotes_gpc нету. Что касается url_decode, то он + превращает в пробелы (помимо остальных вещей), и не факт что данные из трех массивов закодированы именно таким образом. К тому же если в них имеются переменные с одинаковыми названиями, то они затрутся (кроме одной). Что касается "моего" подхода, то он заключается не в кодирование спец. символов на стадии получения данных, а в кодировании их на стадии вывода. И вообще, register_globals плохая вещь, по моему мнению. А в мануале я нашел такой комментарий "This directive was removed in PHP 6.0.0."
Так что вот, ничего плохого я против не имею твоего варианта, если тебе он кажется лучшим, просто я сказал свое мнение.
Да причём здесь вообще регистр глобалс? Ну назвал я так метод, и я знаю что в 6 версии его не будет...Опять же я даю подход - подход заключается в централизованной обработке данных. Да и потом, ты говоришь на стадии вывода кодировать...но ведь большинство уязвимостей (типо СКЛ иньекций) направлены не на ухудшение выводимой информации...
addslashes это не фильтрация, а экранирование...
А в моём варианте ошибка...тот кусок кода что ты привел...там $$name надо заменять на какую то переменную, типо $tmp, тогда все заработает.
Насчёт urldecode ну обьясняю же - я даю общий подход, под свой скрипт изменить - пару строчек, согласись несложно.
А код я привел для того чтобы узнать мнение людей, а заодно отловить свои ошибки, со стороны их видно , поэтому спасибо за участие.
Добавлено: Пн, 14 Май, 2007 20:57 Заголовок сообщения:
Здорова... У меня вопр, кто-нить колупал исходники Win32 приложений, для администрирования веб-сайтов, движки которых посроены на MySQL?
PS Хоть это и редкость, однако встречалося мне не так давно, интересно рассмотреть эффективность перед php и Perl приложениями для администрирования движков... _________________ [root@localhost]> echo "<system>" > /var/home/localhost/www/shell.php