ASP.Net 开发出来的web项目,怎样防止黑客的攻击?
软件做完了,偶尔性的发现系统上存在sql注入的漏洞,请问采用什么办法补救啊,有没有什么好的方法?请大家赐教了。。。。如:我在一个界面点击查询的时候:
正确的:select * from table1 where strWhere="'+xx+"'" (sql拼接的)xx为 输入框的内容
注入后的sql:select * from table1 where strWhere="'+xx+"'" ,如果客户端输入框中输入:
';drop table table1--'
编译后:select * from table1 where strWhere='';drop table table1--'
黑客一旦知道表结构,那么这个数据表就ko了(死翘翘),大家有什么好的方法杜绝啊,新手不懂,那些js过滤什么的就别提了,有几百张form,我不可能一个控件一个控件的去判断,有没有什么高招?不知道使用存储过程能不能杜绝?还有就是我的sql是拼接的,危险性极高。。。请有经验者求救啊。。。。。解决后另外再加分。。。 web网站怎样防止黑客攻击 web网站怎样开发才安全 --------------------编程问答-------------------- 既然知道有SQL注入,那还用什么拼接啊。早在1998-2000年的时候,由于网络刚开始发展,因此SQL注入的问题还不明显,这之后被大量爆出后,早淘汰了拼接SQL的方法。所以有时候也很不懂,为什么在这里还是经常能看见有人拼接SQL。
select * from a where b=@b
@b就是一个变量,然后对该变量赋值,就避免了SQL注入,自己看看ADO.NET吧,很简单的玩意儿。 --------------------编程问答-------------------- 用ef或Linq吧。原生防注入 --------------------编程问答--------------------
没考虑那么多,对了我还遗漏了一种就是url参数的注入,这个比较的关键,这个采用什么方法才好呀? --------------------编程问答--------------------
ef、Linq没接过手。 --------------------编程问答--------------------
参数化就行。
例如
string str = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
string strSql ="insert into MemberUser_Info(MemberGuid,MemberName,MemberPwd)values(@strGuid,@strName,@strPwd)";
SqlCommand comm = new SqlCommand(strSql,conn);
comm.Parameters.Add(new SqlParameter("@strGuid", strGuid));
comm.Parameters.Add(new SqlParameter("@strName",strName));
comm.Parameters.Add(new SqlParameter("@strName",strPwd));
return comm.ExecuteNonQuery();
}
--------------------编程问答-------------------- 把数据表名和数据库 的名字改的复杂一些,加写数字进去 --------------------编程问答--------------------
如果我要实现多条件查询,该怎样写这个参数化查询啊。。。。
比如: if(a!=""){}if(b!="")
..............
.............
怎样参数化参数 --------------------编程问答-------------------- LZ啊,你还是踏实点,好好学学最简单的教程吧,这些东西随便哪本教程里都有的。5楼的所谓的参数,就是一楼的@b --------------------编程问答-------------------- 参数化。 存储过程。 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- @传值法,或者linq 或者orm 都可以 至少sql注入可以防止掉了 --------------------编程问答-------------------- 把sql语句操作写成存储过程是可以防止的 --------------------编程问答-------------------- 如果黑客不破服务器,B\S结构除了SQL注入还有别的办法不? --------------------编程问答-------------------- 存储过程。。。 --------------------编程问答-------------------- 个人感觉过滤了'-就无大事了,所谓的参数化存储过程很多是写好后在存储过程里exec(@sql)这样数据化还是没作用了 --------------------编程问答-------------------- 有几百张form,我不可能一个控件一个控件的去判断
看来你的站也不小了。
得了,楼主,你就多管齐下,
参数化必须、过滤必须、另外在服务器安装一些防护软件也能达到阻止注入的作用!
--------------------编程问答-------------------- 使用sql过虑,同时赋值时使用参数。 --------------------编程问答-------------------- 参数化,过滤
过滤的时候比如 delete,还要过滤这个关键字被被编码后的格式
有的注入不是单纯的写这些关键字,都被编码了。 --------------------编程问答-------------------- 1、所有文本的地方用下面方法过滤吧。
2、SQL语句重新写,都用传参。
#region 过滤 Sql 语句字符串中的注入脚本
/// <summary>
/// 过滤 Sql 语句字符串中的注入脚本
/// </summary>
/// <param name="source">传入的字符串</param>
/// <returns>过滤后的字符串</returns>
public static string SqlFilter(string source)
{
//单引号替换成两个单引号
source = source.Replace("'", "''");
//半角封号替换为全角封号,防止多语句执行
source = source.Replace(";", ";");
//半角括号替换为全角括号
source = source.Replace("(", "(");
source = source.Replace(")", ")");
///////////////要用正则表达式替换,防止字母大小写得情况////////////////////
//去除执行存储过程的命令关键字
source = source.Replace("Exec", "");
source = source.Replace("Execute", "");
//去除系统存储过程或扩展存储过程关键字
source = source.Replace("xp_", "x p_");
source = source.Replace("sp_", "s p_");
//防止16进制注入
source = source.Replace("0x", "0 x");
return source;
}
#endregion --------------------编程问答-------------------- 改成传参,用OleDbParameter[]或SqlParameter[] --------------------编程问答--------------------
我想问下,如果客户端的黑客依旧输入“drop table table1”这样的,那么转为参数@q的值,cmd命令是 select.... where q=@q ,q的值不依旧是drop table table1么?为何这样可以防SQL注入呢?原理是啥? --------------------编程问答--------------------
只能告诉楼主 参数化后 在微软的框架中能自动过滤注入信息,原理的话相信楼主也不会深究。 --------------------编程问答-------------------- 过滤个毛 直接静态化不就完了么 完全没这问题了。伪静态,静态 都成 --------------------编程问答-------------------- 参数化 --------------------编程问答-------------------- ef或linq,要不就伪静态。 --------------------编程问答-------------------- 避免拼接字符串,用参数形式。 --------------------编程问答-------------------- 1.sqlparameter
string sql = "insert into Table_doctor values(@doc_title,@doc_zhiwei,@doc_content,@createtime)";
SqlParameter[] par = new SqlParameter[] {
new SqlParameter("@doc_title",doctor_title),
new SqlParameter("@doc_zhiwei",doctor_zhiwu),
new SqlParameter("@doc_content",doctor_info),
new SqlParameter("@createtime",DateTime.Now.ToString())
};
2.地址栏的值用正则表达式匹配是否为数字等。
3.替换法
//防注入
public static string DelSQLStr(string str)
{
if (str == null || str == "")
return "";
str = str.Replace(";", "");
str = str.Replace("'", "");
str = str.Replace("&", "");
str = str.Replace("%20", "");
str = str.Replace("--", "");
str = str.Replace("==", "");
str = str.Replace("<", "");
str = str.Replace(">", "");
str = str.Replace("%", "");
str = str.Replace("+", "");
str = str.Replace("-", "");
str = str.Replace("=", "");
str = str.Replace(",", "");
return str;
}
4.在Global.asax文件中写验证 --------------------编程问答--------------------
参数化sqlparameter 和 触发器--------------------编程问答-------------------- replace html标签 --------------------编程问答-------------------- 你真的学会了t-sql语法了吗?如果学会了,我考考你:假设要查询姓名为
I'm sp1234
这样的人,你怎么写sql语句?
那些自称“要过滤单引号”的人,你们也懂t-sql语法吗?如果懂,你们为什么连查询条件常量中包含的单引号都要“过滤”?我们本来就是要查询那些可以带单引号的字符串常量,而有些弄出可笑的“过滤单引号”来了,也太荒唐了。
--------------------编程问答--------------------
正确的写法应该是:
var sql="select * from table1 where strWhere='"+ xx.Replace("'","''") +"'";
如果不懂,那么赶紧去翻翻t-sql语法文档,看看关于字符串常量中可能包含单引号时应该如何转义的规定。
现在号称会写sql语句的程序员,不会都是Csdn学出来的吧?应该能够接受这方面得训练吧?!
不用扯什么成事不足败事有余的“过滤字符”的做法,这根本就是错误的。
甚至也不用硬性地去搞什么“参数化查询”。 --------------------编程问答-------------------- 本来不太想回复,因为最近csdn越来越差了。但是针对这么多回复,还没有一个讲解真正的“道理”的回复,让人很揪心。
有人发帖讽刺说:您怎么总是说得好像是“文不对题”啊?
我实际上要提醒大家:一个好的技术论坛很容易被这样的人毁了,成为一帮中专生的Party,而稍微深入的技术交流却被人说成是“文不对题”了。 --------------------编程问答-------------------- 使用存储过程,程序直接调用存储过程不拼串调用。存储过程编写也有要求,不用like采用charindex.如果存储过程编写需要组串,串也采用参数传递。屏蔽异常错误,避免别人根据异常得出你的数据库相关信息。
补充:.NET技术 , ASP.NET