在项目开发中,为了防止sql注入,会过来掉一些常见的sql关键字。如 or select - 等等这些字符。但是实际客户在录入数据的时候 会经常在词句里面有包含这样的关键字。如“年终总结-1” 这样的标题里面就出现了 “-”这样的非法关键字。 在比如 我的标题里面有 一个橙色的单词 “orange” 那么这个单词里面就包含了 or 关键字。用户保存数据后可能得到的结果就变成了“ange”,因为or被过滤掉。是否有什么好的方法。来处理这些问题。比如 “-”的时候就不过滤 当多个的时候“--”这样的时候才过滤。单词也一样。 如果是单词里面包含关键字的就不过滤。
除了参数化。现在就希望能够有一个比较好的过滤非法字符的算法。
代码是以前的代码。整个项目都没有使用参数或存储过程。至于 参数化 存储过程 ,这些大部分应该都知道。但是现在项目已经成型。如果全部改成参数化或者存储过程。可以想而知工作量是有多大。也不会有这么多的时间来做这个工作的。
参数化
防注入应该通过专业的防火墙来实现,你就不要在程序中做了。
修改你的数据库操作代码,能用 ORM 则用,如果不能用,则参数化 SQL 语句,禁止将客户断提交的 SQL 语句直接提交给数据库引擎去执行。
专业防火墙。能具体描述下吗?
@yzy: http://ldiiswall.com/
用存储过程
还是参数化比较好,参数过滤能过滤掉特殊字符,再把权限做好就欧了。
可以通过语法分析树来做这件事情,比较高级的事情。在执行之前,分析sql语法,把注入,改成非注入的sql,进行执行。
简单的判断一下参数呗
我觉得中文站的过滤不会有多大的问题,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或者编码都可以
or 1=1