Comments 15
В таких приложениях совершенно невозможно представить инъекции и эксплуатацию уязвимостей по причине того, что, уж, если приложение решило получить число, то оно получит именно число, а не некий кусок, который, почему-то, оказался куском кода, и, опять же почему-то, смог выполниться на сервере.
Зачем предоставлять пользователю в браузере строку для ввода URL? Если бы браузер предоставлял пользователю всегда только форму ввода (а в ней уже допускался выбор значений только из реальных справочников), то эксплуатировать было бы нечего. ЯТД.
Ди ничего бы не изменилось… Развивались бы инструменты мониторинга сокетов, составлялись бы похожие запросы, а на стороне бэка у таких приложений всеравно база данных, возможно SQL. И при проектировании например решили делать выборку по статусу, а это строка, подставляемая в SQL запрос, строгая типизация позволит проверить, что да — это строка, но не проверит на SQL-инъекцию. Все что прислал клиент, в данном случае внешнее распределенное приложение, априори нужно валидировать и экранировать.
В таких приложениях совершенно невозможно представить инъекции и эксплуатацию уязвимостей
А как же переполнения буферов, arbitrary code execution и все такое?
с пакетами (сокетами)
Мне сложно представить область, в которой эти термины используются как синонимы. Сокет это точка соединения, пакет это набор данных, передающийся через эту точку. Браузеры и так работают через сокеты.
В таких приложениях совершенно невозможно представить инъекции и эксплуатацию уязвимостей по причине того, что, уж, если приложение решило получить число, то оно получит именно число, а не некий кусок, который, почему-то, оказался куском кода, и, опять же почему-то, смог выполниться на сервере.
Веб-приложения, о которых в статье идет речь, тоже могут решить получить число. Этому ничто не мешает, так и делают во многих случаях, явно задавая преобразование входной строки в число. Но во-первых, на входе часто бывают и строки (пример с фамилией из статьи), во-вторых, эти данные часто передаются дальше в запросы к базе данных. И вот если передача данных в запрос построена неправильно, то нет никакой разницы, обычный сайт у вас или распределенное приложение. Потому что база данных есть и там и там.
Зачем предоставлять пользователю в браузере строку для ввода URL?
А как я должен задавать, какой сайт я хочу открыть — хабр или гугл?
Если бы браузер предоставлял пользователю всегда только форму ввода (а в ней уже допускался выбор значений только из реальных справочников), то эксплуатировать было бы нечего. ЯТД.
Вы думаете неправильно. Браузер предоставляет форму ввода, пользователь выбирает правильное значение из списка, браузер отправляет значение на сервер с приложением. Ничто не мешает написать свою программу, которая прикинется браузером, подключится к серверу, и отправит туда неправильное значение.
И вот если передача данных в запрос построена неправильноВопрос следует, на мой взгляд, поставить иначе: можно ли сделать так, чтобы правильная настройка передачи данных была бы встроена в технологию?
Если существует положительный ответ на этот вопрос, то «прикинуться» будет гораздо сложнее. Но это будет, также, означать и то, что Вы не сможете «просто так» открыть какой-либо сайт, поскольку для пользователя каждый сайт (в недостижимом идеале) должен выглядеть как поставщик сервисов (служб) и данных.
Более того. Само понятие «открыть сайт» содержит в себе серьёзную методологическую ошибку. Отсюда и возможность организации распределённых атак и т.д. и т.п. Если Вы «обращаетесь» к какому-либо сайту, то Вы это делаете (если следовать написанному мною сценарию в собственной статье) в рамках своей собственной ОС, и Вы не сможете организовать никакую распределённую атаку, потому как у Вас не будет никакого доступа к другим компьютерам во Всемирной Паутине, или Вам будет предоставлен доступ только к тем сервисам (службам), которые предусмотрены с точки зрения интересующего Вас сайта.
На самом деле, мне вполне понятен смысл Ваших весьма справедливых замечаний. Однако, сказанное Вами не отменяет возможность построения «другого мира». А в этом «другом мире» всё другое. Нет привычных для нас всех понятий «сайт» и «браузер»…
можно ли сделать так, чтобы правильная настройка передачи данных была бы встроена в технологию? Если существует положительный ответ на этот вопрос, то «прикинуться» будет гораздо сложнее
Вы не поняли. Передача данных в запрос осуществляется на вашей стороне, т.е. на стороне сервиса. Тут неважно, кто кем прикидывается. Вам пришли данные и вы на основе них строите запрос. Данные могут быть полностью правильные, но в вашем коде может быть неправильная их подстановка в запрос.
Вы не сможете организовать никакую распределённую атаку, потому как у Вас не будет никакого доступа к другим компьютерам во Всемирной Паутине
Что мне помешает арендовать 20 компьютеров? Что мне помешает запустить вирус, который предоставит мне доступ к 100000 компьютеров?
А в этом «другом мире» всё другое. Нет привычных для нас всех понятий «сайт» и «браузер»…
В вашем мире есть доступ по сети и все связанные с ним проблемы. Также в вашем мире есть базы данных и запросы к ним. Единственный тип атак, которых не будет в вашем мире с жесткими ограничениями — это XSS атаки. Зато будет много других проблем, о которых я написал в комментариях к вашей статье.
SQL injection
Используйте NoSQL)
Защита веб-приложения: практические кейсы