Инструменты пользователя

Инструменты сайта


wiki:devel:security

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
wiki:devel:security [2025/01/03 17:02] – создано vladpolskiywiki:devel:security [2025/01/03 17:48] (текущий) – [Reporting Security Issues] vladpolskiy
Строка 1: Строка 1:
-====== Security Guidelines for Plugin Authors ======+====== Правила безопасности для авторов плагинов ======
  
-Creating [[:plugins]] for DokuWiki is very easy even for novice PHP [[devel:plugins|programmers]]. To make sure your plugin does not compromise the security of the whole wiki it is installed onyou should follow the guidelines outlined on this page.+Создание [[wiki:plugins|плагинов]] для DokuWiki очень просто даже для начинающих  [[wiki:devel:plugins|программистов]] PHPЧтобы убедиться, что ваш плагин не ставит под угрозу безопасность всей вики, на которой он установлен, вам следует следовать рекомендациямизложенным на этой странице.
  
-:!: Improvement of this page is always welcomeIt's in a very raw state and should be extended with more indepth infolinks and examples.+:!: Улучшение этой страницы всегда приветствуетсяОна находится в очень сыром состоянии и должна быть расширена более подробной информациейссылками и примерами.
  
-===Summary===+===Краткое содержание===
  
-A list of the most common security issues and how to avoid them can be found on this pageA short summary: +Список наиболее распространенных проблем безопасности и способы их избежания можно найти на этой страницеКраткое резюме:
-  * Cross Site Scripting (XSS) -- inserts malicious code into website to manipulate site in browser of user +
-  * Cross Site Request Forgery (CSRF) -- tricks to let you do unknowingly harmful actions on your site  +
-  * Remote Code Inclusion -- includes code on server that's executed there +
-  * Information leaks -- there is too much information shown +
-  * SQL injection -- one can do unwanted requests on your data+
  
