- 1
- 2
- 3
- 4
- 5
<?php
$url = $_GET['url'];
$url = str_replace('http://', '', $url);
echo '<a href="http://$url">123</a>';
?>
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+155
<?php
$url = $_GET['url'];
$url = str_replace('http://', '', $url);
echo '<a href="http://$url">123</a>';
?>
странная, конечно, логика - убирать протокол, а потом вставлять... Наверное, это, типа что бы он обязательно был, но один раз.
а к тому же не учтено, что протокол может оказаться не только вначале (хотя, если правильно, то должен быть проэскейпен)
про echo, наверное, скажет кто-нибудь другой, но больше меня насмешило хардкод название 123.
дело в том, что в книжках для начинающих об этом ни гугу. Я тоже, помнится, узнал о проблеме безопасности, считаю, поздновато. Нет, ничего не сломали, но, помнится, зафиксировал попытку ввода "странных" данных - скобки, кавычки и пр. Тогда даже не понял, зачем...
даа что говорить! если вот в школах деток учат математике, физике, химии, биологии, а межличностным и межполовым отношениям - нет. Напротив, были когда-то предметы в школе "этика", "религия" - так ведь тоже отменили, мол, за ненадобностью! То есть, ребенок тригонометрию среди ночи тебе отчеканит, а как решать повседневные проблемы и конфликты - он либо не знает, либо "просвещается" там и так, как точно только во вред...
Больно конечно, кому будет приятно, если сайт работал работал, а на него, к примеру повесили инклудом брут хешированных паролей от левого сайта, хрена, мощности серваку не занимать, но все же ресурсов будет жечь немерено.
Тонкий намёк на Rumba CMS? У неё ещё автор с таким пафосным ником ходит - Maestro - и удаляет неугодные комменты X))
вот где профи..., эх..., дорасти бы...
> анализ безопасности требует не только опыта, но и внимательных и тщательных проверок (недосмотрел с недосыпу - и полезли в дыру
...а составление запросов привёл лишь как пример того, что в ряде случаев ручную заботу о безопасности возможно эффективно заменить автоматикой. До обезьянок это, кстати, частенько не доходит. Собственно, почему запросы-то вспомнились: мне известны случаи, когда последователи тупых авторов тупой литературы по PHP писали несколько сот килобайт кода с использованием ручного приведения типов и экранирования. Сляпать примитивнейший квери билдер хотя бы для INSERT'ов соображалки недоставало. Вопрос поиска дырок в их поделках сводился лишь к внимательному чтению кода.
вот в пример громкий провал мелкомягких: http://habrahabr.ru/company/eset/blog/102549/
> не всегда все так просто
Так я и говорю,
> в ряде случаев
.
а хабрахабр рекомендуется в закладки для ежедневного просмотра. Потому как очень мало столь интересных ИТ-ресурсов
при прохождении "потока" данных по слоям приложения где и как нужно эти данные фильтровать?
эмпирически потыкав и набив шишек пришел к выводу:
фильтровать данные каждый слой должен в своей манере.
то есть, когда приходят данные
1. Request проверяет правильность формата данных, то есть, если ожидается число, то он должен гарантированно вернуть число или сигнал о нештатной ситуации
2. DAO должен эскейпить входящие данные, как минимум через mysql_real_escape_string
3. View должен проэкскейпить все данные, к примеру, на htmlentities
При этом, например, Request НЕ должен эскейпить данные "сразу" для View'а - иначе рискуем получить кашу и в логике и в представлении
или вас не уведомили
это я не вас пытаюсь уязвить, такой сценарий возможен у каждого, и вполне возможно, что происходил у меня....
это как понимать? типа rich client application?
Внутри приложения, между подсистемами должны ходить девственно-наивные данные. Если там есть строка '2' < "3" -- то так там и должно быть.
Вью должен превращать < в энтити. DAO должен экранировать ".
Нет ничего тупее ситуации, когда в базе хранят заэскейпленные десять раз кавычки и замененные на энтити значки "меньше".
А все почему?
Потому что ХТМЛ -- нифига не единственный вью. И SQL не единственный DAO.
Чем больше прогер об этом помнит -- тем лучше получается приложение.
Напиши консольный UI к Вашему приложению. Заставьте его хранить данные в LDAPе. И сразу станет понятно -- где оно красивое, а где -- говно)
полезно заюзать какой-нить dependency injection, склеить им пяток подсистем, и покрыть каждую юнит-тестами.
Сразу мозг становится на место)
а вот мозги проветрить - оно самое. лучше, чем продакшн потом обвалится
но ОЧЕНЬ помогает. Если у Вас каша из логики, вью и дао -- то хрен Вы это оттестируете.
Именно желание тестировать логику заставило многих писать нормальный код)))
по старинке, дебагом принтами ))))
а так все верно - для тестов нужна модульность и точки входа и выхода.
> Именно желание тестировать логику заставило многих писать нормальный код)))
и сюда еще вспомните test-driven development
А вот что бы не было пагубного желания дебагов и принтов надо настроить continues integration на чем нибудь типа cruise control или teamcity.
Что бы безжалостный робот, не понимающий принтов и дебагов запускал ВСЕ юнит тесты после каждого коммита, и слал письма если тесты упали.
а необходимость дебага - напротив, внештатная ситуация (а мы-то были уверены, что все хорошо!)
И там его (как и полагается) учат борланд сям. Тем самым, с IDE на тубробвижине под дос, как меня в 98м:)
Парень писал какую-то игрушку на псевдографике (типа змейки), и запутался в ней. И папаша говорит ему: "сделай принт переменной и посмотри".
Я возмутился, и показал как у борланда ставить брекпоинт.
А потом оказалось что пхпшник пишет в эдитплюсе, и ищет баги с помощью echo, хотя он не глупый совершенно.
мне как-то "свезло" работать в одной шарашке, там писали в эдитплюсах, дебажили принтами, разрабатываемую версию клали на тестовый сервак через фтп, и постоянно бегали спрашивали, кто с какими файлами работает, что бы не потерять результаты чужой работы = )
натурально, что мои предложения каждому поставить у себя локальный хампп и эклипс, и начать пользоваться свн'ом не были поняты.
тогда я поработал немного и сбег оттуда - до того, как надо будет раслебывать какой нить тотальный пиздец
сюда можно целую хтмл страницу вместо $url вляпать -это и будет code injecting, и как частный случай, xss - смотря что туда вляпывать. Например, тот же дефейс произвести - это не xss будет
Так-то.
спасибо за тыкание носом
Весь интерес в том, чтобы автор этого говна с "чистой" совестью мог сказать: "Но ведь работает же!" ))
Не знал. На будущее учту. Думал что оригинальный код автора будет интереснее, чем работающий после моей подсказки (сказал, чтобы заменил на echo '<a href="'.http://$url.'">123</a>';
Кавычки одинарные!
и это правильно