diff --git a/Data_Coupler/Pages/DataCoupler.razor.cs b/Data_Coupler/Pages/DataCoupler.razor.cs index a94d274..d6fcfa9 100644 --- a/Data_Coupler/Pages/DataCoupler.razor.cs +++ b/Data_Coupler/Pages/DataCoupler.razor.cs @@ -2894,25 +2894,42 @@ public partial class DataCoupler : ComponentBase if (!trimmedQuery.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase)) return false; - // Lista di parole chiave vietate per sicurezza - var forbiddenKeywords = new[] + // Parole chiave complete: devono essere token SQL isolati (\bKEYWORD\b) + // Evita falsi positivi su nomi di colonne come UpdateDate, CreateDate, DeletedAt, ecc. + var forbiddenFullKeywords = new[] { "INSERT", "UPDATE", "DELETE", "DROP", "CREATE", "ALTER", "TRUNCATE", - "EXEC", "EXECUTE", "sp_", "xp_", "BULK", "OPENROWSET", "OPENDATASOURCE" + "EXEC", "EXECUTE", "BULK", "OPENROWSET", "OPENDATASOURCE" }; + // Prefissi pericolosi: devono iniziare la parola (sp_anything, xp_anything) + // Non si usa \bprefix\b perché _ è un word-char e mancherebbe sp_executesql, xp_cmdshell, ecc. + var forbiddenPrefixes = new[] { "SP_", "XP_" }; + var upperQuery = trimmedQuery.ToUpperInvariant(); - // Verifica che non contenga parole chiave vietate - foreach (var keyword in forbiddenKeywords) + // Verifica parole chiave complete con word boundary + foreach (var keyword in forbiddenFullKeywords) { - if (upperQuery.Contains(keyword)) + var pattern = $@"\b{System.Text.RegularExpressions.Regex.Escape(keyword)}\b"; + if (System.Text.RegularExpressions.Regex.IsMatch(upperQuery, pattern)) { Logger.LogWarning("Query rifiutata: contiene parola chiave vietata '{Keyword}'", keyword); return false; } } + // Verifica prefissi stored procedure: \bSP_ cattura sp_anything, xp_anything + foreach (var prefix in forbiddenPrefixes) + { + var pattern = $@"\b{System.Text.RegularExpressions.Regex.Escape(prefix)}"; + if (System.Text.RegularExpressions.Regex.IsMatch(upperQuery, pattern)) + { + Logger.LogWarning("Query rifiutata: contiene prefisso stored procedure vietato '{Prefix}'", prefix); + return false; + } + } + return true; }