The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Критическая уязвимость в системе управления web-контентом Dr..."
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Подсказка: Доступны два режима работы форума: "Раскрыть нити" и "Свернуть нити".
. "Критическая уязвимость в системе управления web-контентом Dr..." +/
Сообщение от Ordu (ok), 23-Фев-19, 18:10 
>> И что? Сделай либо API в ядре CMS
> ну сделай, что-ли... только, полагаю, описание всех возможных в твоей cms апи
> закончат читать к моменту, когда конкуретны на вротпрессе и дрюпалке уже
> пятую версию сайта выкатят.

Вот делать мне больше нечего, кроме как решать проблемы пэхапунов. Ну, реально. Зачем я буду писать все эти замороки, есть у меня есть Rocket[1]? Который генерит скомпилированный нативный бинарь, выполняя на этапе компиляции всю работу, которую можно выполнить на этапе компиляции, чтобы не выполнять её во время выполнения. Который очень строго обходится с типами, позволяя мне полагаться на то, что если у меня есть переменная u8, то мне не удастся _нечаянно_ какой-нибудь арифметической операцией превратить её значение в String или в i32. В пхп, я подозреваю, при попытке разработать подобный API, половину времени придётся потратить на размышления, как спроектировать API, чтобы были бы невозможными нечаянные конфузы вызванные неявными автоматическими преобразованиями типов. Ты не представляешь себе как подобные проблемы бесят после опыта работы со строго типизированным языком.

>> С untrusted input (как впрочем и со всем остальным) проблема решается очень просто: пишется
>> отдельный код, который из untrusted input'а, делает trusted.
> похоже, ты никогда не пытался его написать.
> Нет, не бывает такого кода. Единственный способ работы с untrusted input -
> помечать его таки как untrusted, и тащить в таком виде через
> весь код до места применения.

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


> Разбери простейший пример - untrusted input - текст (предположим, только) из веб-формы.

[2]

#[derive(FromForm)]
struct Task {
    complete: bool,
    description: String,
}

#[post("/todo", data = "<task>")]
fn new(task: Form<Task>) -> String {
    format!("Form `task` had fields: `complete`=={:?}, `description`=={:?}",
             task.complete, task.description)
}

Это делается _элементарно_. Обработчик запроса получает распарсенную форму, в которой уже проверены все значения -- строки на валидность utf8, числа на синтаксис и на попадание в заданный диапазон, enum'ы на то, что указанное значение допустимо.

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

[1] https://rocket.rs
[2] https://rocket.rs/v0.4/guide/requests/#forms

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Критическая уязвимость в системе управления web-контентом Dr..., opennews, 21-Фев-19, 21:30  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру