Skip to content

Commit ae9d7b8

Browse files
committed
реализация правила + precommit
1 parent 1c83f52 commit ae9d7b8

File tree

8 files changed

+249
-0
lines changed

8 files changed

+249
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Запуск внешних приложений (ExternalAppStarting)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Описание диагностики
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
Для контроля безопасности кода необходимо контролировать запуск внешних приложений из кода 1С.
7+
8+
Данное правило распространяется на все способы запуска внешних программ, в том числе:
9+
- КомандаСистемы
10+
- ЗапуститьПриложение
11+
- НачатьЗапускПриложения
12+
- ЗапуститьПриложениеАсинх
13+
- ПерейтиПоНавигационнойСсылке или ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку
14+
- ФайловаяСистемаКлиент.ЗапуститьПрограмму (в клиентском коде) и ФайловаяСистема.ЗапуститьПрограмму (в серверном коде)
15+
- ФайловаяСистемаКлиент.ОткрытьПроводник
16+
- ФайловаяСистемаКлиент.ОткрытьФайл
17+
18+
## Примеры
19+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
20+
```bsl
21+
Процедура Метод()
22+
СтрокаКоманды = "";
23+
ТекущийКаталог = "";
24+
ДождатьсяЗавершения = Истина;
25+
ОписаниеОповещения = Неопределено;
26+
ПараметрыКоманды = Новый Структура;
27+
28+
КомандаСистемы(СтрокаКоманды, ТекущийКаталог); // есть замечание
29+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог); // есть замечание
30+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, Истина); // есть замечание
31+
32+
НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
33+
34+
ПерейтиПоНавигационнойСсылке(СтрокаКоманды); // есть замечание
35+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды); // есть замечание
36+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды, ОписаниеОповещения); // есть замечание
37+
38+
ФайловаяСистемаКлиент.ЗапуститьПрограмму("ping 127.0.0.1 -n 5", ПараметрыКоманды); // есть замечание
39+
ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
40+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды); // есть замечание
41+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
42+
43+
ФайловаяСистемаКлиент.ОткрытьПроводник("C:\Users"); // есть замечание
44+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды); // есть замечание
45+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды, ОписаниеОповещения); // есть замечание
46+
47+
КонецПроцедуры
48+
49+
&НаКлиенте
50+
Асинх Процедура Подключить()
51+
СтрокаКоманды = "";
52+
ТекущийКаталог = "";
53+
ДождатьсяЗавершения = Истина;
54+
55+
Ждать ЗапуститьПриложениеАсинх(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
56+
КонецПроцедуры
57+
```
58+
59+
## Источники
60+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
61+
<!-- Примеры источников
62+
63+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
64+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
65+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
66+
- [стандарт Безопасность запуска приложений](https://its.1c.ru/db/v8std/content/774/hdoc)
67+
- [стандарт Ограничение на выполнение «внешнего» кода](https://its.1c.ru/db/v8std/content/669/hdoc )
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# External applications starting (ExternalAppStarting)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Description
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
7+
## Examples
8+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
9+
10+
## Sources
11+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
12+
<!-- Примеры источников
13+
14+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
15+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
16+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
25+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope;
26+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
27+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
28+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
29+
import com.github._1c_syntax.utils.CaseInsensitivePattern;
30+
31+
import java.util.regex.Pattern;
32+
33+
@DiagnosticMetadata(
34+
type = DiagnosticType.VULNERABILITY,
35+
severity = DiagnosticSeverity.MAJOR,
36+
minutesToFix = 5,
37+
tags = {
38+
DiagnosticTag.SUSPICIOUS
39+
},
40+
scope = DiagnosticScope.BSL
41+
42+
)
43+
public class ExternalAppStartingDiagnostic extends AbstractFindMethodDiagnostic {
44+
private static final Pattern messagePattern = CaseInsensitivePattern.compile(
45+
"КомандаСистемы|System|ЗапуститьПриложение|RunApp|НачатьЗапускПриложения|BeginRunningApplication" +
46+
"|ЗапуститьПриложениеАсинх|RunAppAsync|ПерейтиПоНавигационнойСсылке|GotoURL" +
47+
"|ОткрытьНавигационнуюСсылку|ЗапуститьПрограмму|ОткрытьПроводник|ОткрытьФайл"
48+
);
49+
// TODO Использование COM объектов "Wscript.Shell" и "Shell.Application" + документация в описании правила
50+
51+
public ExternalAppStartingDiagnostic() {
52+
super(messagePattern);
53+
}
54+
55+
}

src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,16 @@
642642
"title": "Ban export global module variables",
643643
"$id": "#/definitions/ExportVariables"
644644
},
645+
"ExternalAppStarting": {
646+
"description": "External applications starting",
647+
"default": true,
648+
"type": [
649+
"boolean",
650+
"object"
651+
],
652+
"title": "External applications starting",
653+
"$id": "#/definitions/ExternalAppStarting"
654+
},
645655
"ExtraCommas": {
646656
"description": "Commas without a parameter at the end of a method call",
647657
"default": true,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Check the launch of an external application
2+
diagnosticName=External applications starting
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Проверьте запуск внешнего приложения
2+
diagnosticName=Запуск внешних приложений
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import org.eclipse.lsp4j.Diagnostic;
25+
import org.junit.jupiter.api.Test;
26+
27+
import java.util.List;
28+
29+
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;
30+
31+
class ExternalAppStartingDiagnosticTest extends AbstractDiagnosticTest<ExternalAppStartingDiagnostic> {
32+
ExternalAppStartingDiagnosticTest() {
33+
super(ExternalAppStartingDiagnostic.class);
34+
}
35+
36+
@Test
37+
void test() {
38+
39+
List<Diagnostic> diagnostics = getDiagnostics();
40+
41+
assertThat(diagnostics, true)
42+
.hasRange(8, 4, 18)
43+
.hasRange(9, 4, 23)
44+
.hasRange(10, 4, 23)
45+
.hasRange(12, 4, 26)
46+
.hasRange(14, 4, 32)
47+
.hasRange(15, 26, 52)
48+
.hasRange(16, 26, 52)
49+
.hasRange(18, 26, 44)
50+
.hasRange(19, 26, 44)
51+
.hasRange(20, 20, 38)
52+
.hasRange(21, 20, 38)
53+
.hasRange(23, 26, 42)
54+
.hasRange(24, 26, 37)
55+
.hasRange(25, 26, 37)
56+
.hasRange(35, 10, 34)
57+
.hasSize(15)
58+
;
59+
}
60+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
2+
Процедура Метод()
3+
СтрокаКоманды = "";
4+
ТекущийКаталог = "";
5+
ДождатьсяЗавершения = Истина;
6+
ОписаниеОповещения = Неопределено;
7+
ПараметрыКоманды = Новый Структура;
8+
9+
КомандаСистемы(СтрокаКоманды, ТекущийКаталог); // есть замечание
10+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог); // есть замечание
11+
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, Истина); // есть замечание
12+
13+
НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
14+
15+
ПерейтиПоНавигационнойСсылке(СтрокаКоманды); // есть замечание
16+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды); // есть замечание
17+
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СтрокаКоманды, ОписаниеОповещения); // есть замечание
18+
19+
ФайловаяСистемаКлиент.ЗапуститьПрограмму("ping 127.0.0.1 -n 5", ПараметрыКоманды); // есть замечание
20+
ФайловаяСистемаКлиент.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
21+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды); // есть замечание
22+
ФайловаяСистема.ЗапуститьПрограмму(СтрокаКоманды, ПараметрыКоманды); // есть замечание
23+
24+
ФайловаяСистемаКлиент.ОткрытьПроводник("C:\Users"); // есть замечание
25+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды); // есть замечание
26+
ФайловаяСистемаКлиент.ОткрытьФайл(СтрокаКоманды, ОписаниеОповещения); // есть замечание
27+
28+
КонецПроцедуры
29+
30+
&НаКлиенте
31+
Асинх Процедура Подключить()
32+
СтрокаКоманды = "";
33+
ТекущийКаталог = "";
34+
ДождатьсяЗавершения = Истина;
35+
36+
Ждать ЗапуститьПриложениеАсинх(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения); // есть замечание
37+
КонецПроцедуры

0 commit comments

Comments
 (0)