为了防止登录口令被SQL注入攻击,我是将输入的textbox中的文本
如果有“'”的全部替换成“¥”来处理的,不知道大家是怎么做的?
大家交流下。
43 个解决方案
#1
坐等高手.
#2
1.不要或尽量少拼接sql
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)
#3
3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗?
网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去,
希望能和大家将这个问题讨论彻底!!
#4
危险字符过滤的类(最新完善版) * 山哥的后台类 *
http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx
我看了一下,但是不知道好用吗,
我想做的是在前台作判断,至今还没有找到好的方法。
http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx
我看了一下,但是不知道好用吗,
我想做的是在前台作判断,至今还没有找到好的方法。
#5
原SQL:SELECT ID FROM SmsGuest WHERE (Type = @UserType) AND (UserName = @UserName)
//-----------------------------------------------------------
using (SqlConnection connection = new SqlConnection(SqlDataSource3.ConnectionString))
{
SqlCommand command = new SqlCommand(SqlDataSource3.SelectCommand.ToString (), connection);
SqlParameterCollection p;
//增加参数
command.Parameters.Add("UserName", "string");
command.Parameters.Add("UserType", "string");
//此例需要返回记录数,用了一个比较笨的方法,读入reader,再通过循环得到记录数。
SqlDataReader reader;
command .Parameters ["UserName"].Value =(object ) Label1.Text;
command.Parameters["UserType"].Value = Typelab.Text.Trim();
// command.CommandText = "Select * from SmsUserType where ((UserName='111') and (UserType='新员工'))";
connection.Open();
int i = 0;
//将数据导入reader中,并通过循环得到记录数i
reader = command.ExecuteReader();
while (reader.Read())
{
i++;
}
reader.Close();
connection.Close();
}
#6
举个例子
不进行如sql="Select * from tab where name ='"+name+"'" //这种方法
全都改为传参sql="Select * from tab where name =@name" //这种方法
http://topic.csdn.net/u/20090122/12/339f6bb8-9a43-4ccc-a4b9-286d90ab760d.html
http://topic.csdn.net/u/20090122/14/43e47ae1-393f-475a-a4cd-d31bc6a91779.html
http://topic.csdn.net/u/20090122/15/20b8435a-ee83-4d65-a8a6-d6637b442601.html
看一下这三个帖子,是一个人发的.着重看一下第2帖.
#7
sql="Select * from tab where name =@name
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?
#8
可以定义相应的参数就行了
sql语句尽量用存储过程
#10
做到两点,可保你万无一失
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}
#11
另外,如果考虑插入<script>标签的话,可以在显示的时候进行 Server.HtmlEncode(row["title"].ToString())
#12
和你用什么传过来没关系,你看一下sqlparameter的用法.
#13
学习
#14
public class ProcessRequest
{
public static void StartProcessRequest()
{
string sqlErrorPage = "ErrorPage.htm";
try
{
string getkeys = "";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
public static bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str != "")
{
string SqlStr = ";|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string s in anySqlStr)
{
if (Str.IndexOf(s) > -1)
{
ReturnValue = false;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
}
#15
1.使用双引号
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest();
}
#region
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "index.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec¦insert¦select¦delete¦master¦update¦truncate¦declare";
string[] anySqlStr = SqlStr.Split('¦');
foreach (string ss in anySqlStr)
{
if(!Str.ToLower().Contains("updatepanel"))
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
#endregion
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest();
}
#region
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "index.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec¦insert¦select¦delete¦master¦update¦truncate¦declare";
string[] anySqlStr = SqlStr.Split('¦');
foreach (string ss in anySqlStr)
{
if(!Str.ToLower().Contains("updatepanel"))
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
#endregion
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx
#16
过滤 参数化
#17
具体的你要查看相关的东东,了解存储过程,sql语句等!
#18
#19
太帅了,受教,受教。
#20
推荐使用存储过程
#21
禁止用户输入敏感 字符 sql 尽量使用参数。。
#22
可以在前台把几个重要的符号设上禁用,他在文本里就输入不上',之类的符号。
#23
能详细的讲讲吗?
#24
希望大家就自己的观点能将的详细点,详细加分哦。
#25
SqlCommand cmda = new SqlCommand(sqlu, scn);
cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();
cmda.ExecuteNonQuery();
cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();
cmda.ExecuteNonQuery();
#26
不要或尽量少拼接sql
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递
#27
最近看到一篇关于网站安全的文章,与大家分享下:
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
#28
最近看到一篇关于网站安全的文章,与大家分享下:
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
#29
使用存储过程的例子.
存储过程如下:
代码如下:
存储过程如下:
CREATE PROCEDURE [dbo].[sp_us_CheckUserInfo]
@LoginName varchar(30),
@Password varchar(60)
AS
Select * from us_User LoginName=@LoginName and Password=@Password
GO
代码如下:
// 检查用户名和密码是否正确
Private DataSet CheckUserInfo(string userName, string pwd)
{
SqlParameter[] parms = new SqlParameter[]
{ new SqlParameter("@LoginName", SqlDbType.VarChar, 30),
new SqlParameter("@Password", SqlDbType.VarChar, 60) };
parms[0].Value = userName;
parms[1].Value = pwd;
// 这里使用了SqlHelper类
return SqlHelper.ExecuteDataset(_connectString, CommandType.StoredProcedure, "sp_us_CheckUserInfo", parms);
}
// ...
// 登录的时候
DataSet ds = CheckUserInfo(txtUserName.Text.Trim(), txtPwd.Text.Trim());
if(ds.Tables[0].Rows.Count > 0)
{
// ...
}
else
{
// ...
}
#30
如果是过滤的话,会把一些有用的字符也过滤掉,很麻烦
#31
不要拼sql.
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入
#32
楼上的兄弟姐妹们,说了这么多,其实就是就通用的sql防注入方法
就是
参数化数据变量
就是
参数化数据变量
#33
我是这样写的:
private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";
再这样调用:string.Format(D_tib, uLogin.Name);
private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";
再这样调用:string.Format(D_tib, uLogin.Name);
#34
支持存储过程!
#35
支持
#36
很好~
#37
不要想的那么难, 看看microsoft的最佳实践。
照着做就好。
照着做就好。
#38
当然用存储过程了,又快又安全哦~
#39
我用存储过程
#40
1指定数据类型
2 过滤单引号
足够了
#41
最好的方法,使用SqlParameter
#42
受教!
#43
这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:yisheng@hotmail.com, 7X24 为您的网站和服务器保驾护航。
#1
坐等高手.
#2
1.不要或尽量少拼接sql
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)
2.注意对用户输入的数据进行检查
3.sql参数使用参数化形式(parameter)
#3
3.sql参数使用参数化形式(parameter),这个没用过,能讲的详细点吗?
网站安全是个大问题,如果分少可以加,我可以将全部的分数都可以加上去,
希望能和大家将这个问题讨论彻底!!
#4
危险字符过滤的类(最新完善版) * 山哥的后台类 *
http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx
我看了一下,但是不知道好用吗,
我想做的是在前台作判断,至今还没有找到好的方法。
http://blog.csdn.net/johnsuna/archive/2004/12/05/205295.aspx
我看了一下,但是不知道好用吗,
我想做的是在前台作判断,至今还没有找到好的方法。
#5
原SQL:SELECT ID FROM SmsGuest WHERE (Type = @UserType) AND (UserName = @UserName)
//-----------------------------------------------------------
using (SqlConnection connection = new SqlConnection(SqlDataSource3.ConnectionString))
{
SqlCommand command = new SqlCommand(SqlDataSource3.SelectCommand.ToString (), connection);
SqlParameterCollection p;
//增加参数
command.Parameters.Add("UserName", "string");
command.Parameters.Add("UserType", "string");
//此例需要返回记录数,用了一个比较笨的方法,读入reader,再通过循环得到记录数。
SqlDataReader reader;
command .Parameters ["UserName"].Value =(object ) Label1.Text;
command.Parameters["UserType"].Value = Typelab.Text.Trim();
// command.CommandText = "Select * from SmsUserType where ((UserName='111') and (UserType='新员工'))";
connection.Open();
int i = 0;
//将数据导入reader中,并通过循环得到记录数i
reader = command.ExecuteReader();
while (reader.Read())
{
i++;
}
reader.Close();
connection.Close();
}
#6
举个例子
不进行如sql="Select * from tab where name ='"+name+"'" //这种方法
全都改为传参sql="Select * from tab where name =@name" //这种方法
http://topic.csdn.net/u/20090122/12/339f6bb8-9a43-4ccc-a4b9-286d90ab760d.html
http://topic.csdn.net/u/20090122/14/43e47ae1-393f-475a-a4cd-d31bc6a91779.html
http://topic.csdn.net/u/20090122/15/20b8435a-ee83-4d65-a8a6-d6637b442601.html
看一下这三个帖子,是一个人发的.着重看一下第2帖.
#7
sql="Select * from tab where name =@name
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?
这样写后,能不能获得传过来的参数?
如果通过session传过来的参数也能用这种方法写吗?
#8
可以定义相应的参数就行了
sql语句尽量用存储过程
#9
#10
做到两点,可保你万无一失
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}
1、对string参数进行Replace("'","''") or Replace("'","")
示例sql语句:string sql = "select * from [users] where [name]='"+ name.Replace("'","") +"'";
注意sql语句中[name]=''两个单引号不可缺
2、对int参数进行int.Parse()
示例sql语句:string sql = "select * from [users] where [id]="+ int.Parse(id).ToString();
出错说名参数不对,跳转到默认错误页面
当然也可以通过含蓄的方式验证,比如 int.TryParse 或者 try{}catch{}
#11
另外,如果考虑插入<script>标签的话,可以在显示的时候进行 Server.HtmlEncode(row["title"].ToString())
#12
和你用什么传过来没关系,你看一下sqlparameter的用法.
#13
学习
#14
public class ProcessRequest
{
public static void StartProcessRequest()
{
string sqlErrorPage = "ErrorPage.htm";
try
{
string getkeys = "";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage + "");
System.Web.HttpContext.Current.Response.End();
}
}
public static bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str != "")
{
string SqlStr = ";|and|exec|insert|select|delete|update|count|*|chr|mid|master|truncate|char|declare";
string[] anySqlStr = SqlStr.Split('|');
foreach (string s in anySqlStr)
{
if (Str.IndexOf(s) > -1)
{
ReturnValue = false;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
}
#15
1.使用双引号
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest();
}
#region
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "index.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec¦insert¦select¦delete¦master¦update¦truncate¦declare";
string[] anySqlStr = SqlStr.Split('¦');
foreach (string ss in anySqlStr)
{
if(!Str.ToLower().Contains("updatepanel"))
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
#endregion
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx
2.避免动态的SQL语句
3.验证所有的输入
在global.asax里
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest();
}
#region
private void StartProcessRequest()
{
try
{
string getkeys = "";
string sqlErrorPage = "index.aspx";
if (System.Web.HttpContext.Current.Request.QueryString != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.QueryString.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.QueryString.Keys[i];
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.QueryString[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
if (System.Web.HttpContext.Current.Request.Form != null)
{
for (int i = 0; i < System.Web.HttpContext.Current.Request.Form.Count; i++)
{
getkeys = System.Web.HttpContext.Current.Request.Form.Keys[i];
if (getkeys == "__VIEWSTATE") continue;
if (!ProcessSqlStr(System.Web.HttpContext.Current.Request.Form[getkeys]))
{
System.Web.HttpContext.Current.Response.Redirect(sqlErrorPage);
System.Web.HttpContext.Current.Response.End();
}
}
}
}
catch
{
// 错误处理: 处理用户提交信息!
}
}
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{
string SqlStr = "exec¦insert¦select¦delete¦master¦update¦truncate¦declare";
string[] anySqlStr = SqlStr.Split('¦');
foreach (string ss in anySqlStr)
{
if(!Str.ToLower().Contains("updatepanel"))
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
#endregion
http://www.cnblogs.com/xinyuxin912/archive/2006/09/01/492655.aspx
#16
过滤 参数化
#17
具体的你要查看相关的东东,了解存储过程,sql语句等!
#18
#19
太帅了,受教,受教。
#20
推荐使用存储过程
#21
禁止用户输入敏感 字符 sql 尽量使用参数。。
#22
可以在前台把几个重要的符号设上禁用,他在文本里就输入不上',之类的符号。
#23
能详细的讲讲吗?
#24
希望大家就自己的观点能将的详细点,详细加分哦。
#25
SqlCommand cmda = new SqlCommand(sqlu, scn);
cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();
cmda.ExecuteNonQuery();
cmda.Parameters.Add(new SqlParameter("@Pass", SqlDbType.NVarChar,20));
cmda.Parameters["@pass"].Value = TextBox3.Text.Trim().ToString();
cmda.ExecuteNonQuery();
#26
不要或尽量少拼接sql
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递
sql语句都写成存储过程
查询变量在传入过程中必须通过参数传递
#27
最近看到一篇关于网站安全的文章,与大家分享下:
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
#28
最近看到一篇关于网站安全的文章,与大家分享下:
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
小技巧的大作用:让你的网站远离危险
小技巧的大作用:让你的网站远离危险2009-02-19 来自:赛迪网
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
在网络攻击成倍增长的今天,网络反黑客保安全已经成为每个计算机用户的必备课程。要成为成功的信息安全专业人士,不仅需要不断更新最尖端的安全知识,还需要对商务过程和风险管理有深刻认识。就现在许多IT公司的现状来看,基本上每一个公司都有一名或多名(部门)专职的人员负责着公司内网、外网、服务器的网络安全维护。而随着网络应用的不断普及与信息安全服务需求市场的不断成熟,逐渐出现了一些专业的以信息安全服务为主要业务的团队、公司。
大多数公司的网管仅仅是程序人员和网页设计人员,对安全涉猎有限。而且,网络是否安全,有时并不是网络所有者自己完全清楚的。所以,许多公司要请第三方评估机构或专家来完成对网络安全的评估。这样做的好处是:能对自己所处的环境有个更加清醒的认识,把未来可能的风险降到最小。目前网络安全评估的中介机构,国外已经开始将网络的安全评估作为一个新的服务项目向社会推出。作为一种新兴的业务,其影响是否能象会计师事务所、审计师事务所之类的中介机构那样重要,尚需拭目以待。但有一点可以肯定,那就是网络上的商机同样也与风险同存。要想获得利润,就必须将安全问题解决。
目前很多人都采用动网、LEADBBS、动易系统等程序做网站,由于源码公开,因此程序漏洞暴露明显,很容易被黑,安全专家建议大家参考以下部分安全建议,做好自身安全:
(1)仔细查看安装说明,切记修改默认数据库名,并且一定要把扩展名改为asp或者asa,因为不经处理的数据库可以直接下载,根本无安全可言,另外可以把数据库所在目录改名。
(2)尽量不采用无组件上传,使用其他组件上传方式(比如Fileup或LyfUpload),部分无组件上传带有严重漏洞,一般可通过修改upfile.asp文件选择上传方式。
(3)经常访问相关官方网站,关注程序安全漏洞和更新版本,及时给自己程序升级或打上补丁。
(4)尽量不采用修改版和插件版的程序,因为修改后的程序会使漏洞更多,而且补丁也不一定完全适用。
(5)设置相对复杂的FTP密码和网站管理密码并经常修改,同时考虑修改网站后台管理的文件名称。
(6)经常检查网站内文件,发现可疑文件后及时处理,并分析可能的原因。
(7)对于SQL数据库,您可以用企业管理器连接,然后把重要数据表设置为只读权限,如动网的DV_Admin表修改为只读以后,可以防止任何方式添加管理员。
(8)二次开发时切记做好对特殊符号的过虑,防止注入漏洞。
(9)经常备份自己的网站数据,因为网站安全的第一要求就是备份,防止被黑以后数据丢失。
(10)如果有服务器管理权限建议把论坛上传图片目录设置权限最低。
#29
使用存储过程的例子.
存储过程如下:
代码如下:
存储过程如下:
CREATE PROCEDURE [dbo].[sp_us_CheckUserInfo]
@LoginName varchar(30),
@Password varchar(60)
AS
Select * from us_User LoginName=@LoginName and Password=@Password
GO
代码如下:
// 检查用户名和密码是否正确
Private DataSet CheckUserInfo(string userName, string pwd)
{
SqlParameter[] parms = new SqlParameter[]
{ new SqlParameter("@LoginName", SqlDbType.VarChar, 30),
new SqlParameter("@Password", SqlDbType.VarChar, 60) };
parms[0].Value = userName;
parms[1].Value = pwd;
// 这里使用了SqlHelper类
return SqlHelper.ExecuteDataset(_connectString, CommandType.StoredProcedure, "sp_us_CheckUserInfo", parms);
}
// ...
// 登录的时候
DataSet ds = CheckUserInfo(txtUserName.Text.Trim(), txtPwd.Text.Trim());
if(ds.Tables[0].Rows.Count > 0)
{
// ...
}
else
{
// ...
}
#30
如果是过滤的话,会把一些有用的字符也过滤掉,很麻烦
#31
不要拼sql.
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入
使用存储过程或者使用参数化的sql语句.
对输入的数据进行有效性验证.
控制输入
#32
楼上的兄弟姐妹们,说了这么多,其实就是就通用的sql防注入方法
就是
参数化数据变量
就是
参数化数据变量
#33
我是这样写的:
private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";
再这样调用:string.Format(D_tib, uLogin.Name);
private const string S_tib = "select count(Tib_Code) from web_* where Tib_Name='{0}'";
再这样调用:string.Format(D_tib, uLogin.Name);
#34
支持存储过程!
#35
支持
#36
很好~
#37
不要想的那么难, 看看microsoft的最佳实践。
照着做就好。
照着做就好。
#38
当然用存储过程了,又快又安全哦~
#39
我用存储过程
#40
1指定数据类型
2 过滤单引号
足够了
#41
最好的方法,使用SqlParameter
#42
受教!
#43
这种问题很严重,一般都是网站存在漏洞或者服务器存在漏洞而被攻击了,若需要安全技术服务请联系EMAIL & MSN:yisheng@hotmail.com, 7X24 为您的网站和服务器保驾护航。