From 5999d0edd1c080351171eabebd8a7a556a89d0c9 Mon Sep 17 00:00:00 2001 From: zl-q Date: Mon, 30 Mar 2026 09:06:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20UI=20Schema=20?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E8=B7=AF=E5=BE=84=E9=81=8D=E5=8E=86=E6=BC=8F?= =?UTF-8?q?=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../navigation/ui_schema_navigation.dart | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/lib/core/ui_schema/navigation/ui_schema_navigation.dart b/apps/lib/core/ui_schema/navigation/ui_schema_navigation.dart index 42b8b8a..7281cf6 100644 --- a/apps/lib/core/ui_schema/navigation/ui_schema_navigation.dart +++ b/apps/lib/core/ui_schema/navigation/ui_schema_navigation.dart @@ -2,10 +2,20 @@ bool isValidInternalNavigationPath(String path) { if (path.isEmpty || !path.startsWith('/')) { return false; } + if (path.contains('%')) { + try { + if (Uri.decodeComponent(path) != path) { + return false; + } + } catch (_) { + return false; + } + } return !path.startsWith('//') && !path.contains('://') && !path.contains('?') && !path.contains('#') && + !path.contains('..') && !path.contains(':'); } @@ -20,7 +30,7 @@ String buildUiSchemaNavigationTarget({ for (final entry in params.entries) { final value = entry.value; if (value is String && value.isNotEmpty) { - queryParams[entry.key] = value; + queryParams[entry.key] = _sanitizeQueryValue(value); } else if (value is num || value is bool) { queryParams[entry.key] = value.toString(); } @@ -33,3 +43,7 @@ String buildUiSchemaNavigationTarget({ ); return targetUri.toString(); } + +String _sanitizeQueryValue(String value) { + return value.replaceAll('\n', ' ').replaceAll('\r', '').trim(); +}