wiki:devel:security
Различия
Показаны различия между двумя версиями страницы.
| — | wiki:devel:security [2025/01/03 17:48] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Правила безопасности для авторов плагинов ====== | ||
| + | Создание [[wiki: | ||
| + | |||
| + | :!: Улучшение этой страницы всегда приветствуется. Она находится в очень сыром состоянии и должна быть расширена более подробной информацией, | ||
| + | |||
| + | ===Краткое содержание=== | ||
| + | |||
| + | Список наиболее распространенных проблем безопасности и способы их избежания можно найти на этой странице. Краткое резюме: | ||
| + | |||
| + | * Межсайтовый скриптинг (XSS) — вставляет вредоносный код на веб-сайт для манипулирования сайтом в браузере пользователя. | ||
| + | * Подделка межсайтовых запросов (CSRF) — уловки, | ||
| + | * Удаленное включение кода – включает код на сервере, | ||
| + | * Утечка информации – отображается слишком много информации | ||
| + | * SQL-инъекция – можно выполнить нежелательные запросы к вашим данным | ||
| + | |||
| + | Также добавлено примечание о [[# | ||
| + | |||
| + | |||
| + | ===== Межсайтовый скриптинг (XSS) ===== | ||
| + | |||
| + | Это, вероятно, | ||
| + | |||
| + | Cross Site Scripting относится к атаке, при которой вредоносный код JavaScript внедряется на веб-сайт. Это может использоваться для перенаправления невинных пользователей на вредоносные веб-сайты или для кражи аутентификационных cookie-файлов. | ||
| + | |||
| + | Механизм плагинов DokuWiki дает разработчикам плагинов большую гибкость. В случае с плагинами синтаксиса, | ||
| + | |||
| + | ===Выход из режима экранирования=== | ||
| + | Как минимум, | ||
| + | |||
| + | Кроме того, следует с подозрением относиться к любым данным вики, извлеченным и используемым внутри компании (например, | ||
| + | |||
| + | ===Проверка входных данных=== | ||
| + | Всегда проверяйте все ваши входные данные. Используйте белые списки, | ||
| + | |||
| + | Также ознакомьтесь с нашей главой об обработке [[wiki: | ||
| + | |||
| + | |||
| + | ==Смотрите также: | ||
| + | |||
| + | * [[wp> | ||
| + | * FIXME[[http:// | ||
| + | |||
| + | ==== Типичные примеры уязвимостей ==== | ||
| + | |||
| + | Ниже показаны некоторые очень распространенные проблемы. Примеры очень просты, | ||
| + | |||
| + | === Синтаксис Тела === | ||
| + | |||
| + | Многие простые плагины синтаксиса принимают часть введенных пользователем данных и форматируют их в виде пользовательского HTML . | ||
| + | |||
| + | Пример: | ||
| + | |||
| + | <code php> | ||
| + | class syntax_plugin_bold extends DokuWiki_Syntax_Plugin { | ||
| + | // общие функции плагина опущены | ||
| + | |||
| + | public function connectTo($mode) { | ||
| + | $this-> | ||
| + | } | ||
| + | |||
| + | public function handle($match, | ||
| + | return [substring($match, | ||
| + | } | ||
| + | |||
| + | public function render($format, | ||
| + | if($format != ' | ||
| + | $renderer-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Как вы можете видеть, | ||
| + | |||
| + | Решение простое: | ||
| + | |||
| + | <code php> | ||
| + | class syntax_plugin_bold extends DokuWiki_Syntax_Plugin { | ||
| + | // общие функции плагина опущены | ||
| + | |||
| + | public function connectTo($mode) { | ||
| + | $this-> | ||
| + | } | ||
| + | |||
| + | public function handle($match, | ||
| + | return [substring($match, | ||
| + | } | ||
| + | |||
| + | public function render($format, | ||
| + | if($format != ' | ||
| + | $renderer-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Формы === | ||
| + | |||
| + | Когда ваш плагин предоставляет форму, очень часто требуется проверить вводимые данные и повторно отобразить форму с полученными данными пользователя в случае возникновения ошибки проверки. | ||
| + | |||
| + | Пример: | ||
| + | |||
| + | <code php> | ||
| + | <form action="" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Предоставление данных '' | ||
| + | |||
| + | Для исправления формы используйте функцию [[phpfn> | ||
| + | |||
| + | <code php> | ||
| + | <form action="" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | В целом рекомендуется не создавать формы вручную, | ||
| + | |||
| + | === Классы и другие атрибуты === | ||
| + | |||
| + | Часто плагины принимают несколько параметров и опций, которые используются для изменения выходных данных плагина. | ||
| + | |||
| + | Представьте себе плагин, | ||
| + | |||
| + | < | ||
| + | <msg warning> | ||
| + | </ | ||
| + | |||
| + | В методе рендеринга этого синтаксиса может быть такой код: | ||
| + | |||
| + | <code php> | ||
| + | $renderer-> | ||
| + | . htmlspecialchars($message) | ||
| + | . '</ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Как вы видите, | ||
| + | |||
| + | <code php> | ||
| + | $allowed = [' | ||
| + | if(!in_array($class, | ||
| + | $class = ' | ||
| + | } | ||
| + | $renderer-> | ||
| + | . htmlspecialchars($message) | ||
| + | . '</ | ||
| + | </ | ||
| + | |||
| + | ===входные URL-адреса === | ||
| + | |||
| + | Когда плагин принимает URL-адреса в качестве входных данных, | ||
| + | |||
| + | Вот пример того, как может выглядеть очень простая проверка, | ||
| + | |||
| + | <code php> | ||
| + | // пустой URL при несоответствии протокола | ||
| + | if(!preg_match('/ | ||
| + | $url = ''; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Подделка межсайтовых запросов (CSRF) ===== | ||
| + | |||
| + | Эта уязвимость часто появляется в плагинах из-за отсутствия понимания этой проблемы, | ||
| + | |||
| + | Подделка межсайтовых запросов относится к атаке, при которой вредоносный сайт обманывает браузер жертвы, | ||
| + | |||
| + | ===Добавление токена безопасности=== | ||
| + | |||
| + | DokuWiki предлагает функции, | ||
| + | |||
| + | |||
| + | Вы как автор плагина несете ответственность за фактическую проверку токена перед выполнением авторизованных действий с использованием функции [[https:// | ||
| + | |||
| + | ==See also== | ||
| + | |||
| + | * [[wp> | ||
| + | * [[https:// | ||
| + | |||
| + | ==== Типичный пример уязвимости ==== | ||
| + | |||
| + | Ниже приведен простейший пример для начала. У вас может быть более сложный плагин для защиты, | ||
| + | |||
| + | Представьте, | ||
| + | |||
| + | <code html> | ||
| + | <form action="" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Затем вы обрабатываете эту форму следующим образом: | ||
| + | |||
| + | <code php> | ||
| + | global $INPUT; | ||
| + | |||
| + | if($INPUT-> | ||
| + | do_something_with_yn($INPUT-> | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Итак, пользователь подключен, | ||
| + | |||
| + | <code html> | ||
| + | <img src=" | ||
| + | </ | ||
| + | |||
| + | Что тогда будет делать браузер пользователя? | ||
| + | |||
| + | Браузер обработает это изображение как любое другое и отправит запрос на этот URL . Ваш плагин увидит, | ||
| + | |||
| + | Это один из примеров CSRF. Теперь, | ||
| + | |||
| + | ==== Предотвращение CSRF-атак ==== | ||
| + | |||
| + | Помните вашу форму выше? Давайте добавим в нее ввод: | ||
| + | |||
| + | <code html> | ||
| + | <form action="" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Видите первый ввод? Да? Хорошо. Теперь вам нужно проверить токен безопасности при получении формы, перед ее обработкой: | ||
| + | |||
| + | <code php> | ||
| + | global $INPUT; | ||
| + | |||
| + | if($INPUT-> | ||
| + | do_something_with_yn($INPUT-> | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Поскольку вредоносный веб-сайт никогда не найдет значение скрытого ввода «sectok», ваша форма больше не уязвима для CSRF. | ||
| + | |||
| + | **Примечание**: | ||
| + | |||
| + | |||
| + | |||
| + | ===== Удаленное включение кода ===== | ||
| + | |||
| + | Эта атака позволяет злоумышленнику внедрить код (PHP) в ваше приложение. Это может произойти при включении файлов или использовании небезопасных функций операций, | ||
| + | |||
| + | **Всегда фильтруйте любые входные данные**, | ||
| + | |||
| + | ===== Утечка информации ===== | ||
| + | |||
| + | Эта атака может привести к раскрытию файлов, | ||
| + | |||
| + | **Всегда фильтруйте любые входные данные, | ||
| + | |||
| + | **Всегда используйте функции проверки ACL DokuWiki при доступе к данным страницы.** | ||
| + | |||
| + | ===== SQL-инъекция ===== | ||
| + | |||
| + | Эта атака редко актуальна в DokuWiki, поскольку база данных не используется. Однако, | ||
| + | |||
| + | Дополнительная информация: | ||
| + | |||
| + | * [[wp>SQL injection|SQL-инъекция]] | ||
| + | |||
| + | |||
| + | ===== Сообщение о проблемах безопасности ===== | ||
| + | |||
| + | Если у вас возникли проблемы с плагином, | ||
| + | |||
| + | Дополнительно к [[wiki: | ||
| + | |||
| + | После устранения проблемы и выпуска новой версии это поле следует снова удалить. | ||
wiki/devel/security.1735913270.txt.gz · Последнее изменение: (внешнее изменение)
