using MarketAlly.AIPlugin;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace MarketAlly.AIPlugin.Security.Plugins
{
///
/// Analyzes input validation patterns and suggests security improvements
///
[AIPlugin("InputValidation", "Analyzes input validation patterns and suggests security improvements")]
public class InputValidationPlugin : IAIPlugin
{
[AIParameter("Full path to the file to analyze", required: true)]
public string FilePath { get; set; }
[AIParameter("Check for SQL injection protection", required: false)]
public bool CheckSqlInjection { get; set; } = true;
[AIParameter("Check for XSS protection", required: false)]
public bool CheckXssProtection { get; set; } = true;
[AIParameter("Check for CSRF protection", required: false)]
public bool CheckCsrfProtection { get; set; } = true;
[AIParameter("Analyze sanitization patterns", required: false)]
public bool AnalyzeSanitization { get; set; } = true;
[AIParameter("Generate validation suggestions", required: false)]
public bool GenerateSuggestions { get; set; } = true;
public IReadOnlyDictionary SupportedParameters => new Dictionary
{
["filePath"] = typeof(string),
["checkSqlInjection"] = typeof(bool),
["checkXssProtection"] = typeof(bool),
["checkCsrfProtection"] = typeof(bool),
["analyzeSanitization"] = typeof(bool),
["generateSuggestions"] = typeof(bool)
};
// Input validation patterns
private static readonly Dictionary ValidationPatterns = new()
{
// SQL Injection Vulnerabilities
["sql_raw_query"] = (new Regex(@"(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)\s+.*\+.*['""]", RegexOptions.IgnoreCase),
"SQLInjection", "High", "Raw SQL query with string concatenation"),
["sql_format_string"] = (new Regex(@"String\.Format\s*\(\s*['""].*?(SELECT|INSERT|UPDATE|DELETE)", RegexOptions.IgnoreCase),
"SQLInjection", "High", "SQL query using String.Format"),
["sql_interpolation"] = (new Regex(@"\$['""].*?(SELECT|INSERT|UPDATE|DELETE).*?\{.*?\}", RegexOptions.IgnoreCase),
"SQLInjection", "Medium", "SQL query using string interpolation"),
["entity_raw_sql"] = (new Regex(@"(FromSqlRaw|ExecuteSqlRaw|Database\.ExecuteSqlCommand)\s*\(.*\+", RegexOptions.IgnoreCase),
"SQLInjection", "High", "Entity Framework raw SQL with concatenation"),
// XSS Vulnerabilities
["innerHTML_assignment"] = (new Regex(@"\.innerHTML\s*=.*['""].*\+", RegexOptions.IgnoreCase),
"XSS", "High", "Direct innerHTML assignment with concatenation"),
["document_write"] = (new Regex(@"document\.write\s*\(.*\+", RegexOptions.IgnoreCase),
"XSS", "High", "Document.write with user input"),
["eval_usage"] = (new Regex(@"eval\s*\(.*['""].*\+", RegexOptions.IgnoreCase),
"XSS", "Critical", "eval() function with user input"),
["html_raw"] = (new Regex(@"Html\.Raw\s*\(.*[^\)]", RegexOptions.IgnoreCase),
"XSS", "Medium", "Html.Raw without proper encoding"),
["response_write"] = (new Regex(@"Response\.Write\s*\(.*[^\)]", RegexOptions.IgnoreCase),
"XSS", "Medium", "Response.Write without encoding"),
// Missing Input Validation
["missing_validation"] = (new Regex(@"(Request\.|HttpContext\.Request\.|req\.|params\.|query\.).*(?!\s*(IsValid|Validate|Check|Sanitize))", RegexOptions.IgnoreCase),
"Validation", "Medium", "Request parameter without validation"),
["direct_model_binding"] = (new Regex(@"public\s+\w+\s+\w+\s*\([^)]*\bModel\b[^)]*\)(?!.*\[ValidateAntiForgeryToken\])", RegexOptions.IgnoreCase),
"Validation", "Medium", "Model binding without validation attributes"),
// CSRF Protection
["missing_antiforgery"] = (new Regex(@"(HttpPost|POST).*public.*(?!\[ValidateAntiForgeryToken\])", RegexOptions.IgnoreCase | RegexOptions.Singleline),
"CSRF", "High", "POST action without anti-forgery token"),
["form_without_token"] = (new Regex(@"