Недавно пробегала по рунету «шуточка» для тех, кто «в контакте»: прислать товарищу ссылку, которая меняет его имя на «я креведко». Я и сам попался на эту дурацкую подколку, да и не заметил, пока братец не подсказал. Было запаниковал, думал — какое-то серьёзное хакерство, но потом разобрался и успокоился: просто кто-то подсунул ссылку типа vkontakte.ru?что-то-там.php?name=ya+krevedko. Действительно, кажется, ерунда — надо смотреть, на что давишь. Однако не так просто.
Не везде ожидаешь подвоха. В аське или в почте, увидев что-нибудь неожиданное якобы от знакомого человека, призадумаешься. С другой стороны, если тот же знакомый оставит тебе ссылку в комментарии к твоему блогу, обычно ничего не опасаешься и смело по ней переходишь. Я, как любой разумный человек, пользуюсь таким браузером, в котором можно ходить по любым ссылкам без опасения словить трояна, и потому не очень внимательно смотрю, на что нажимаю. Так что, на мой взгляд, к попавшимся на этот подкол не стоит предъявлять больших претензий в неосторожности. Это явно вина сервиса, на котором возможны такие косяки.
Ладно, пошутили. Но ведь так можно и сильнее подгадить. Написать что-нибудь совсем нехорошее, например. Как-нибудь скомпрометировать человека. А если запостить что-то в его дневник таким макаром? Взлом! А если так почту можно рассылать? Спамерская дыра! Разговоры о том, что надо каждый раз вылогиниваться, попользовавшись сервисом — в пользу бедных. Не для того делают галочку «запомнить меня на этом компьютере».
Но что же, спрашивается, должен делать сервис, чтоб защититься? На каждое действие подтверждения спрашивать? Не обязательно, есть и другие варианты. Некоторые, например, говорят о проверке referer-а (ссылающейся страницы) — чтобы сервер следил, что человек действительно пришёл со страницы редактирования профиля, а не фиг знает откуда. Но это, разумеется, дурной вариант. Неудобно, требует дополнительного программирования для каждого действия. Существует правильное решение, которое куда проще и изящнее. И, что важно, предписано свыше.
Как известно, HTTP-запросы бывают GET и POST (не говоря о прочих). Говоря простым языком, GET — это запрос, при котором параметры (данные формы ввода), если они есть, появляются в адресной строке, например: http://www.google.com/search?hl=en&client=opera&q=http+GET+length
. Всё, что идёт после search?
, — это параметры. А при POST-запросе параметры передаются в теле запроса (что бы это ни значило). Если вы где-то встретили ссылку и нажали на неё, запрос будет отправлен методом GET. Невозможно сделать ссылку, которая отправляла бы POST-запрос (хотя бы уже потому, что негде указать параметры для запроса). Поведение формы ввода можно задать в HTML-коде страницы — это на усмотрение вебмастера.
Почему для отправки форм иногда используют GET, а иногда POST? Обратимся к первоисточнику, сиречь спецификации протокола HTTP.
RFC 2616, sect. 9.3 GET:
The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the entity in the response and not the source text of the process, unless that text happens to be the output of the process.
RFC 2616, sect. 9.5 POST:
POST is designed to allow a uniform method to cover the following functions:
- Annotation of existing resources;
- Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles;
- Providing a block of data, such as the result of submitting a form, to a data-handling process;
- Extending a database through an append operation.
Что тут существенно? Сама спецификация велит нам использовать GET для получения данных, и POST — для их изменения. Действительно, известны страшные истории о том, как робот гугла стёр целый сайт, пройдясь по ссылкам вида «удалить страницу». Никакая модификация данных не должна производиться GET-запросом.
Дальше остаётся только заметить, что хотя авторы сайта могли указать метод POST для формы, они не исключили возможности прислать те же данные через GET. Ублюдочный язык PHP (на котором написано ВКонтакте.Ру) — по крайней мере, в некоторой конфигурации — собирает все параметры запроса в одну большую кучу, чтобы ленивому программисту не надо было задумываться, через какой метод приходят данные. Хотя проверка заняла бы одну строчку (а при правильном написании кода вообще произошла бы сама собой), на сайте её сделать поленились, или забыли. В результате получается как всегда: чем удобнее, тем менее безопасно. В данном случае удобно программистам фконтакта, а опасно для нас, пользователей.
Комментарии к записи О криведках и протоколах отключены