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

  • 相关阅读:
    .NET System.Web.HttpContext.Current.Request报索引超出数组界限。
    Jq将字符串复制粘贴到剪贴板
    设置VS以管理员身份运行
    http遇到的那些坑,iis上传文件报413错误 asp.net MVC
    百度地图api使用,简单搜索+经纬度定位+自定义消息窗口
    常见的sql server 链接问题------持续更新
    解决电脑不能访问局域网共享,局域网共享中找不到。
    博文图片挂了临时解决办法
    博客声明
    06. redis cluster
  • 原文地址:https://www.cnblogs.com/chucklu/p/15567826.html
Copyright © 2020-2023  润新知