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 <.

  • 相关阅读:
    Spring Cloud
    如何修改容器时间而不改变宿主机时间?
    消息中间件 RabbitMQ 入门篇
    CentOS7下NFS服务安装及配置固定端口
    查看ssh有没有被黑的IP
    JVM常用命令和性能调优建议
    nfs高可用
    kafka集群部署以及单机部署
    OSGI企业应用开发(十三)OSGI Web应用开发(二)
    OSGI企业应用开发(十二)OSGI Web应用开发(一)
  • 原文地址:https://www.cnblogs.com/chucklu/p/15567826.html
Copyright © 2011-2022 走看看