asp+sql 如何有效的防止sql注入
展开全部
SQL注入,一般由 request 提交而来,所以过滤 request参数即可。
比如,正常获取 id 为 request("id") ,获取后,对其进行强制转为int型,如
id = cint(request.querystring("id"))
同理,凡是数字型的,一律进行判断是否数字或强制转换。
如果是字符型的,要写入SQL语句的,一律对单引号进行转义,如
SQLserver和Access中,替换成两个单引号。MYSQL中替换成 \' 等。
可以写成一个固定的函数来代替request,可以达到防止注入的目的。
网上也有一些通用的过滤程序,可以解决大部分问题,但更多的时候,也并不能防止注入的发生,同时,也会给正常提交带来一些麻烦。
比如,正常获取 id 为 request("id") ,获取后,对其进行强制转为int型,如
id = cint(request.querystring("id"))
同理,凡是数字型的,一律进行判断是否数字或强制转换。
如果是字符型的,要写入SQL语句的,一律对单引号进行转义,如
SQLserver和Access中,替换成两个单引号。MYSQL中替换成 \' 等。
可以写成一个固定的函数来代替request,可以达到防止注入的目的。
网上也有一些通用的过滤程序,可以解决大部分问题,但更多的时候,也并不能防止注入的发生,同时,也会给正常提交带来一些麻烦。
追问
您说那个写个固定函数代替 request 这个是要从开发站的时候写好对吧。
我现在站已经开发完了。之前的就是字段什么的都写的很简单。
如今也没有充分的时间重新开发。
只能添加一些限制。
昨天我百度了好久 说在conn里面加限制。我加上了 报错?!
追答
你想简单的话,就使用那种通用防注入程序,根据提示加在conn.asp里面就可以,网上很多的,一搜一大堆。
展开全部
首先过滤关键字
///
/// </summary>
/// <param name="text">用户输入的文字</param>
/// <param name="maxlength">最大的长度</param>
/// <returns>返回验证后的文字</returns>
public static string InputText(string text, int maxlength)
{
text = text.ToLower().Trim();
if (string.IsNullOrEmpty(text))
return string.Empty;
if (text.Length > maxlength)
text = text.Substring(0, maxlength);
text = Regex.Replace(text, "[\\s]{2,{", " ");
text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); //<br>
text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " "); //
text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags
text = Regex.Replace(text,"=", "");
text = Regex.Replace(text, "%", "");
text = Regex.Replace(text, "'", "");
text = Regex.Replace(text, "select", "");
text = Regex.Replace(text, "insert", "");
text = Regex.Replace(text, "delete", "");
text = Regex.Replace(text, "or", "");
text = Regex.Replace(text, "exec", "");
text = Regex.Replace(text, "--", "");
text = Regex.Replace(text, "and", "");
text = Regex.Replace(text, "where", "");
text = Regex.Replace(text, "update", "");
text = Regex.Replace(text, "script", "");
text = Regex.Replace(text, "iframe", "");
text = Regex.Replace(text, "master", "");
text = Regex.Replace(text, "exec", "");
text = Regex.Replace(text, "<", "");
text = Regex.Replace(text, ">", "");
text = Regex.Replace(text, "\r\n", "");
return text;
}
另外不要用SQL拼接字符穿,用SqlParameter传参数
例如: public static DataTable SearchAccessPlanByTaskId(string taskId)
{
try
{
string sql = "select * from C_VisitPlan where TaskID=@taskId";
SQLiteParameter[] sp = {
new SQLiteParameter("@taskId",taskId)
};
clsSqLiteInstance sqlinst = new clsSqLiteInstance("MainChanged.db");
return sqlinst.GetDataTable(sql, sp);
}
catch (Exception ex)
{
return null;
}
}
///
/// </summary>
/// <param name="text">用户输入的文字</param>
/// <param name="maxlength">最大的长度</param>
/// <returns>返回验证后的文字</returns>
public static string InputText(string text, int maxlength)
{
text = text.ToLower().Trim();
if (string.IsNullOrEmpty(text))
return string.Empty;
if (text.Length > maxlength)
text = text.Substring(0, maxlength);
text = Regex.Replace(text, "[\\s]{2,{", " ");
text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); //<br>
text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " "); //
text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty); //any other tags
text = Regex.Replace(text,"=", "");
text = Regex.Replace(text, "%", "");
text = Regex.Replace(text, "'", "");
text = Regex.Replace(text, "select", "");
text = Regex.Replace(text, "insert", "");
text = Regex.Replace(text, "delete", "");
text = Regex.Replace(text, "or", "");
text = Regex.Replace(text, "exec", "");
text = Regex.Replace(text, "--", "");
text = Regex.Replace(text, "and", "");
text = Regex.Replace(text, "where", "");
text = Regex.Replace(text, "update", "");
text = Regex.Replace(text, "script", "");
text = Regex.Replace(text, "iframe", "");
text = Regex.Replace(text, "master", "");
text = Regex.Replace(text, "exec", "");
text = Regex.Replace(text, "<", "");
text = Regex.Replace(text, ">", "");
text = Regex.Replace(text, "\r\n", "");
return text;
}
另外不要用SQL拼接字符穿,用SqlParameter传参数
例如: public static DataTable SearchAccessPlanByTaskId(string taskId)
{
try
{
string sql = "select * from C_VisitPlan where TaskID=@taskId";
SQLiteParameter[] sp = {
new SQLiteParameter("@taskId",taskId)
};
clsSqLiteInstance sqlinst = new clsSqLiteInstance("MainChanged.db");
return sqlinst.GetDataTable(sql, sp);
}
catch (Exception ex)
{
return null;
}
}
追问
老大你贴这代码 怎么用?
追答
给你看看 我写的,我前两天也被攻击了,改了就没事情了 //用户输入非空验证
if (Common.CommonFunctions.SafeRequest(this.txtUserName.Text.Trim()) == ""
|| Common.CommonFunctions.SafeRequest(this.txtPwd.Text.Trim()) == "")
{
MessageBox.Show("用户名和密码不允许为空!", "用户登录 ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
string userName = this.txtUserName.Text.Trim();
string userPwd = this.txtPwd.Text.Trim();
///
/// 过滤sql关键字
///
/// 请求参数
///
public static string SafeRequest(string requestParam)
{
string tmp = requestParam;
requestParam = requestParam.ToLower();
requestParam = requestParam.Replace("'", "");
requestParam = requestParam.Replace("1=1", "");
....参照上面写的
if (tmp.Length != requestParam.Length)
{
return requestParam;
}
return tmp;
}
另外改下你以前写的方法:
如果你是这么写的:
string sql = string.Format("Select TdId,Lines from T_News where NewsId = '{0}", newsid); clsSqLiteInstance instance = new clsSqLiteInstance("Main.db");
return instance.GetDataTable(sql);
就改成:
string sql = string.Format("Select TdId,Lines from T_News where NewsId = @NewsId );
SQLiteParameter[] sp = {
new SQLiteParameter("@NewsId ",NewsId )
};
clsSqLiteInstance instance = new clsSqLiteInstance("Main.db");
return instance.GetDataTable(sql,sp);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-06-01
展开全部
这属于网站程序安全,建议找专业做服务器安全和网站安全的来给你解决把。sinesafe不错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询