Про register_globals. Как написать правильный скрипт

Статус
В этой теме нельзя размещать новые ответы.

Eredory

Новичок
ksnk
Мне кажется "злоумышленнику" трудно будет воспользоваться этой функцией - ведь в его распоряжении только командная строка
браузера и ничего более... Как я понимаю, по крайней мере.
В общем, все критичные переменные из формы в форму надо передавать либо GET-ом, либо POST-ом. Так можно избавиться хотя бы от самых явных дырок. Вроде, ясно
 

ksnk

прохожий
У "злоумышленника" есть еще Куки (текстовый файл, который легко правится руками). Также несложно сделать post запрос к скрипту с нужными "злоумышленнику" параметрами... Так что - не расслабляйтесь :)
 

Eredory

Новичок
Автор оригинала: ksnk
У "злоумышленника" есть еще Куки (текстовый файл, который легко правится руками).
А ему не надо для этого знать имя моей переменной - которую я в Куки отправляю? Если надо, то ему, пожалуй, сложно будет ее выяснить

Автор оригинала: ksnk Также несложно сделать post запрос к скрипту с нужными "злоумышленнику" параметрами...
А GET-запрос также легко сделать? Или сложнее?
 

SiMM

Новичок
> есть еще ini_set
А какое она может иметь отношение к register_globals?
 

texrdcom

Новичок
Если взять скрипт, исправно работающий при register_globals=off и перед использованием переменых сделать им unset
И получиш вывод ошибки придупреждения :) если не будет переменной :) проще делать
$peremenay=array();
:)
 

Kivsiak

Новичок
А может проще выработать хороший стиль?
Ведь пхп не просто так в нотисах предупреждает, что переменная использована перед определением?
И само собой проверки ожидаемых входящих переменных;
 

Фанат

oncle terrible
Команда форума
Eredory
Вечер добрый.
Вот ты пишешь:
Я прочитал статью в FAQ про "Не передаются переменные...". Суть проблемы в том, что на моем хостинге register_globals=on, и это ни в какой мере от меня не зависит. Тщательно поразмыслив,
Скажи, а не слишком ли рано ты начал размышлять? Может быть, стоило прочитать статью до конца? И прочесть ответ на свой вопрос?
Рекомендую тебе так и сделать. А размышления оставить тем, кто в этом более силён.
 

ksnk

прохожий
texrdcom
Посмотри пожалуйста ВНИМАТЕЛЬНО, на приведенный мной пример в третьем сообщении этого треда. Где ты там видишь возможные нотисы?

-~{}~ 03.12.05 14:29:

SiMM
> есть еще ini_set
А какое она может иметь отношение к register_globals?
Вообще-то да... Ни при чем :(
 

Popoff

popoff.donetsk.ua
Кто-нибудь помнить, как называется болезнь, когда человек верит в то, чего на самом деле нет?
 

ksnk

прохожий
Popoff
:) В этом случае она называется невнимательность ... str_repeat(Читать ман нужно до конца...,...);
 

Eredory

Новичок
Фанат
Я прочитал внимательно статью до конца. Там НЕТ ответа на интересующий меня вопрос. Там только описание проблемы без ее решения. Зато решение нашлось в этой теме. Буквально в третьем, кажется, посте (спасибо ksnk). Баг свой я вчера, таким образом, пофиксил.
Размышления, имхо - вещь полезная для каждого. Оффтоп типа тоже, э? ))

-~{}~ 03.12.05 22:40:

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

Фанат

oncle terrible
Команда форума
Если вы хотите написать скрипт, не зависящий от настройки register_globals, и при этом защищенный - переменные надо объявлять перед использованием. На это нацелена еще одна инициатива разработчиков PHP - написание программ при уровне отображения ошибок (error_reporting) равном E_ALL, при котором об использовании необъявленных переменных выдаются предупреждения.
Именно объявление ВСЕХ переменных, используемых в скрипте и является гарантией от взлома. Если вы пишете программу для распространения, то гарантией ее безопасности является только объявление переменных.
Наш сервис "Всё для слепых и слабовидящих" работает круглосуточно. Самые скромные расценки. Обращайтесь!
Специальное предложение для людей с ограниченными умственными способностями, не способными воспринять две страницы печатного текста: находим нужный абзац, и делаем копи-пасте!

-~{}~ 03.12.05 22:51:

"решение" этого сельского дурачка никаким решением не является.

а вот про твою дыру можно и поговорить.
после авторизации в следующую форму передается некая переменная
с этого места поподробнее

-~{}~ 03.12.05 22:58:

Да.
мне очень интересно
после авторизации в следующую форму передается некая переменная, и "злоумышленник" вполне может сделать это сам
как же ты заткнул эту дыру методом нашего мистера "к-каждой-бочке-затычка"?
 

Eredory

