Pull to refresh

Comments 79

Самое печальное, когда тебе говорят "упс, что-то пошло не так", но при этом не говорят что именно пошло не так. Какая именно подсистема дала сбой? Может её отключить или поменять настройки или поменять на другую? Вместо того, чтобы сделать сообщения об ошибках понятными для всех, их делают непонятными ни для кого.

У самого подобное. Потому я при каждой ошибке заставляю свой код выплёвывать бектрейсы и подобные вещи :D

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

Мечта хакера — "security by obscurity".

Прятанье логов в веб-сервисах — это не «security by obscurity». Это простой здравый смысл.

Как и любое другое прятанье, это — "security by obscurity". И наличие этого "obscurity" провоцирует программистов забивать на "security". А вот когда работаешь "в открытую", то просто не можешь "забить", потому, что знаешь, что это будет тут же обнаружено.

Ок, ссылку на сервис банка, компании уровня гугла и т.п. серьезного бизнеса который сообщал все «в открытую» от логов до инфраструктуры. Или вы лично считаете себя умнее всех экспертов по безопансоти в мире?

Взывание к авторитету и сливание кармы — так себе аргументы.


Я ни разу в жизни не допустил ни SQL инъекций, ни XSS уязвимостей. Не потому, что я такой внимательный или наблюдательный или иксперт по безопасности, а потому, что строю архитектуру так, чтобы эти уязвимости исключить. Поэтому мне всегда было смешно наблюдать, как многие борются за безопасность путём "скрытия текста ошибки", "фильтрации SQL конструкций во вводе пользователя" и тому подобными простыми и неэффективными способами.

Я ни разу в жизни не допустил ни SQL инъекций, ни XSS уязвимостей.
А таки откуда ви знаете? :D

Оттуда же, откуда вы знаете, что не кусали свой локоть. Я просто не собирал ни SQL, ни HTML из строк. А когда всё же приходилось — использовал инструменты с автоэкранированием.

«Security through obscurity» во многих случаях вполне себе работает. Говорю это как человек, в отличие от вас, действительно ни разу в жизни не допустивший ни SQL-инъекций, ни XSS-уязвимостей. Работает, может быть, плохо и недолго, но работает. Характерный пример: когда находят уязвимость и собираются публиковать, как правило, перед публикацией посылают описание производителю и дают время на устранение уязвимости.

Недавно была атака на банки, так вот Сбербанк Онлайн выдавал пусть и не бектрейсы, но исключения Java с указанием имён пэкейджей и классов. В частности, про невозможность Hibernate подключиться к БД или ошибки рефлексии. Не то чтобы прямо что-то критичное, но я несколько удивился. Ещё раньше на запуске нынешней системы на Java у них и трейсы вылетали целиком, сейчас, вроде, убрали.

Когда сбербанк онлайн был по ддосом, он почему-то вывел произошедшее исключение, интересно, почему оно не обработалось:
Error 500: java.lang.SecurityException: org.hibernate.exception.GenericJDBCException: Cannot open connection
Забивать на «security» провоцирует отсутствие аудита и непрофессионализм. Никакой безопасник никогда не разрешит вывешивать логи ошибок на всеобщее обозрение.
«security by obscurity» это использовать явно дырявые решения. А кричать на каждом углу что у вас в сейфе лежит сто миллионов долларов наличкой в расчете что сейф никто не сможет взломать это просто глупость.

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

"security by obscurity" не значит, что obscurity это плохо. Это значит, что когда obscurity — единственный способ обеспечения безопасности — вот это плохо.

О том и речь, что "obscurity" вообще не обеспечивает никакого "security". Это как иконки на торпеде — в лучшем случае никак не повлияет, а в худшем даст ложную уверенность.

Я вот одного понять не могу, почему вы считаете это взаимоисключающими вещами? То есть никто не может и сделать безопасно, и спрятать логи?
Тут разговор в основном о вебсервисах, а это просто мечта хакера, вебсервис выдающий стектрейсы и детальные ошибки.

