请高手指点我写的防注入代码,看会出现哪些问题,哪些还可以改进?

xuehan 2005-06-03 03:44:47
请高手指点我写的防注入代码,看会出现哪些问题,哪些还可以改进?虚心学习中……
另外:我想把这段代码写成类的一个方法,或写成公用函数,但一执行到转向(Response.Redirect("/erro.htm");)时就出错,提示的错误不一样,总之就是不能在这两种方式中转向,所以我现在在每个要用的页面都要加这段代码,真累,各位有什么更好的方法啊??

private string CheckInputStr(string str)
{
string jscrip_str=str;
string delimStr = " ";
char [] aaaa = delimStr.ToCharArray();

string[] strArray1 = jscrip_str.Split(aaaa[0]);
string[] strArray2 = {"and","or","set","exec","execute","declare","select","insert","delete","drop","update","truncate","asc(","mid(","count(","char(","xp_cmdshell","net localgroup","backup database","master","sqloledb","db_name","openrowset","opendatasource","triger","jobs","sp_addlogin","sp_addsrvrolemember"};

jscrip_str=jscrip_str.Replace("'","‘").Replace(";",";").Replace(",",",").Replace("--","--").Replace("+","+").Replace("&&","").Replace("||","||").Replace("=","=").Replace("!","!").Replace("<","〈").Replace(">","〉");


for (int i=0;i<strArray1.Length;i++)
{
for (int n=0;n<strArray2.Length;n++)
{
if (strArray1[i]==strArray2[n])
{
Response.Redirect("/erro.htm");
}
}

}

return jscrip_str;
}
...全文
86 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyf19 2005-06-03
  • 打赏
  • 举报
回复
学习!!使用存程过程
xuehan 2005-06-03
  • 打赏
  • 举报
回复
我也是用的楼上的在asp.net中通过参数来实现sql而不是sql拼接,但这种方式就保证不被注入吗?
Truly 2005-06-03
  • 打赏
  • 举报
回复
同意楼上,参数化sql语句
LoveCherry 2005-06-03
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3803/3803170.xml?temp=.6236078

大家存在5点误区:
1、sql注入比较难防,需要替换select,delete等一打字符
其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。
2、忽略DropDownList传来的东西
其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。
3、access比sqlserver不安全
安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。
4、网站没有显示出错信息就说明网站是安全的
当有记录的时候显示记录,没有记录的时候显示找不到任何记录,通过这两种状态就可以猜解字段名了,所以网页不出错不能说明是安全的
5、忽略post提交的信息
很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多

在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏
比如:

SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn);
SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50);
parm1.Value=((TextBox)e.Item.FindControl("name")).Text;
SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int);
parm2.Value=((TextBox)e.Item.FindControl("age")).Text;
SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);
parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
comm.Parameters.Add(parm1);
comm.Parameters.Add(parm2);
comm.Parameters.Add(parm3);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();


这样的代码看起来舒服而且又安全,何乐不为?

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