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

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


wiki:devel:security

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
wiki:devel:security [2025/01/03 17:17] – [Cross Site Scripting (XSS)] vladpolskiywiki:devel:security [2025/01/03 17:48] (текущий) – [Reporting Security Issues] vladpolskiy
Строка 42: Строка 42:
   * FIXME[[http://ha.ckers.org/xss.html|Шпаргалка по XSS]]   * FIXME[[http://ha.ckers.org/xss.html|Шпаргалка по XSS]]
  
-==== Typical Vulnerability Examples ====+==== Типичные примеры уязвимостей ====
  
-Below are some very common problems shownThe examples are very simple to make the general problem clearYour plugin is probably more complicatedbut 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.+Многие простые плагины синтаксиса принимают часть введенных пользователем данных и форматируют их в виде пользовательского HTML .
  
-ExampleHere is a abridged syntax plugin to wrap a given input in a bold tag.+ПримерВот плагин сокращенного синтаксиса, позволяющий выделить заданный ввод жирным шрифтом.
  
 <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) {
Строка 66: Строка 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) {
Строка 89: Строка 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>
Строка 130: Строка 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>';
Строка 139: Строка 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 . '">'
Строка 151: Строка 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 = '';
Строка 164: Строка 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>
Строка 196: Строка 196:
 </code> </code>
  
-Then you process this form as follows:+Затем вы обрабатываете эту форму следующим образом:
  
 <code php> <code php>
Строка 206: Строка 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>
Строка 213: Строка 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>
Строка 232: Строка 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>
Строка 242: Строка 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.1735913830.txt.gz · Последнее изменение: vladpolskiy