Простите, но ошибка, которая крушит браузер — на клиентской стороне. И бектрейс хакеру никакой дополнительной информации не даст — у него и так уже код весь есть.
Код в разработке и так должен выплевывать бэктрейсы, а на проде можно использовать вещи вроде rollbar чтобы видеть ошибки.
Что-нибудь вроде «По нашей статистике, 85% таких ошибок, было вызвано тем-то и тем-то… Можно попробовать то-то и то-то»
UFO just landed and posted this here
Очень важно дать и техническую информацию (код ошибки, системное сообщение, информация о месте возникновения -желательно со стектрейсом, если это возможно), и рекомендации обычному пользователю — и при этом не выставлять пользователя идиотом.
Возможно, я мнителен, но раздражают советы класса «убедитесь, что компьютер включен», что наблюдалось (да и наблюдается) особенно у МС: например, IE — сейчас уже более осмысленные сообщения при обрывах связи, но были достаточно раздражающие сообщения. Что там усугубляет — наличие кнопочки «исправить проблемы подключения», результатом которого обычно является сообщение либо «у вас все хорошо» (а проблема остается) либо «у вас нет соединения» — при этом вопрос «почему?» остается.
В МС дают такие советы из-за большого числа гневных звонков о нерабочем IE после отключения электричества в городском районе.
UFO just landed and posted this here

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

UFO just landed and posted this here

Затем, чтобы при разговоре со службой поддержки / знакомым экспертом / гуглом получить разумный ответ и вариант обхода проблемы вида "Вы делаете запросы в такое-то время, когда на сервере обычно происходит обновление приложения, поэтому части запросов может не повести. Просто повторите запрос, при получении такой ошибки, пока мы не научились обновлять софт без остановки сервиса."

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

Вы уже 4 раз повторили одно и то же. Не надо так.
А банальная "автоматическая отправка сообщений и логов" обычно упирается в "завал, который некому и некогда разбирать". Пока петух не клюнет — никто особо не шевелится.

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

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


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

UFO just landed and posted this here

А может быть и "для вашего аккаунта заблокирована возможность Х, которая обрабатывается сервером 12345, поэтому повторять позже бесполезно, а необходимо попросить администратора вашего аккаунта включить эту опцию", и сотня других причин. В идеальном мире, конечно, все возможные причины и пути решения будут перечислены в тексте ошибки. Но в реальном — ошибки являются следствием исключительных, не предусмотренными программистами, ситуаций.

UFO just landed and posted this here
Если же код ошибки спрятан — может, программист недоглядел/поленился,

Чем детальнее сообщения ошибках вебсервиса, тем проще работа хакера. Даже выдача код ошибки это на самом деле огромная дыра в безопасности, всякие sql инъекции и переполнения стека проводятся в разы легче. Даже если хакер не знает что код ошибки реально означает, он может перебором добиваться разных кодов ошибок и определять успешность своих атак.


а может компания не хочет выдавать никакой конкретики о своих ошибках. И это ее право, чесговоря.

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


«наш сервер №12345 накрылся, поэтому ваша транзакция не прошла — попробуйте еще раз, и балансировщик вас перебросит на рабочий сервер»

Пользователю-профессионалу это все равно ничего не даст (равносильно что-то случилось, попробуйте ещё раз), а вот хакеру будет очень полезно.

Даже выдача код ошибки это на самом деле огромная дыра в безопасности

Это не дыра в безопасности. Дыра в безопасности — это склеивание sql строк без экранирования, отсутствие проверок при обращении к памяти и тому подобное. А скрытие подробностей ошибки — это так, присыпание дыр листочками.


Даже если хакер не знает что код ошибки реально означает, он может перебором добиваться разных кодов ошибок и определять успешность своих атак.

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


Пользователю-профессионалу это все равно ничего не даст (равносильно что-то случилось, попробуйте ещё раз), а вот хакеру будет очень полезно.

Пользователь-профессионал сможет догадаться, что кавычку надо заэкранировать, чтобы запрос сейчас прошёл, решив тем самым свою проблему. И сообщит в службу поддержки о возможной SQL инъекции, тем самым решив проблемы других пользователей и самого сервиса. А служба поддержки в срочном порядке сообщит ответственному программисту, что надо залатать дыру, а не закинет сотый тикет вида "изредка возникает 500 ошибка, поди разберись".

