zoukankan      html  css  js  c++  java
  • TSql100Parser 检查sql injection

    TSql100Parser

    [Test]
            public void Test20211117_001()
            {
                var query = "<columns><column name=\"GiftID\" header=\"GiftID\" type=\"asc\"></column><column name=\"GiftName\" header=\"\" type=\"asc\"></column></columns>";
                //CheckSQLQuery(query, QueryScopeEnum.OrderBy);
    
                query = "test';WAITFOR DELAY '0:0:5'--";
                CheckSQLQuery(query,QueryScopeEnum.Where);
            }
    
            private void CheckSQLQuery(string query, QueryScopeEnum scope)
            {
                if (string.IsNullOrEmpty(query))
                {
                    return;
                }
    
                string completeQuery = GetCompleteQuery(query, scope);
                if (!string.IsNullOrEmpty(completeQuery))
                {
                    TSql100Parser tsqlParser = new TSql100Parser(true);
    
                    IList<ParseError> errors;
                    var fragments = tsqlParser.Parse(new StringReader(completeQuery), out errors);
    
                    var sqlScript = fragments as TSqlScript;
    
                    var valid = (errors.Count == 0)
                                && (sqlScript != null)
                                && (sqlScript.Batches.Count == 1)
                                && (sqlScript.Batches[0].Statements.Count == 1)
                                && (sqlScript.Batches[0].Statements[0] is SelectStatement);
                    if (!valid)
                    {
                        Console.WriteLine("invalid");
                    }
                }
            }
    
            private static string GetCompleteQuery(string query, QueryScopeEnum scope)
            {
                string completeQuery;
    
                switch (scope)
                {
                    case QueryScopeEnum.Columns:
                        completeQuery = $"SELECT {query} FROM [NOTEXISTINGTABLE]";
                        break;
    
                    case QueryScopeEnum.OrderBy:
                        completeQuery = $"SELECT * FROM [NOTEXISTINGTABLE] ORDER BY {query}";
                        break;
    
                    case QueryScopeEnum.Where:
                        completeQuery = $"SELECT * FROM [NOTEXISTINGTABLE] WHERE {query}";
                        break;
    
                    case QueryScopeEnum.Query:
                        completeQuery = query;
                        break;
    
                    default:
                        completeQuery = null;
                        break;
                }
    
                return completeQuery;
            }

    检查where语句  test';WAITFOR DELAY '0:0:5'--

    Expected but did not find a closing quotation mark after the character string '--.

    检查orderby语句<columns><column name=\"GiftID\" header=\"GiftID\" type=\"asc\"></column><column name=\"GiftName\" header=\"\" type=\"asc\"></column></columns>

    Incorrect syntax near <.

  • 相关阅读:
    mysql多表查询的方式有哪些?
    Linq无聊练习系列4--join练习
    Linq无聊练习系列3--聚合函数练习
    Linq无聊练习系列2--select/distinct练习
    Linq无聊练习系列1--where练习
    人力资源系统遇到的问题
    sqlserver游标概念与实例全面解说
    $.cookie的用法
    JavaScript系列----正则表达式
    ASP.NET中的URL编码解码
  • 原文地址:https://www.cnblogs.com/chucklu/p/15567826.html
Copyright © 2011-2022 走看看