-Also there is added a note about [[#reporting Security Issues]].+  * Межсайтовый скриптинг (XSS) — вставляет вредоносный код на веб-сайт для манипулирования сайтом в браузере пользователя. 
 +  * Подделка межсайтовых запросов (CSRF) — уловки, позволяющие вам совершать неосознанные вредоносные действия на вашем сайте. 
 +  * Удаленное включение кода – включает код на сервере, который там выполняется. 
 +  * Утечка информации – отображается слишком много информации 
 +  * SQL-инъекция – можно выполнить нежелательные запросы к вашим данным
  
 +Также добавлено примечание о [[#reporting Security Issues|необходимости сообщать о проблемах безопасности ]].
  
-===== Cross Site Scripting (XSS) ===== 
  
-This is probably the most common vulnerability to be found in DokuWiki plugins.+===== Межсайтовый скриптинг (XSS) =====
  
-Cross Site Scripting refers to an attack where malicious JavaScript code is introduced into a website. This can be used to redirect innocent users to malicious websites or to steal authentication cookies.+Это, вероятно, самая распространенная уязвимость, встречающаяся в плагинах DokuWiki.
  
-DokuWiki's plugin mechanism gives plugin developers a great deal of flexibility. In the case of syntax plugins in particularthe framework gives plugins the ability to work with raw unprocessed output. This means the wiki page data which reaches your plugin has not been processed at allAnd there will be no further processing on the output after it leaves your plugin.+Cross Site Scripting относится к атакепри которой вредоносный код JavaScript внедряется на веб-сайтЭто может использоваться для перенаправления невинных пользователей на вредоносные веб-сайты или для кражи аутентификационных cookie-файлов.
  
-===Escaping output=== +Механизм плагинов DokuWiki дает разработчикам плагинов большую гибкость. В случае с плагинами синтаксиса, в частности, фреймворк дает плагинам возможность работать с сырым необработанным выводом. Это означает, что данные страницы вики, которые достигают вашего плагина, вообще не были обработаныИ не будет никакой дальнейшей обработки вывода после того, как он покинет ваш плагин.
-At an absolute minimum the plugin should ensure any raw data output has all HTML special characters converted to HTML entities using the [[phpfn>htmlspecialchars()]] function. DokuWiki provides a convenient shortcut called [[xref>hsc()]] for the functionURLs values should be escaped using [[phpfn>rawurlencode()]].+
  
-Also any wiki data extracted and used internally (eguser namesshould be treated with suspicion.+===Выход из режима экранирования=== 
 +Как минимум, плагин должен гарантировать, что все выходные необработанные данные будут содержать все специальные символы HTML , преобразованные в сущности HTML с помощью функции [[phpfn>htmlspecialchars()]]DokuWiki предоставляет удобный ярлык [[xref>hsc()]] для этой функции. Значения URL-адресов следует экранировать с помощью [[phpfn>rawurlencode()]].
  
-===Input checking=== +Кроме тогоследует с подозрением относиться к любым данным викиизвлеченным и используемым внутри компании (например, именам пользователей).
-Check always all your input. Use whitelistsfiltersconversions to the exact data type you mean e.g. from a number inputted as mixed php value to integer and more to ensure you have __only__ data you allowed.+
  
-Please also refer to our chapter on processing [[request vars]] like ''_GET''''_POST'' or ''_SERVER''.+===Проверка входных данных=== 
 +Всегда проверяйте все ваши входные данные. Используйте белые спискифильтры, преобразования в точный тип данных, который вы имеете в виду, например, из числа, введенного как смешанное значение php, в целое число и т. д., чтобы убедиться, что у вас есть __только__ разрешенные вами данные.
  
 +Также ознакомьтесь с нашей главой об обработке [[wiki:devel:request_vars|переменных запросов]], таких как ''_GET'', ''_POST'' или ''_SERVER''.
  
-==See also:== 
  
-  * [[wp>Cross-site scripting]] +==Смотрите также:==
-  * [[http://ha.ckers.org/xss.html|XSS Cheat Sheet]]+
  
-==== Typical Vulnerability Examples ====+  * [[wp>Cross-site scripting|Межсайтовый скриптинг]] 
 +  * FIXME[[http://ha.ckers.org/xss.html|Шпаргалка по XSS]]
  
-Below are some very common problems shown. The examples are very simple to make the general problem clear. Your plugin is probably more complicated, but you need to keep track of the same vulnerabilities.+==== Типичные примеры уязвимостей ====
  
-=== Syntax Bodies ===+Ниже показаны некоторые очень распространенные проблемы. Примеры очень просты, чтобы сделать общую проблему понятной. Ваш плагин, вероятно, сложнее, но вам нужно отслеживать те же уязвимости.
  
-Many simple syntax plugins will take some user input and format it in custom HTML.+=== Синтаксис Тела ===
  
-ExampleHere is a abridged syntax plugin to wrap a given input in a bold tag.+Многие простые плагины синтаксиса принимают часть введенных пользователем данных и форматируют их в виде пользовательского HTML . 
 + 
 +ПримерВот плагин сокращенного синтаксиса, позволяющий выделить заданный ввод жирным шрифтом.
  
 <code php> <code php>
 class syntax_plugin_bold extends DokuWiki_Syntax_Plugin { class syntax_plugin_bold extends DokuWiki_Syntax_Plugin {
-    // common plugin functions ommited+    // общие функции плагина опущены
  
     public function connectTo($mode) {     public function connectTo($mode) {
Строка 65: Строка 66:
     public function render($format, Doku_Renderer $renderer, $data) {     public function render($format, Doku_Renderer $renderer, $data) {
         if($format != 'xhtml') return false;         if($format != 'xhtml') return false;
-        $renderer->doc .= '<b>' . $data[0] . '</b>';  // no escaping+        $renderer->doc .= '<b>' . $data[0] . '</b>';  // без экранирования
     }     }
 } }
 </code> </code>
  
-As you can seethe raw input data captured in the lexer pattern is just passed on to the render methodwhere no escaping at all is doneMalicious users could introduce what ever JavaScript and HTML code they want.+Как вы можете видетьнеобработанные входные данныезахваченные в шаблоне лексера, просто передаются в метод рендеринга, где экранирование вообще не выполняетсяЗлонамеренные пользователи могут вводить любой код JavaScript и HTML , который они хотят.
  
-The fix is simpleproper escaping.+Решение простоеправильный побег.
  
 <code php> <code php>
 class syntax_plugin_bold extends DokuWiki_Syntax_Plugin { class syntax_plugin_bold extends DokuWiki_Syntax_Plugin {
-    // common plugin functions ommited+    // общие функции плагина опущены
  
     public function connectTo($mode) {     public function connectTo($mode) {
Строка 88: Строка 89:
     public function render($format, Doku_Renderer $renderer, $data) {     public function render($format, Doku_Renderer $renderer, $data) {
         if($format != 'xhtml') return false;         if($format != 'xhtml') return false;
-        $renderer->doc .= '<b>' . htmlspecialchars($data[0]) . '</b>'; //escaping+        $renderer->doc .= '<b>' . htmlspecialchars($data[0]) . '</b>'; //экранирование 
     }     }
 } }
 </code> </code>
  
-=== Forms ===+=== Формы ===
  
-When your plugin provides a form it is very common to validate the input and redisplay the form with the received user input when a validation error occurs.+Когда ваш плагин предоставляет форму, очень часто требуется проверить вводимые данные и повторно отобразить форму с полученными данными пользователя в случае возникновения ошибки проверки.
  
-ExampleThe following shows a form vulenerable to an XSS attack because it does not escape the user provided input correctly:+Примерниже показана форма, уязвимая для атаки XSS, поскольку она не экранирует правильно введенные пользователем данные:
  
 <code php> <code php>
 <form action="" method="post"> <form action="" method="post">
     <input type="text" name="q" value="<?php echo $_REQUEST['q']?>" />      <input type="text" name="q" value="<?php echo $_REQUEST['q']?>" /> 
-    <input type="submit" />                     //no escaping+    <input type="submit" />                     //без экранирования
 </form> </form>
 </code> </code>
  
-Providing ''%%"><script>alert('bang')</script>%%'' as user input would exploit the vulnerability.+Предоставление данных ''%%"><script>alert('bang')</script>%%'' в качестве входных данных пользователя приведет к эксплуатации уязвимости.
  
-To fix the form use the [[phpfn>htmlspecialchars|htmlspecialchars()]] or DokuWiki shortcut [[xref>hsc|hsc()]] function:+Для исправления формы используйте функцию [[phpfn>htmlspecialchars|htmlspecialchars()]] или функцию DokuWiki shortcut [[wiki:xref:hsc|hsc()]]:
  
 <code php> <code php>
 <form action="" method="post"> <form action="" method="post">
     <input type="text" name="q" value="<?php echo hsc($_REQUEST['q'])?>" />     <input type="text" name="q" value="<?php echo hsc($_REQUEST['q'])?>" />
-    <input type="submit" />                                      //escaping+    <input type="submit" />                                      //экранирование
 </form> </form>
 </code> </code>
  
-In general it is recommended to not hand-craft formsbut use DokuWiki'[[form|form library]].+В целом рекомендуется не создавать формы вручнуюа использовать [[wiki:devel:form|библиотеку форм]] DokuWiki .
  
-=== Classes and other Attributes ===+=== Классы и другие атрибуты ===
  
-Often plugins will accept multiple parameters and options that are used to modify the output of the plugin.+Часто плагины принимают несколько параметров и опций, которые используются для изменения выходных данных плагина.
  
-Imagine a plugin accepting the following input to display a message box:+Представьте себе плагин, принимающий следующие входные данные для отображения окна сообщения:
  
 <code> <code>
Строка 129: Строка 130:
 </code> </code>
  
-In the render method of this syntax there might be code like this:+В методе рендеринга этого синтаксиса может быть такой код:
  
 <code php> <code php>
-$renderer->doc .= '<div class="msg_' . $class . '">'  //$class can be everything+$renderer->doc .= '<div class="msg_' . $class . '">'  //$class может быть чем угодно 
                        . htmlspecialchars($message)                        . htmlspecialchars($message)
                 . '</div>';                 . '</div>';
Строка 138: Строка 139:
 </code> </code>
  
-As you can see the message itself is properly escapedbut the class is notInstead of escaping it might be more sensible to use a whitelist of allowed classes instead with a default fallback:+Как вы видитесамо сообщение правильно экранировано, но класс — нетВместо экранирования может быть разумнее использовать белый список разрешенных классов с резервным вариантом по умолчанию::
  
 <code php> <code php>
-$allowed = ['notice', 'info', 'warning', 'error'];   // whitelist+$allowed = ['notice', 'info', 'warning', 'error'];   // белый список 
 if(!in_array($class, $allowed){                          if(!in_array($class, $allowed){                         
-    $class = 'notice'; // unknown inputfall back to a sane default+    $class = 'notice'; // неизвестный вводвернуться к разумному значению по умолчанию
 } }
 $renderer->doc .= '<div class="msg_' . $class . '">' $renderer->doc .= '<div class="msg_' . $class . '">'
Строка 150: Строка 151:
 </code> </code>
  
-===input URLs ===+===входные URL-адреса ===
  
-When a plugin accepts URLs as input you need to make sureusers can not pass the ''%%javascript://%%'' pseudo protocol.+Когда плагин принимает URL-адреса в качестве входных данныхнеобходимо убедиться, что пользователи не смогут передать ''%%javascript://%%'' псевдо-протокол.
  
-Here is an example how a very simple check could look liketo make sure only http and https URLs are used.+Вот пример тогокак может выглядеть очень простая проверка, позволяющая убедиться, что используются только URL-адреса http и https.
  
 <code php> <code php>
-// empty URL on protocol mismatch+// пустой URL при несоответствии протокола 
 if(!preg_match('/^https?:\/\//i', $url)) { if(!preg_match('/^https?:\/\//i', $url)) {
     $url = '';     $url = '';
Строка 163: Строка 164:
 </code> </code>
  
-===== Cross Site Request Forgery (CSRF) =====+===== Подделка межсайтовых запросов (CSRF) =====
  
-This vulnerability often appears into plugins due to the lack of understanding of this issueoften confused with the XSS.+Эта уязвимость часто появляется в плагинах из-за отсутствия понимания этой проблемыее часто путают с XSS.
  
-Cross Site Request Forgery refers to an attack where the victim's browser is tricked by a malicious site to ask for a page on a vulnerable site to do an unwanted actionThe attack assumes the victim's browser has credentials to change something on the vulnerable site.+Подделка межсайтовых запросов относится к атаке, при которой вредоносный сайт обманывает браузер жертвы, запрашивая страницу на уязвимом сайте для выполнения нежелательного действияАтака предполагает, что браузер жертвы имеет учетные данные для изменения чего-либо на уязвимом сайте.
  
-===Adding security token===+===Добавление токена безопасности===
  
-DokuWiki offers functions to help you deal against CSRF attacks. [[xref>getSecurityToken()]] will create a token that should be used to protect any authenticated actionIt has to be included in links or forms triggering that actionAll forms created with the [[form|form library]] will have security tokens added automaticallyfor handcrafted forms the [[xref>formSecurityToken()]] function can be used.+DokuWiki предлагает функции, которые помогут вам бороться с атаками CSRF. [[https://codesearch.dokuwiki.org/xref/dokuwiki/inc/common.php?r=&mo=3231&fi=116#116|getSecurityToken()]] создаст токен, который следует использовать для защиты любого аутентифицированного действияОн должен быть включен в ссылки или формы, запускающие это действиеВсе формы, созданные с помощью [[wiki:devel:form|библиотеки форм]] будут иметь автоматически добавленные токены безопасностидля форм, созданных вручную, можно использовать функцию [[https://codesearch.dokuwiki.org/xref/dokuwiki/inc/common.php?r=&mo=4438&fi=157#157|formSecurityToken()]].
  
  
-It is your resposibility as the plugin author to actually check the token before executing authorized actions using the [[xref>checkSecurityToken()]] function.+Вы как автор плагина несете ответственность за фактическую проверку токена перед выполнением авторизованных действий с использованием функции [[https://codesearch.dokuwiki.org/xref/dokuwiki/inc/common.php?r=&mo=3783&fi=133#133|checkSecurityToken()]].
  
 ==See also== ==See also==
  
-  * [[wp>Cross Site Request Forgery]] +  * [[wp>Cross Site Request Forgery|Подделка межсайтовых запросов]] 
-  * [[https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29|OWASP explanation]]+  * [[https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29|Объяснение OWASP]]
  
-==== Typical Vulnerability Example ====+==== Типичный пример уязвимости ====
  
-Below is the simplest example to startYou may have a more complicated plugin of your own to securehere is just a simple example based on form.+Ниже приведен простейший пример для началаУ вас может быть более сложный плагин для защитывот простой пример на основе формы.
  
-Imagine you want to know something which can be answered to Yes or Noyou would have a form of this type:+Представьтечто вы хотите узнать что-то, на что можно ответить «Да» или «Нет», у вас получится форма такого типа:
  
 <code html> <code html>
Строка 195: Строка 196:
 </code> </code>
  
-Then you process this form as follows:+Затем вы обрабатываете эту форму следующим образом:
  
 <code php> <code php>
Строка 205: Строка 206:
 </code> </code>
  
-So a user is connected to answer this questionbut he doesn't know the response yetLet's take time to think and browse the web... +Итакпользователь подключен, чтобы ответить на этот вопрос, но он пока не знает ответаДавайте уделим время размышлениям и просмотрим веб-страницы… Теперь пользователь посещает вредоносный веб-сайткоторый знает или нетчто пользователь может быть подключен к вашему DokuWiki. На этом веб-сайте разработчик включил этот HTML- тег изображения:
-Now the user is visiting a malicious websiteone which knowor not, that the user may be connected to your DokuWiki. In this website, the developer included this HTML image tag:+
  
 <code html> <code html>
Строка 212: Строка 212:
 </code> </code>
  
-What will the user's browser do then?+Что тогда будет делать браузер пользователя?
  
-The browser will process this image as any other and will send a request to this URL. Your plugin will then see that ''$_GET['yn']'' is set and will call the ''do_something_with_yn()'' function.+Браузер обработает это изображение как любое другое и отправит запрос на этот URL . Ваш плагин увидит, что ''$_GET['yn']'' установлено, и вызовет ''do_something_with_yn()'' функцию.
  
-That's one of the examples of CSRF. Nowhow to fix this security hole?+Это один из примеров CSRF. Теперькак исправить эту дыру в безопасности?
  
-==== Prevent CSRF ====+==== Предотвращение CSRF-атак ====
  
-Remember your form aboveLet's add an input in it:+Помните вашу форму вышеДавайте добавим в нее ввод:
  
 <code html> <code html>
Строка 231: Строка 231:
 </code> </code>
  
-Do you see the first inputYesGoodNow you have to check the security token when you receive the formbefore processing it:+Видите первый вводДаХорошоТеперь вам нужно проверить токен безопасности при получении формыперед ее обработкой:
  
 <code php> <code php>
Строка 241: Строка 241:
 </code> </code>
  
-As the malicious website will never find the value of the "sectok" hidden inputyour form is no longer vulnerable to CSRF.+Поскольку вредоносный веб-сайт никогда не найдет значение скрытого ввода «sectok»ваша форма больше не уязвима для CSRF.
  
-**Note:** If the security token is not validthe ''checkSecurityToken()'' function displays a message which informs the user.+**Примечание**: Если токен безопасности недействителен, ''checkSecurityToken()'' функция отображает сообщение, информирующее пользователя.
  
  
  
-===== Remote Code Inclusion =====+===== Удаленное включение кода =====
  
-This attack allows an attacker to inject (PHP) code into your applicationThis may occur on including filesor using unsafe operations functions like [[phpfn>eval()]] or [[phpfn>system()]].+Эта атака позволяет злоумышленнику внедрить код (PHP) в ваше приложениеЭто может произойти при включении файлов или использовании небезопасных функций операцийтаких как [[phpfn>eval()]] или [[phpfn>system()]].
  
-**Always filter any input** that will be used to load files or that is passed as an argument to external commands.+**Всегда фильтруйте любые входные данные**, которые будут использоваться для загрузки файлов или которые передаются в качестве аргумента внешним командам.
  
-===== Information leaks =====+===== Утечка информации =====
  
-This attack may lead to the exposure of files that should usually be protected by DokuWiki'ACL or it might expose files on the server (like ''/etc/passwd'').+Эта атака может привести к раскрытию файлов, которые обычно должны быть защищены ACL DokuWiki , или может раскрыть файлы на сервере (например, ''/etc/passwd'').
  
-**Always filter any input** that will be used to load files or that is passed as an argument to external commands.+**Всегда фильтруйте любые входные данные,** которые будут использоваться для загрузки файлов или которые передаются в качестве аргумента внешним командам.
  
-**Always use DokuWiki'ACL check functions when accessing page data**.+**Всегда используйте функции проверки ACL DokuWiki при доступе к данным страницы.**
  
-===== SQL injection =====+===== SQL-инъекция =====
  
-This attack is rarely relevant in DokuWiki because no database is usedHowever if your plugin accesses a database always escape all values before using them in SQL statements.+Эта атака редко актуальна в DokuWiki, поскольку база данных не используетсяОднако, если ваш плагин обращается к базе данных, всегда экранируйте все значения перед их использованием в операторах SQL.
  
-More info:+Дополнительная информация:
  
-  * [[wp>SQL injection]]+  * [[wp>SQL injection|SQL-инъекция]]
  
  
-===== Reporting Security Issues =====+===== Сообщение о проблемах безопасности =====
  
-If you encounter an issue with a plugin please inform the author of the plugin via emailoptionally putting [[andi@splitbrain.org|Andi]] or the [[:mailinglist]] on CC.+Если у вас возникли проблемы с плагиномсообщите об этом автору плагина по электронной почте, при желании указав [[andi@splitbrain.org|Andi]] or the [[wiki:mailinglist|список рассылки]] on CC.
  
-Additionally a ''securityissue'' field with a short description of the problem should be added to the [[plugin:repository|data]] on the page of the pluginThis will create a red warning box and will delist the plugin from the main plugin list.+Дополнительно к [[wiki:lugin:repository|данным]] на странице плагина ''securityissue'' следует добавить поле с кратким описанием проблемы Это создаст красное предупреждающее поле и исключит плагин из основного списка плагинов.
  
-Once the issue was fixed and a new release was made, this field should be removed again.+После устранения проблемы и выпуска новой версии это поле следует снова удалить.
wiki/devel/security.1735912946.txt.gz · Последнее изменение: vladpolskiy