From 5c3bb5bbc25921b7d485f0b6a447be82617c5c6f Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 25 Jul 2023 19:15:11 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0?= =?UTF-8?q?=20FileSystemAccess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/diagnostics/FileSystemAccess.md | 35 +++++++++ docs/en/diagnostics/FileSystemAccess.md | 16 ++++ .../FileSystemAccessDiagnostic.java | 78 +++++++++++++++++++ .../configuration/parameters-schema.json | 10 +++ .../FileSystemAccessDiagnostic_en.properties | 2 + .../FileSystemAccessDiagnostic_ru.properties | 2 + .../FileSystemAccessDiagnosticTest.java | 70 +++++++++++++++++ .../FileSystemAccessDiagnostic.bsl | 41 ++++++++++ 8 files changed, 254 insertions(+) create mode 100644 docs/diagnostics/FileSystemAccess.md create mode 100644 docs/en/diagnostics/FileSystemAccess.md create mode 100644 src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java create mode 100644 src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties create mode 100644 src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties create mode 100644 src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java create mode 100644 src/test/resources/diagnostics/FileSystemAccessDiagnostic.bsl diff --git a/docs/diagnostics/FileSystemAccess.md b/docs/diagnostics/FileSystemAccess.md new file mode 100644 index 00000000000..36cbd40a1a5 --- /dev/null +++ b/docs/diagnostics/FileSystemAccess.md @@ -0,0 +1,35 @@ +# Доступ к файловой системе (FileSystemAccess) + + +## Описание диагностики + +При код-ревью или аудите кода необходимо проверять обращения к файлам, каталогам и набор действий, выполняемых с ними, для исключения передачи конфиденциальной или защищенной информации, а также для исключения деструктивных действий с файловой системой. + +## Примеры + +```bsl + Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI); // есть замечание + Текст = Новый ЗаписьТекста("d:\win.txt", КодировкаТекста.ANSI); // есть замечание + + ЗначениеВФайл("C:\Temp\PersonalData.txt", ЛичныеДанные); // есть замечание + КопироватьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть замечание + + МассивИмен = Новый Массив(); + МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.1"); + ОбъединитьФайлы(МассивИмен, "C:\Windows\Temp\Presentation.ppt"); // есть замечание + + ПереместитьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть замечание + РазделитьФайл("C:\Windows\Temp\Presentation.ppt", 1024 * 1024 ); // есть замечание + СоздатьКаталог("C:\Temp"); // есть замечание + УдалитьФайлы("C:\temp\Works"); // есть замечание +``` + +## Источники + + +* [Стандарт Доступ к файловой системе из кода конфигурации](https://its.1c.ru/db/v8std#content:542:hdoc) +* [Стандарт Безопасность запуска приложений](https://its.1c.ru/db/v8std#content:774:hdoc) diff --git a/docs/en/diagnostics/FileSystemAccess.md b/docs/en/diagnostics/FileSystemAccess.md new file mode 100644 index 00000000000..67b207cf852 --- /dev/null +++ b/docs/en/diagnostics/FileSystemAccess.md @@ -0,0 +1,16 @@ +# FileSystemAccess (FileSystemAccess) + + +## Description + + +## Examples + + +## Sources + + diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java new file mode 100644 index 00000000000..37d9418e87a --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -0,0 +1,78 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2023 + * Alexey Sosnoviy , Nikita Fedkin and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * BSL Language Server is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * BSL Language Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BSL Language Server. + */ +package com.github._1c_syntax.bsl.languageserver.diagnostics; + +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; +import com.github._1c_syntax.bsl.languageserver.utils.bsl.Constructors; +import com.github._1c_syntax.bsl.parser.BSLParser; +import com.github._1c_syntax.utils.CaseInsensitivePattern; +import org.antlr.v4.runtime.tree.ParseTree; + +import java.util.regex.Pattern; + +@DiagnosticMetadata( + type = DiagnosticType.VULNERABILITY, + severity = DiagnosticSeverity.MINOR, + minutesToFix = 3, + tags = { + DiagnosticTag.SUSPICIOUS + }, + scope = DiagnosticScope.BSL +) +public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { + private static final Pattern NEW_EXPRESSION = CaseInsensitivePattern.compile( + "File|Файл|xBase|HTMLWriter|ЗаписьHTML|HTMLReader|ЧтениеHTML|FastInfosetReader|ЧтениеFastInfoset" + + "|FastInfosetWriter|ЗаписьFastInfoset|XSLTransform|ПреобразованиеXSL" + + "|ZipFileWriter|ЗаписьZipФайла|ZipFileReader|ЧтениеZipФайла|TextReader|ЧтениеТекста|TextWriter|ЗаписьТекста" + + "|TextExtraction|ИзвлечениеТекста|BinaryData|ДвоичныеДанные|FileStream|ФайловыйПоток"); + + private static final Pattern GLOBAL_METHODS = CaseInsensitivePattern.compile( + "ЗначениеВФайл|ValueToFile|КопироватьФайл|FileCopy|ОбъединитьФайлы|MergeFiles|ПереместитьФайл|MoveFile" + + "|РазделитьФайл|SplitFile|СоздатьКаталог|CreateDirectory|УдалитьФайлы|DeleteFiles" + + "|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir|КаталогДокументов|DocumentsDir" + + "|РабочийКаталогДанныхПользователя|UserDataWorkDir"); + // TODO добавить глобальные асинхронные методы работы с файлами + + public FileSystemAccessDiagnostic() { + super(GLOBAL_METHODS); + } + + @Override + public ParseTree visitNewExpression(BSLParser.NewExpressionContext ctx) { + Constructors.typeName(ctx).ifPresent((String typeName) -> { + var matcherTypeName = NEW_EXPRESSION.matcher(typeName); + if (matcherTypeName.matches()) { + diagnosticStorage.addDiagnostic(ctx); + } + }); + return super.visitNewExpression(ctx); + } + + @Override + protected boolean checkMethodCall(BSLParser.MethodCallContext ctx) { + return false; + } +} diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json index 9310767b6eb..2502c9da424 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json @@ -662,6 +662,16 @@ "title": "No NULL checks for fields from joined tables", "$id": "#/definitions/FieldsFromJoinsWithoutIsNull" }, + "FileSystemAccess": { + "description": "FileSystemAccess", + "default": true, + "type": [ + "boolean", + "object" + ], + "title": "FileSystemAccess", + "$id": "#/definitions/FileSystemAccess" + }, "ForbiddenMetadataName": { "description": "Metadata object has a forbidden name", "default": true, diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties new file mode 100644 index 00000000000..e8de30d28c1 --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties @@ -0,0 +1,2 @@ +diagnosticMessage=Check access to the file system +diagnosticName=FileSystemAccess diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties new file mode 100644 index 00000000000..3db2addccfd --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties @@ -0,0 +1,2 @@ +diagnosticMessage=Проверьте обращение к файловой системе +diagnosticName=Доступ к файловой системе diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java new file mode 100644 index 00000000000..04528445d2a --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java @@ -0,0 +1,70 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2023 + * Alexey Sosnoviy , Nikita Fedkin and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * BSL Language Server is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * BSL Language Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BSL Language Server. + */ +package com.github._1c_syntax.bsl.languageserver.diagnostics; + +import org.eclipse.lsp4j.Diagnostic; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; + +class FileSystemAccessDiagnosticTest extends AbstractDiagnosticTest { + FileSystemAccessDiagnosticTest() { + super(FileSystemAccessDiagnostic.class); + } + + @Test + void test() { + + List diagnostics = getDiagnostics(); + + assertThat(diagnostics, true) + .hasRange(1, 15, 35) + .hasRange(2, 15, 41) + .hasRange(3, 15, 31) + .hasRange(4, 15, 31) + .hasRange(5, 15, 38) + .hasRange(6, 15, 38) + .hasRange(7, 15, 33) + .hasRange(8, 15, 44) + .hasRange(9, 15, 44) + .hasRange(10, 15, 41) + .hasRange(11, 15, 41) + .hasRange(12, 15, 45) + .hasRange(13, 15, 41) + .hasRange(14, 15, 56) + .hasRange(19, 15, 41) + .hasRange(24, 15, 26) + + .hasRange(29, 4, 17) + .hasRange(30, 4, 18) + .hasRange(34, 4, 19) + .hasRange(36, 4, 19) + .hasRange(37, 4, 17) + .hasRange(38, 4, 18) + .hasRange(39, 4, 16) + .hasSize(23) + ; + + } +} diff --git a/src/test/resources/diagnostics/FileSystemAccessDiagnostic.bsl b/src/test/resources/diagnostics/FileSystemAccessDiagnostic.bsl new file mode 100644 index 00000000000..84333a26b2c --- /dev/null +++ b/src/test/resources/diagnostics/FileSystemAccessDiagnostic.bsl @@ -0,0 +1,41 @@ +Процедура Метод1() + Значение = Новый File(ИмяФайла); // есть ошибка + Значение = Новый xBase("C:\temp.dbf"); // есть ошибка + Значение = Новый HTMLWriter; // есть ошибка + Значение = Новый HTMLReader; // есть ошибка + Значение = Новый FastInfosetReader; // есть ошибка + Значение = Новый FastInfosetWriter; // есть ошибка + Значение = Новый XSLTransform; // есть ошибка + Значение = Новый ZipFileWriter(ИмяФайла); // есть ошибка + Значение = Новый ZipFileReader(ИмяФайла); // есть ошибка + Значение = Новый TextReader(ИмяФайла); // есть ошибка + Значение = Новый TextWriter(ИмяФайла); // есть ошибка + Значение = Новый TextExtraction(ИмяФайла); // есть ошибка + Значение = Новый BinaryData(ИмяФайла); // есть ошибка + Значение = Новый FileStream(ИмяФайла, РежимОткрытия); // есть ошибка +КонецПроцедуры + +&НаСервере +Процедура Метод2() + Значение = Новый xBase("C:\temp.dbf"); // есть ошибка +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура Метод3() + Значение = Новый xBase; // есть ошибка +КонецПроцедуры + +&НаКлиенте +Процедура Метод4() + ЗначениеВФайл("C:\Temp\PersonalData.txt", ЛичныеДанные); // есть ошибка + КопироватьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть ошибка + + МассивИмен = Новый Массив(); + МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.1"); + ОбъединитьФайлы(МассивИмен, "C:\Windows\Temp\Presentation.ppt"); // есть ошибка + + ПереместитьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть ошибка + РазделитьФайл("C:\Windows\Temp\Presentation.ppt", 1024 * 1024 ); // есть ошибка + СоздатьКаталог("C:\Temp"); // есть ошибка + УдалитьФайлы("C:\temp\Works"); // есть ошибка +КонецПроцедуры From 9211e34a38b519780a807ce0adf7a403c096c1e8 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 25 Jul 2023 19:58:41 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=B0=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B?= =?UTF-8?q?=20+=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit уточнил документацию --- docs/diagnostics/FileSystemAccess.md | 3 ++ .../FileSystemAccessDiagnostic.java | 30 ++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/docs/diagnostics/FileSystemAccess.md b/docs/diagnostics/FileSystemAccess.md index 36cbd40a1a5..ea10df0aa00 100644 --- a/docs/diagnostics/FileSystemAccess.md +++ b/docs/diagnostics/FileSystemAccess.md @@ -4,6 +4,9 @@ ## Описание диагностики При код-ревью или аудите кода необходимо проверять обращения к файлам, каталогам и набор действий, выполняемых с ними, для исключения передачи конфиденциальной или защищенной информации, а также для исключения деструктивных действий с файловой системой. +Важно проверять код от сторонних разработчиков, подрядчиков, из различных интернет-сервисов, каталогов и т.п. + +По найденным замечаниям рекомендуется выполнить ручной аудит кода на предмет его правильности и безопасности. ## Примеры diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java index 37d9418e87a..ac54c36a4e9 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -53,13 +53,34 @@ public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { "ЗначениеВФайл|ValueToFile|КопироватьФайл|FileCopy|ОбъединитьФайлы|MergeFiles|ПереместитьФайл|MoveFile" + "|РазделитьФайл|SplitFile|СоздатьКаталог|CreateDirectory|УдалитьФайлы|DeleteFiles" + "|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir|КаталогДокументов|DocumentsDir" + - "|РабочийКаталогДанныхПользователя|UserDataWorkDir"); - // TODO добавить глобальные асинхронные методы работы с файлами + "|РабочийКаталогДанныхПользователя|UserDataWorkDir" + + "|НачатьПодключениеРасширенияРаботыСФайлами|BeginAttachingFileSystemExtension" + + "|НачатьУстановкуРасширенияРаботыСФайлами|BeginInstallFileSystemExtension" + + "|УстановитьРасширениеРаботыСФайлами|InstallFileSystemExtension" + + "|УстановитьРасширениеРаботыСФайламиАсинх|InstallFileSystemExtensionAsync" + + "|ПодключитьРасширениеРаботыСФайламиАсинх|AttachFileSystemExtensionAsync|" + + "КаталогВременныхФайловАсинх|TempFilesDirAsync|КаталогДокументовАсинх|DocumentsDirAsync" + + "|НачатьПолучениеКаталогаВременныхФайлов|BeginGettingTempFilesDir" + + "|НачатьПолучениеКаталогаДокументов|BeginGettingDocumentsDir" + + "|НачатьПолучениеРабочегоКаталогаДанныхПользователя|BeginGettingUserDataWorkDir" + + "|РабочийКаталогДанныхПользователяАсинх|UserDataWorkDirAsync" + + "|КопироватьФайлАсинх|CopyFileAsync|НайтиФайлыАсинх|FindFilesAsync|НачатьКопированиеФайла|BeginCopyingFile" + + "|НачатьПеремещениеФайла|BeginMovingFile|НачатьПоискФайлов|BeginFindingFiles" + + "|НачатьСозданиеДвоичныхДанныхИзФайла|BeginCreateBinaryDataFromFile" + + "|НачатьСозданиеКаталога|BeginCreatingDirectory" + + "|НачатьУдалениеФайлов|BeginDeletingFiles|ПереместитьФайлАсинх|MoveFileAsync" + + "|СоздатьДвоичныеДанныеИзФайлаАсинх|CreateBinaryDataFromFileAsync|СоздатьКаталогАсинх|CreateDirectoryAsync" + + "|УдалитьФайлыАсинх|DeleteFilesAsync"); public FileSystemAccessDiagnostic() { super(GLOBAL_METHODS); } + @Override + protected boolean checkMethodCall(BSLParser.MethodCallContext ctx) { + return false; + } + @Override public ParseTree visitNewExpression(BSLParser.NewExpressionContext ctx) { Constructors.typeName(ctx).ifPresent((String typeName) -> { @@ -70,9 +91,4 @@ public ParseTree visitNewExpression(BSLParser.NewExpressionContext ctx) { }); return super.visitNewExpression(ctx); } - - @Override - protected boolean checkMethodCall(BSLParser.MethodCallContext ctx) { - return false; - } } From 8b3fb0842e066748aab4e80dbb59dc514b35e91c Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 26 Jul 2023 10:18:40 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D1=8B=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit globalMethods=Шаблон глобальных методов (регулярное выражение) newExpression=Шаблон классов (регулярное выражение) --- .../FileSystemAccessDiagnostic.java | 83 ++++++++++++------- .../FileSystemAccessDiagnostic_en.properties | 2 + .../FileSystemAccessDiagnostic_ru.properties | 2 + .../FileSystemAccessDiagnosticTest.java | 17 ++++ 4 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java index ac54c36a4e9..b870ce2f553 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -22,6 +22,7 @@ package com.github._1c_syntax.bsl.languageserver.diagnostics; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; @@ -31,6 +32,7 @@ import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.tree.ParseTree; +import java.util.Map; import java.util.regex.Pattern; @DiagnosticMetadata( @@ -43,37 +45,60 @@ scope = DiagnosticScope.BSL ) public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { - private static final Pattern NEW_EXPRESSION = CaseInsensitivePattern.compile( - "File|Файл|xBase|HTMLWriter|ЗаписьHTML|HTMLReader|ЧтениеHTML|FastInfosetReader|ЧтениеFastInfoset" + - "|FastInfosetWriter|ЗаписьFastInfoset|XSLTransform|ПреобразованиеXSL" + - "|ZipFileWriter|ЗаписьZipФайла|ZipFileReader|ЧтениеZipФайла|TextReader|ЧтениеТекста|TextWriter|ЗаписьТекста" + - "|TextExtraction|ИзвлечениеТекста|BinaryData|ДвоичныеДанные|FileStream|ФайловыйПоток"); + public static final String NEW_EXPRESSION = "File|Файл|xBase|HTMLWriter|ЗаписьHTML|HTMLReader|ЧтениеHTML" + + "|FastInfosetReader|ЧтениеFastInfoset|FastInfosetWriter|ЗаписьFastInfoset|XSLTransform|ПреобразованиеXSL" + + "|ZipFileWriter|ЗаписьZipФайла|ZipFileReader|ЧтениеZipФайла|TextReader|ЧтениеТекста|TextWriter|ЗаписьТекста" + + "|TextExtraction|ИзвлечениеТекста|BinaryData|ДвоичныеДанные|FileStream|ФайловыйПоток"; - private static final Pattern GLOBAL_METHODS = CaseInsensitivePattern.compile( - "ЗначениеВФайл|ValueToFile|КопироватьФайл|FileCopy|ОбъединитьФайлы|MergeFiles|ПереместитьФайл|MoveFile" + - "|РазделитьФайл|SplitFile|СоздатьКаталог|CreateDirectory|УдалитьФайлы|DeleteFiles" + - "|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir|КаталогДокументов|DocumentsDir" + - "|РабочийКаталогДанныхПользователя|UserDataWorkDir" + - "|НачатьПодключениеРасширенияРаботыСФайлами|BeginAttachingFileSystemExtension" + - "|НачатьУстановкуРасширенияРаботыСФайлами|BeginInstallFileSystemExtension" + - "|УстановитьРасширениеРаботыСФайлами|InstallFileSystemExtension" + - "|УстановитьРасширениеРаботыСФайламиАсинх|InstallFileSystemExtensionAsync" + - "|ПодключитьРасширениеРаботыСФайламиАсинх|AttachFileSystemExtensionAsync|" + - "КаталогВременныхФайловАсинх|TempFilesDirAsync|КаталогДокументовАсинх|DocumentsDirAsync" + - "|НачатьПолучениеКаталогаВременныхФайлов|BeginGettingTempFilesDir" + - "|НачатьПолучениеКаталогаДокументов|BeginGettingDocumentsDir" + - "|НачатьПолучениеРабочегоКаталогаДанныхПользователя|BeginGettingUserDataWorkDir" + - "|РабочийКаталогДанныхПользователяАсинх|UserDataWorkDirAsync" + - "|КопироватьФайлАсинх|CopyFileAsync|НайтиФайлыАсинх|FindFilesAsync|НачатьКопированиеФайла|BeginCopyingFile" + - "|НачатьПеремещениеФайла|BeginMovingFile|НачатьПоискФайлов|BeginFindingFiles" + - "|НачатьСозданиеДвоичныхДанныхИзФайла|BeginCreateBinaryDataFromFile" + - "|НачатьСозданиеКаталога|BeginCreatingDirectory" + - "|НачатьУдалениеФайлов|BeginDeletingFiles|ПереместитьФайлАсинх|MoveFileAsync" + - "|СоздатьДвоичныеДанныеИзФайлаАсинх|CreateBinaryDataFromFileAsync|СоздатьКаталогАсинх|CreateDirectoryAsync" + - "|УдалитьФайлыАсинх|DeleteFilesAsync"); + public static final String GLOBAL_METHODS = "ЗначениеВФайл|ValueToFile|КопироватьФайл|FileCopy" + + "|ОбъединитьФайлы|MergeFiles|ПереместитьФайл|MoveFile|РазделитьФайл|SplitFile|СоздатьКаталог|CreateDirectory|" + + "УдалитьФайлы|DeleteFiles|КаталогПрограммы|BinDir|КаталогВременныхФайлов|TempFilesDir" + + "|КаталогДокументов|DocumentsDir|РабочийКаталогДанныхПользователя|UserDataWorkDir" + + "|НачатьПодключениеРасширенияРаботыСФайлами|BeginAttachingFileSystemExtension" + + "|НачатьУстановкуРасширенияРаботыСФайлами|BeginInstallFileSystemExtension" + + "|УстановитьРасширениеРаботыСФайлами|InstallFileSystemExtension" + + "|УстановитьРасширениеРаботыСФайламиАсинх|InstallFileSystemExtensionAsync" + + "|ПодключитьРасширениеРаботыСФайламиАсинх|AttachFileSystemExtensionAsync|" + + "КаталогВременныхФайловАсинх|TempFilesDirAsync|КаталогДокументовАсинх|DocumentsDirAsync" + + "|НачатьПолучениеКаталогаВременныхФайлов|BeginGettingTempFilesDir" + + "|НачатьПолучениеКаталогаДокументов|BeginGettingDocumentsDir" + + "|НачатьПолучениеРабочегоКаталогаДанныхПользователя|BeginGettingUserDataWorkDir" + + "|РабочийКаталогДанныхПользователяАсинх|UserDataWorkDirAsync" + + "|КопироватьФайлАсинх|CopyFileAsync|НайтиФайлыАсинх|FindFilesAsync|НачатьКопированиеФайла|BeginCopyingFile" + + "|НачатьПеремещениеФайла|BeginMovingFile|НачатьПоискФайлов|BeginFindingFiles" + + "|НачатьСозданиеДвоичныхДанныхИзФайла|BeginCreateBinaryDataFromFile" + + "|НачатьСозданиеКаталога|BeginCreatingDirectory" + + "|НачатьУдалениеФайлов|BeginDeletingFiles|ПереместитьФайлАсинх|MoveFileAsync" + + "|СоздатьДвоичныеДанныеИзФайлаАсинх|CreateBinaryDataFromFileAsync|СоздатьКаталогАсинх|CreateDirectoryAsync" + + "|УдалитьФайлыАсинх|DeleteFilesAsync"; + private static final Pattern GLOBAL_METHODS_PATTERN = getPattern(GLOBAL_METHODS); + + @DiagnosticParameter( + type = String.class, + defaultValue = "" + GLOBAL_METHODS + ) + private String globalMethods = GLOBAL_METHODS; + + @DiagnosticParameter( + type = String.class, + defaultValue = NEW_EXPRESSION + ) + private String newExpression = NEW_EXPRESSION; + private Pattern newExpressionPattern = getPattern(newExpression); public FileSystemAccessDiagnostic() { - super(GLOBAL_METHODS); + super(GLOBAL_METHODS_PATTERN); + } + + private static Pattern getPattern(String newExpression) { + return CaseInsensitivePattern.compile(newExpression); + } + + @Override + public void configure(Map configuration) { + super.configure(configuration); + setMethodPattern(getPattern(globalMethods)); + newExpressionPattern = getPattern(newExpression); } @Override @@ -84,7 +109,7 @@ protected boolean checkMethodCall(BSLParser.MethodCallContext ctx) { @Override public ParseTree visitNewExpression(BSLParser.NewExpressionContext ctx) { Constructors.typeName(ctx).ifPresent((String typeName) -> { - var matcherTypeName = NEW_EXPRESSION.matcher(typeName); + var matcherTypeName = newExpressionPattern.matcher(typeName); if (matcherTypeName.matches()) { diagnosticStorage.addDiagnostic(ctx); } diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties index e8de30d28c1..b1dba726614 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties @@ -1,2 +1,4 @@ diagnosticMessage=Check access to the file system diagnosticName=FileSystemAccess +globalMethods=Global methods pattern (regex) +newExpression=Class names pattern (regex) \ No newline at end of file diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties index 3db2addccfd..02846b96439 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties @@ -1,2 +1,4 @@ diagnosticMessage=Проверьте обращение к файловой системе diagnosticName=Доступ к файловой системе +globalMethods=Шаблон глобальных методов (регулярное выражение) +newExpression=Шаблон классов (регулярное выражение) \ No newline at end of file diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java index 04528445d2a..e12905ee47f 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnosticTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test; import java.util.List; +import java.util.Map; import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; @@ -65,6 +66,22 @@ void test() { .hasRange(39, 4, 16) .hasSize(23) ; + } + + @Test + void testConfigure() { + + Map configuration = diagnosticInstance.info.getDefaultConfiguration(); + configuration.put("globalMethods", "ЗначениеВФайл"); + configuration.put("newExpression", "File"); + diagnosticInstance.configure(configuration); + + List diagnostics = getDiagnostics(); + assertThat(diagnostics, true) + .hasRange(1, 15, 35) + .hasRange(29, 4, 17) + .hasSize(2); } + } From f04964fae08152f92d0f3e12dd61d2f7d2064bb4 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 26 Jul 2023 12:21:57 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D0=BC=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D0=B8=20=D1=81=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=BA=D0=B0=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/diagnostics/FileSystemAccess.md | 1 + .../languageserver/diagnostics/FileSystemAccessDiagnostic.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/diagnostics/FileSystemAccess.md b/docs/diagnostics/FileSystemAccess.md index ea10df0aa00..77eef23696f 100644 --- a/docs/diagnostics/FileSystemAccess.md +++ b/docs/diagnostics/FileSystemAccess.md @@ -36,3 +36,4 @@ * Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) --> * [Стандарт Доступ к файловой системе из кода конфигурации](https://its.1c.ru/db/v8std#content:542:hdoc) * [Стандарт Безопасность запуска приложений](https://its.1c.ru/db/v8std#content:774:hdoc) +* [Безопасный режим работы - руководство разработчика](https://its.1c.ru/db/v8323doc#bookmark:dev:TI000000186) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java index b870ce2f553..2bc10ba1bd1 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -48,7 +48,8 @@ public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { public static final String NEW_EXPRESSION = "File|Файл|xBase|HTMLWriter|ЗаписьHTML|HTMLReader|ЧтениеHTML" + "|FastInfosetReader|ЧтениеFastInfoset|FastInfosetWriter|ЗаписьFastInfoset|XSLTransform|ПреобразованиеXSL" + "|ZipFileWriter|ЗаписьZipФайла|ZipFileReader|ЧтениеZipФайла|TextReader|ЧтениеТекста|TextWriter|ЗаписьТекста" + - "|TextExtraction|ИзвлечениеТекста|BinaryData|ДвоичныеДанные|FileStream|ФайловыйПоток"; + "|TextExtraction|ИзвлечениеТекста|BinaryData|ДвоичныеДанные|FileStream|ФайловыйПоток" + + "|FileStreamsManager|МенеджерФайловыхПотоков|DataWriter|ЗаписьДанных|DataReader|ЧтениеДанных"; public static final String GLOBAL_METHODS = "ЗначениеВФайл|ValueToFile|КопироватьФайл|FileCopy" + "|ОбъединитьФайлы|MergeFiles|ПереместитьФайл|MoveFile|РазделитьФайл|SplitFile|СоздатьКаталог|CreateDirectory|" + From c9d7527137bee4c325198c918051b89c8caa03d1 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Wed, 13 Sep 2023 15:23:48 +0000 Subject: [PATCH 5/6] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/diagnostics/FileSystemAccess.md | 20 +++++++++---------- .../FileSystemAccessDiagnostic.java | 2 +- .../FileSystemAccessDiagnostic_en.properties | 2 +- .../FileSystemAccessDiagnostic_ru.properties | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/diagnostics/FileSystemAccess.md b/docs/diagnostics/FileSystemAccess.md index 77eef23696f..ea11adf570b 100644 --- a/docs/diagnostics/FileSystemAccess.md +++ b/docs/diagnostics/FileSystemAccess.md @@ -11,20 +11,20 @@ ## Примеры ```bsl - Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI); // есть замечание - Текст = Новый ЗаписьТекста("d:\win.txt", КодировкаТекста.ANSI); // есть замечание + Текст = Новый ЧтениеТекста(ПутьФайла, КодировкаТекста.ANSI); // есть замечание + Текст = Новый ЗаписьТекста(ПутьФайла, КодировкаТекста.ANSI); // есть замечание - ЗначениеВФайл("C:\Temp\PersonalData.txt", ЛичныеДанные); // есть замечание - КопироватьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть замечание + ЗначениеВФайл(ПутьФайла, ЛичныеДанные); // есть замечание + КопироватьФайл(ПутьФайла, ДругойПутьФайла); // есть замечание МассивИмен = Новый Массив(); - МассивИмен.Добавить("C:\Windows\Temp\Presentation.ppt.1"); - ОбъединитьФайлы(МассивИмен, "C:\Windows\Temp\Presentation.ppt"); // есть замечание + МассивИмен.Добавить(ПутьФайла); + ОбъединитьФайлы(МассивИмен, ДругойПутьФайла); // есть замечание - ПереместитьФайл("C:\Temp\Order.htm", "C:\My Documents\Order.htm"); // есть замечание - РазделитьФайл("C:\Windows\Temp\Presentation.ppt", 1024 * 1024 ); // есть замечание - СоздатьКаталог("C:\Temp"); // есть замечание - УдалитьФайлы("C:\temp\Works"); // есть замечание + ПереместитьФайл(ПутьФайла, ДругойПутьФайла); // есть замечание + РазделитьФайл(ПутьФайла, 1024 * 1024 ); // есть замечание + СоздатьКаталог(ИмяКаталога); // есть замечание + УдалитьФайлы(ПутьФайла); // есть замечание ``` ## Источники diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java index 2bc10ba1bd1..130631aa836 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -37,7 +37,7 @@ @DiagnosticMetadata( type = DiagnosticType.VULNERABILITY, - severity = DiagnosticSeverity.MINOR, + severity = DiagnosticSeverity.MAJOR, minutesToFix = 3, tags = { DiagnosticTag.SUSPICIOUS diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties index b1dba726614..ef44edd4783 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_en.properties @@ -1,4 +1,4 @@ diagnosticMessage=Check access to the file system diagnosticName=FileSystemAccess globalMethods=Global methods pattern (regex) -newExpression=Class names pattern (regex) \ No newline at end of file +newExpression=Class names pattern (regex) diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties index 02846b96439..73648370051 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic_ru.properties @@ -1,4 +1,4 @@ diagnosticMessage=Проверьте обращение к файловой системе diagnosticName=Доступ к файловой системе globalMethods=Шаблон глобальных методов (регулярное выражение) -newExpression=Шаблон классов (регулярное выражение) \ No newline at end of file +newExpression=Шаблон классов (регулярное выражение) From be17b0322b27e5514bf952da5d06eac520900bd5 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 14 Oct 2023 12:30:19 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/FileSystemAccessDiagnostic.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java index 130631aa836..8dca05a200f 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FileSystemAccessDiagnostic.java @@ -42,7 +42,8 @@ tags = { DiagnosticTag.SUSPICIOUS }, - scope = DiagnosticScope.BSL + scope = DiagnosticScope.BSL, + activatedByDefault = false ) public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { public static final String NEW_EXPRESSION = "File|Файл|xBase|HTMLWriter|ЗаписьHTML|HTMLReader|ЧтениеHTML" + @@ -76,7 +77,7 @@ public class FileSystemAccessDiagnostic extends AbstractFindMethodDiagnostic { @DiagnosticParameter( type = String.class, - defaultValue = "" + GLOBAL_METHODS + defaultValue = GLOBAL_METHODS ) private String globalMethods = GLOBAL_METHODS;