Новичок
Фанат
"решение" от этого борзописца никаким решением не является.
Все-таки позволю себе не согласится. ))
Просто я решил, не мудруствуя лукаво, отправляться после авторизации прямой ссылкой. То есть, форма проверяет логин и пароль, все нормально, и дальше:
Код:
echo "<a href='add_theme_post.php?add=0&for_theme=".$for_theme."&id=".$id."'>Продолжить</a>";
Буквально, так. Я про переменную $id. Факт ее наличия ясно говорит следующей форме, что пользователь авторизован, можно его даже опознать ("поздороваться") - и уж конечно позволить ему постить сообщения и создавать новые темы. Человек может САМ ручками все это прекрасно набрать в адресной строке. В особенности потому, что названия всех переменных видно.
Фикс, который я вчера накатал, заключался в том, что юзверь теперь после авторизации жмет кнопочку submit - и все переменные передаются Post- ом. $id эту я заныкал в hidden field. В адресной строке, таким образом, тишь да гладь - add_theme_post.php и все. Даже если человек все это опять наберет сам - скрипт срежет его на проверке переменной - от post-а она или нет. В принципе работает против этого способа взлома, а более сложным я пока не обучен ))))
 

Фанат

oncle terrible
Команда форума
так.
понять ход вашей ламерской мысли становится всё труднее.
одну проблему я уже понял.
все тебе отвечали на вопрос "как писать безопасно под register_globals=on", а ты, оказывается, решал проблему, которая к register_globals не имеет никакого отношения - проблему идентификации пользователя

будем разбираться дальше.
для начала будь добр описать решение не словами "где-то там, я забыл вообще, как оно выглядело", а дать точную ссылку или цитату.
 

Eredory

Новичок
Фанат
Иес, Сэр!!!
Собственно, вот, что я взял за отправную точку:

автор: ksnk if (isset($user)) unset($user);
if (isset($_GET['user'])) $user = $_GET['user'] ;

примерно - так...
А вот, что я накатал:
Код:
if(isset($id)) 
{
unset($id);                                 
}
if(isset($_POST['id']))                 
{everything_ok}
else
{login/parole?}
Короче, если переменная пришла post-ом - флаг ей в руки. Если нет, то нет. Все там сложнее немного с этими if-ами, но я кажется, передал все-таки общий ход.
Вот. Было бы здорово, если бы не пришлось все-таки обращаться к кнопочкам всяким, а оставить ссылку, как было в самом начале. И как-то отличать ссылку из моего скрипта и просто набранную в адресной строке. Но я уже кажется начинаю догадываться, что это не очень-то возможно ((

-~{}~ 03.12.05 23:24:

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

Фанат

oncle terrible
Команда форума
очень, очень интересный код.
а можно поинтересоваться, какую функцию выполняет вот эта его часть:
if(isset($id))
{
unset($id);
}
?
и как она влияет на последующее выполнение скрипта?
 

Eredory

Новичок
ну-да, ну-да. В условиях, что дальше я обращаюсь непосредственно POST['id'], никакой не выполняет. Но ведь и не вредит?
 

Фанат

oncle terrible
Команда форума
и что кусочек моей проблемы описан в статье этой, которую вы упоминали
вынужден тебя огорчить.
в статье ты, к сожалению, не понял ни бельмеса.
и пример из статьи не имеет к твоему никакого отношения.
там говорится о переменной, которая является частью скрипта.
а у тебя - о той, которая приходит снаружи.

-~{}~ 03.12.05 23:33:

Но ведь и не вредит?
раз этот код не нужен, но при этом взят из кода кснк - получается, что и к твоему решению код кснк не имеет отношения. так?

-~{}~ 03.12.05 23:35:

Но ведь и не вредит?
вредит. и ОЧЕНЬ СИЛЬНО.
когда ты через неделю будешь разбирать этот свой собственный скрипт, то будешь долго репу чесать, пытаясь понять, что этот код здесь делает, и где ты не догоняешь.
 

Eredory

Новичок
это про меня:
В таком скрипте при register_globals=on очень легко стать админом, просто обратившись к нему script.php?admin=1
Огоромное количество сайтов было взломано таким образом.
Ко мне тоже можно было так обратиться ($id вместо $admin) и кой-чего наворотить (разве что админом стать не получилось бы, потому что администрирую я другими средствами).
$id - активная часть скрипта, пришедшая снаружи. Все остальное детали.
 

Фанат

oncle terrible
Команда форума
К тебе так можно было обратиться исключительно в силу твоей ДУРОСТИ.
в статье говорится о ВНУТРЕННЕЙ переменной скрипта.
которую программист САМ устанавливает. Не получает от юзера, а САМ устанавливает. И поэтому ей доверяет. и которую можно подменить из-за дыры в голове программера и регистер глоабалс.

а у тебя речь идёт о переменной, которая приходит от юзера.
которой В ЛЮБОМ СЛУЧАЕ НЕЛЬЗЯ ДОВЕРЯТЬ.
а ты, как птица с объемом мозга в 5 куб.см. спрятал голову в песок, передавая ТУ ЖЕ САМУЮ переменную, ОТ ТОГО ЖЕ САМОГО ЮЗЕРА но просто другим методом.

-~{}~ 03.12.05 23:44:

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

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

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