"Вот вам стектрейс, настройки сервера такие, сможете придумать как это эксплуатировать — получите сумму такую-то".

Угу, даже самые большие вознаграждения за найденные уязвимости в десятки раз меньше того что предлагают на черном рынке или конкуренты. Если вас уже ломают, хакеру ваши предложения будут не интересны в 90% случаев.


А скрытие подробностей ошибки — это так, присыпание дыр листочками.

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

Если вас уже ломают, хакеру ваши предложения будут не интересны в 90% случаев.

Значит надо предлагать в 10 раз больше, чтобы хакеру было выгоднее быть белым, а не чёрным. Это же рынок.


А открытость вовсе не означает что на безопасность не забьют.

Конечно, но мало кто будет ковыряться в носу, когда на него все смотрят. :-)

Даже выдача код ошибки это на самом деле огромная дыра в безопасности

Ну-ну. Пахнет сокрытием самого факта ошибки: «Ошибка? В нашем ПО? Быть не может, это нормально, а Вы там не ковыряйте ничего, чтобы не ломалось!»
Если уж так не хочется выдавать тех.инфо, то на худой конец можно шифровать, чтобы спецы потом расшифровали всю важную информацию.
В общем, мне очень нравятся понятные и полезные (сразу ясно, что делать) сообщения об ошибках. Но как разработчик я понимаю, что реализовать такое — часто очень сложно и затратно.

Да не только в сложности дело. Детальное сообщение об ошибках это огромная дыра в безопасности для хакера. Такой вебсервис не пройдет ни один серьезный аудит безопасности, поэтому кроме "Упс" они ничего не могут сказать.

UFO just landed and posted this here
кстати, там во-1х 3.1 (интересно где такой скрин автор вообще нашел?), во-2х автор оригинального текста там вообще сморозил редкостную херню — «Oh yeah, duh, ff0a8e6c shouldn’t have been pointing to HAL.DLL!», ну а в-3х, мне тоже интересно какая связь между досом и НТшкой, но судя по тому что текст написан без малого пять лет назад, мы этого уже не узнаем.
UFO just landed and posted this here
ну справедливости ради, до вин2к включительно, оные системы ставили либо продвинутые пользователи, либо пользоватеЛЯМ, хотя, конечно, 2/3 инфы на этом скриншоте имеют смысл только для сотрудников мс, если вообще — INACCESSIBLE_BOOT_DEVICE обычно получалось сдуру, как я помню.
UFO just landed and posted this here
еще точно был NT4 Terminal Server Edition, но это совсем зло.

ну да, собственно почти все варианты из категории «сдуру можно и буй сломать».

Тоже не угадал. Там ведь латинским по синему написано: Windows NT 3.1.

UFO just landed and posted this here
Если вы знаете, что посоветовать пользователю во время неизвестной ошибки, то это вполне известная ошибка.
Известных ошибок в production быть не должно.
Технический лог пользователю ничем не поможет, а хорошим тоном может быть номер ошибки и контакт, с которыми можно обратиться в поддержку, но никак не куча абракадабры.

На момент написания кода об этой ошибке было не известно. А может было известно, но по какой-то причине не запилили (в идеальном мире, конечно, таких причин нет).


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


За примером далеко ходить не надо — GeForce Experience. Падает через пару минут после загрузки. Никаких подсказок не даёт, почему именно на моей системе она падает. На других видимо не падает, раз уже который месяц это не исправляют.

> На момент написания кода об этой ошибке было не известно.
Именно поэтому невозможно подстелить солому, как вы хотите, т.е. рассказать что произошло, кроме как технических логов.
> А абракадабра, зачастую, не понятна и самим программистам
Причем тут создатели программы, они могут логгировать эти ошибки без показа их пользователям.
> Падает через пару минут после загрузки. Никаких подсказок не даёт, почему именно на моей системе она падает.
Не думаю, что куча чужих бектрейсов поможет 9999999 пользователей из 1000000. А последний потратит месяц или отправит багрепорт? И в GeForce (как и в большинстве программ) есть отправка логов.

