首页 新闻 会员 周边

.net如何较好的过滤sql关键字。

0
[待解决问题]

在项目开发中,为了防止sql注入,会过来掉一些常见的sql关键字。如 or select - 等等这些字符。但是实际客户在录入数据的时候 会经常在词句里面有包含这样的关键字。如“年终总结-1” 这样的标题里面就出现了 “-”这样的非法关键字。 在比如 我的标题里面有 一个橙色的单词 “orange” 那么这个单词里面就包含了 or 关键字。用户保存数据后可能得到的结果就变成了“ange”,因为or被过滤掉。是否有什么好的方法。来处理这些问题。比如 “-”的时候就不过滤 当多个的时候“--”这样的时候才过滤。单词也一样。 如果是单词里面包含关键字的就不过滤。

问题补充:

除了参数化。现在就希望能够有一个比较好的过滤非法字符的算法。

代码是以前的代码。整个项目都没有使用参数或存储过程。至于 参数化 存储过程 ,这些大部分应该都知道。但是现在项目已经成型。如果全部改成参数化或者存储过程。可以想而知工作量是有多大。也不会有这么多的时间来做这个工作的。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2014-07-22 11:03
< >
分享
所有回答(8)
0

参数化

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-07-22 11:09
0

防注入应该通过专业的防火墙来实现,你就不要在程序中做了。

修改你的数据库操作代码,能用 ORM 则用,如果不能用,则参数化 SQL 语句,禁止将客户断提交的 SQL 语句直接提交给数据库引擎去执行。

Launcher | 园豆:45045 (高人七级) | 2014-07-22 11:09

专业防火墙。能具体描述下吗?

支持(0) 反对(0) yzy | 园豆:317 (菜鸟二级) | 2014-07-22 11:12
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-22 11:15
0

用存储过程

男人要爽 | 园豆:6 (初学一级) | 2014-07-22 11:14
0

还是参数化比较好,参数过滤能过滤掉特殊字符,再把权限做好就欧了。

jerry-Tom | 园豆:4077 (老鸟四级) | 2014-07-22 11:15
0

可以通过语法分析树来做这件事情,比较高级的事情。在执行之前,分析sql语法,把注入,改成非注入的sql,进行执行。

forhells | 园豆:724 (小虾三级) | 2014-07-22 17:49
0

简单的判断一下参数呗

李天赐 | 园豆:204 (菜鸟二级) | 2014-07-28 15:59
0

我觉得中文站的过滤不会有多大的问题,1,url过滤

 /// <summary>
        /// 获得指定Url参数的值
        /// </summary> 
        /// <param name="strName">Url参数</param>
        /// <param name="sqlSafeCheck">是否进行SQL安全检查</param>
        /// <returns>Url参数的值</returns>
        public static string GetQueryString(string strName, bool sqlSafeCheck)
        {
            if (HttpContext.Current.Request.QueryString[strName] == null)
                return "";

            if (sqlSafeCheck && !Utils.IsSafeSqlString(HttpContext.Current.Request.QueryString[strName]))
                return "unsafe string";

            return HttpContext.Current.Request.QueryString[strName];
        }

 

 /// <summary>
        /// 检测是否有Sql危险字符
        /// </summary>
        /// <param name="str">要判断字符串</param>
        /// <returns>判断结果</returns>
        public static bool IsSafeSqlString(string str)
        {
            return !Regex.IsMatch(str, @"[-|;|,|\/|\(|\)|\[|\]|\}|\{|%|@|\*|!|\']");
        }

        /// <summary>
        /// 检测是否有危险的可能用于链接的字符串
        /// </summary>
        /// <param name="str">要判断字符串</param>
        /// <returns>判断结果</returns>
        public static bool IsSafeUserInfoString(string str)
        {
            return !Regex.IsMatch(str, @"^\s*$|^c:\\con\\con$|[%,\*" + "\"" + @"\s\t\<\>\&]|^Guest");
        }
/// <summary>
        /// 改正sql语句中的转义字符
        /// </summary>
        public static string mashSQL(string str)
        {
            return (str == null) ? "" : str.Replace("\'", "'");
        }

        /// <summary>
        /// 替换sql语句中的有问题符号
        /// </summary>
        public static string ChkSQL(string str)
        {
            return (str == null) ? "" : str.Replace("'", "''");
        }

还有form,post 富文本编辑采用htmlEncode或者编码都可以

amityat | 园豆:476 (菜鸟二级) | 2014-10-10 14:29
0

or 1=1 

月落我未生 | 园豆:204 (菜鸟二级) | 2017-01-14 16:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册