所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.下面给大家分享教你如何防止SQL注入攻击的,希望对大家有帮助。
防SQL 注入是一个系统工程,在项目开发中就要系统的考虑SQL 注入的问题。一般做到以下4点,能比较好的控制SQL 注入:
- 严格验证用户的一切输入,包括URL参数。
- 将用户登录名称、密码等数据加密保存
- 不要用拼接字符串的方式来生成SQL语句,而是用SQL Parameters 传参数或者用存储过程来查询
- 严格验证上传文件的后缀,exe、aspx、asp等可执行程序禁止上传。
这里介绍一个简单通用的方法,用来验证字符串中是否有敏感字符,参数可以是一个字符串,也可以是一个字符串集合,敏感字符可以在Lawlesses数组中定义:
- public static string[] Lawlesses = { "=", "'" };
- /// <summary>
- /// 敏感字符检测
- /// </summary>
- /// <param name="args"></param>
- /// <returns></returns>
- public static bool CheckParams(params object[] args)
- {
- if (Lawlesses == null || Lawlesses.Length <= 0) return true;
- //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*
- //另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;
- string str_Regex = ".*[";
- for (int i = 0; i < Lawlesses.Length - 1; i++)
- {
- str_Regex += Lawlesses[i] + "|";
- }
- str_Regex += Lawlesses[Lawlesses.Length - 1] + "].*";
- //
- foreach (object arg in args)
- {
- if (arg is string)//如果是字符串,直接检查
- {
- if (Regex.Matches(arg.ToString(), str_Regex).Count > 0)
- return false;
- }
- else if (arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
- {
- foreach (object obj in (ICollection)arg)
- {
- if (obj is string)
- {
- if (Regex.Matches(obj.ToString(), str_Regex).Count > 0)
- return false;
- }
- }
- }
- }
- return true;
- }