Автор из тех странных людей, которые заставляют программистов галстуки на работе носить.

По мне, никакой паники и уж точно не издевательство, просто разработчики сочувствуют пользователю, у которого из-за них приложение упало в самый ответственный момент.
Если человек шлёт письма на миллион и не имеет при себе 3 совершенно разных мобильника трёх разных операторов, то Упс! Хорошо, наверное, быть сказочным долбокряком.
Сложно представить человека, шлющего письма на миллион, обложившегося тремя мобильниками.
Ошибка есть ошибка. Расшифровывать её, или попросить зайти позже, это всегда зависит от контекста. Давать расшифровку или нет, зависит от типа ошибки и способа её получения.

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

Единого рецепта правильного сообщения об ошибки, нет. Главное, что бы про это знал разработчик и максимально быстро исправил. То, что ты — доблаёб и забыл зарядить все свои 100500 гаджетов, и в аэропорту они одновременно сдохли под плохим бесплатным вайфаем — не проблема сайта. Почему почти все почти всего думают, что им что-то должны в лучшем виде всегда?
Ещё одна аналогичная и очень старая проблема: недоступность функций в программах. Например, неактивный пункт меню, который делает то, что тебе прямо щас надо сделать. И я не встречал ПО, которое объясняло, почему в данный момент именно этот пункт недоступен. Пол дня в гугле помогают понять, что это потому что какой-то драйвер не тот, железка не той версии, фаза луны не та итп.
В наше время классических меню всё меньше, но проблема осталась. Действия просто пропадают из тех мест, где они должны быть. И опять без объяснений.
Не занудства ради спрошу: а кто-нибудь пробовал такую схему?
1. Приложение выбросило исключение
2. Собрало информацию об ошибке
3. Положило в базу, выдав при этом уникальный идентификатор (во избежание длинных чисел можно использовать, например словарь лёгких слов или что-то ещё, облегчающее передачу разными способами)
4. Сообщило об этом пользователю, показав этот самый идентификатор, краткую информацию и контактные данные компании.
5. Пользователь связывается с администрацией, назвав выданный ему идентификатор.
6. Администрация передаёт запрос программистам, которые изучают запись в базе об этой ошибке и решают проблему.

Когда я работал в местном купонаторе, с нами (через наш колл-центр) связывались пользователи и партнёры при возникновении каких-либо вопросов по сайту, будь то ошибки или какие-либо другие непонятности. И происходило это на удивление часто (моей разработкой был кабинет партнёра и по нему звонили ещё чаще, чем по фронтендовым вопросам).
Если это веб-приложение, то шаги 4-6 можно заменить одним:
0. Настроить уведомление при вставке информации об ошибках в базу.
Как один из вариантов развития событий ;)
Кроме настройки уведомления необходимо ещё и продумать фильтрацию ошибок, проверку их критичности, наличия ранее точно таких же обработанных ошибок(например, создана задача в баг-трекере) и т. д., в результате на уведомления придётся либо забить, либо выделить отдельного человека на их обработку.
Эту задачу достаточно хорошо решают пользователи — если ошибка критична для пользователя — он о ней сообщит, если нет — значит мы о ней и не узнаем. Да, вариант несколько порочный, в плане — пользователь может «обидиться и уйти», но для особо критичного функционала и так должны быть автоматические проверки.
Видел несколько раз вариант с отображением ID и текстом — «Если обратитесь в техподдержку по этому поводу, пожалуйста, укажите данный ID ошибки», то есть как минимум пункты 1 — 5 реализованы(увы, запамятовал, где именно).
В сервисах анти-ддос также защиты частенько отображаются идентификаторы, которые по идее можно будет проверить в случае если система по какой-то причине ошибётся и закроет доступ «нормальному» пользователю.

Возможно, нечто подобное можно сделать через Sentry.

В MS-DOS не было синих экранов смерти. А на скриншоте показан BSOD от Windows 3.1. И в нём, кстати, написано, что пропал доступ к загрузочному диску, а вовсе не то, что
ff0a8e6c не должен был указывать на HAL.DLL

По мне так этот BSOD — достаточно информативное сообщение.
Поправочка. Windows 3.1 была 16-разрядной, а на скриншоте 32-разрядные адреса. Так что это BSOD от какого-то прародителя Windows NT — от Windows NT 3.1.
На нём написано Windows NT 3.1…
А Windows 3.1 вполне себе работала в 32-разрядном режиме, просто не всё было 32-разрядным.

Лично меня раздражают только умники, которые всегда считают, что в гигантах IT индустрии работают идиоты и не знают что делают. Это наивность такая или гордыня? Нет, я правда не понимаю зачем об этом вот в таком виде высказываться.
В IT существует жесткая конкуренция, что и способствует направлению и методам развития. Не нравится такой подход — найдите подходящий для вас сервис. Если это единственный, который вам подходит по каким-то причинам, но в чем-то не устраивает, так это и не должно быть идеально во всем. Всем угодить невозможно. А IT гиганты работают с огромным числом клиентов/пользователей и от их методов и качества зависит их прибыль.

Лично меня раздражают только умники, которые всегда считают, что в гигантах IT индустрии работают идиоты и не знают что делают.
Довольно странный вывод из статьи Вы сделали. По мне так посыл статьи диаметрально противоположный: в гигантах IT-индустрии работают умники, которые всех без исключения пользователей считают идиотами. И если этих гигантов время от времени не пинать подобными статьями, то в конце концов они окончательно забьют болт на юзеров и перестанут воспринимать конструктивную критику.
В IT существует жесткая конкуренция, что и способствует направлению и методам развития.

Назовите альтернативную операционную систему, на которой можно поиграть нормально в WoW, Civ 6 и еще несколько игр, используя клиенты Curse, Discord помимо Windows.


Назовите браузер, который можно активно и удобно использовать, но не Edge, Mozilla или Chrome.


Ну и так далее. "Конкуренция".

Имхо это все укоренилось в самой западной культуре. Нужно улыбаться, излучать уверенность и дружелюбие, иначе ты лузер. Все наверно наблюдали, как на прошедших выборах в США несколько пожилых людей пыжились, пытаясь изобразить своего в доску парня. Сегодня только смотрел доклад Александреску на CppCon, был слегка в шоке, первое впечатление: «это какой-то клоун под наркотой».
Помню такой момент, когда на внутреннем ПО на работе, разработчик (который буквально в соседнем зданиии сидит) просто поленился вписать текст ошибок в базу, откуда интерфейс рассчитанный на открытие в браузере забирал записи.

Никогда не забуду надписи вроде «Text for error #8 here» при каких-то обычных действиях, или что-то «Error #102 — try again or contact support». Обычно, решение было простым, и пользователь запросто мог бы решить проблему сам, если бы вместо непонятного диалога, был нормальный текст ошибки.
А что не так с приватным видео на youtube?
Ага, как мне нравится на сайте «Юлмарта» — «Вы сломали наш сайт, но мы его уже чиним!»

Перекладывание ответственности на пользователя, говорите?
Всё просто, системы вышли из младенческого возраста, когда обратная связь была на низшем уровне вида уа-уа агу-гу 80400000 2dc8312a HAL.DLL (почему кстати из BSOD взят именно ff0a8e6c? не понял), затем стали лепетать и сюсюкать на уровне гав, мяу, му, и теперь от них уже требуются что-то более вразумительное.
Всегда старался максимально эргономично выводить сообщения об ошибках, ещё когда писал на VBA под Access, все корневые вызовы содержали On Error Goto (handler) а там модальное окно, подробное описание и предложение написать разработчику. Это как-то по-взрослому, имхо.
Какова вероятность, что увидев больше информации пользователь
— пофиксит код на серверах гугла, фейсбука и айклауда
— найдет ошибку, исправит её и сделает ПР в код хрома
— исправит ошибку в проприетарных драйверах в винде (кстати, журналы ошибок пишутся, там больше деталей) или флеш
— хакнет ютуб чтобы посмотреть частное видео
— нарастит мощности ДЦ твиттера
Sign up to leave a comment.

Articles