.net防SQL注入攻击代码 请问大家有.net防SQL注入攻击代码吗?以及该代码应该写在那里;是写在WEB.CONFIG里吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先写个SqlHelper类,在DAL层或者你要写sql语句的时候用SqlParameter传参数就防止SQL注入攻击。例如:你要根据用户ID查询用户是否存在,返回一个用户对象实例public static UserInfo GetUserInfoByUserID(int UserId) { UserInfo user = new UserInfo(); string sql = "select * from UserInfo where UserId=@UserId"; SqlParameter[] para = new SqlParameter[] { new SqlParameter("@UserId",UserId) }; SqlDataReader reader = DBHelper.GetSqlDataReader(sql, para); if (reader.Read()) { user.UserId = Convert.ToInt32(reader["UserId"]); user.UserName = reader["UserName"].ToString(); user.PassWord = reader["PassWord"].ToString(); ... } return user; }数据库连接字符串一般写的WEB.CONFIG里,是为了修改其来方便。写在<connectionStrings> <add name="connectionString" connectionString="你的连接"/></connectionStrings>你的name属性要和SqlHerlper里的ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;的ConnectionStrings["connectionString"]对应。SqlHelper累如下。也可以自己网上找很多的,我这个是贡初学者,没有涉及到访问存储过程的public class SqlHelper { private static string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; public static SqlConnection GetSqlConnection() { SqlConnection con = new SqlConnection(connectionString); return con; } public static void Open(SqlConnection con) { if (con.State == ConnectionState.Closed) { con.Open(); } else if (con.State == ConnectionState.Broken) { con.Close(); con.Open(); } } /// <summary> /// 执行无参SQL语句 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static int ExecuteCommand(string sql) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); int number = cmd.ExecuteNonQuery(); con.Close(); return number; } /// <summary> /// 执行带参SQL语句 /// </summary> /// <param name="sql"></param> /// <param name="values"></param> /// <returns></returns> public static int ExecuteCommand(string sql, params SqlParameter[] paras) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddRange(paras); int number = cmd.ExecuteNonQuery(); con.Close(); return number; } /// <summary> /// 执行无参SQL语句,并返回执行记录数 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static object GetScalar(string sql) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); object obj = cmd.ExecuteScalar(); con.Close(); return obj; } /// <summary> /// 执行有参SQL语句,并返回执行记录数 /// </summary> /// <param name="sql"></param> /// <param name="values"></param> /// <returns></returns> public static object GetScalar(string sql, params SqlParameter[] paras) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddRange(paras); object obj = cmd.ExecuteScalar(); con.Close(); return obj; } /// <summary> /// 执行无参SQL语句,并返回SqlDataReader /// </summary> /// <param name="sql"></param> /// <returns></returns> public static SqlDataReader GetSqlDataReader(string sql) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; } /// <summary> /// 执行有参SQL语句,并返回SqlDataReader /// </summary> /// <param name="sql"></param> /// <param name="values"></param> /// <returns></returns> public static SqlDataReader GetSqlDataReader(string sql, params SqlParameter[] paras) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddRange(paras); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; } /// <summary> /// 执行无参SQL语句,并返回DataTable /// </summary> /// <param name="sql"></param> /// <returns></returns> public static DataTable GetDataTable(string sql) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); SqlCommand cmd = new SqlCommand(sql, con); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); con.Close(); return dt; } /// <summary> /// 执行有参SQL语句,并返回DataTable /// </summary> /// <param name="sql"></param> /// <param name="values"></param> /// <returns></returns> public static DataTable GetDataTable(string sql, params SqlParameter[] paras) { SqlConnection con = GetSqlConnection(); DBHelper.Open(con); DataTable dt = new DataTable(); SqlCommand cmd = new SqlCommand(sql, con); cmd.Parameters.AddRange(paras); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); con.Close(); con.Dispose(); return dt; } } 只要你在程序里别拼接sql了,用参数化,存储过程,被注入几率会大大降低,比你用那些过滤字符串好用的多 petshop里面有一个过滤的方法直接复制出来用吧! 可以考虑在global里面对用户输入的数据进行分析,转化成安全字符串养成个好习惯,传参数,避免拼接 在global里写 void Application_BeginRequest(Object sender, EventArgs e) { StartProcessRequest(); } 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; } 代码一般写在Global.asax里,跟15楼的差不多 客户端进行操作的部分尽量写在客户端内,数据库操纵的内容尽量写在数据库,程序操纵的部分尽量写在程序,3者互不影响,防止SQL注入最好的办法就是“使用存储过程”速度快安全性高 【autocode代码生成器】 全面支持自动生成 java 标准代码! 全面支持自动生成 struts1.2 标准代码! 全面支持自动生成 ASP.NET 标准代码! 全面支持当今流行的三大主流开发架构 同时欢迎大家有空关注我们的QQ空间 http://915842778.qzone.qq.com/ 需要的朋友可以到天空软件园(www.skycn.com) 、华军软件园(www.newhua.com)、CSDN社区( www.csdn.net)下载使用 (注:在其网站的软件搜索里输入 “autocode” 即可查询出autocode代码生成器来供大家下载的地址咯) autocode代码生成器各个版本自动生成代码的特点:--== 1 .【 JAVA版 】具体自动生成的内容如下: ★ VO、POJO对象 ★ DAO接口 ★ IMPL接口实现类 ★ DAO工厂 ★ VO、POJO工厂 ★ DBC数据库连接管理类,数据库事务处理机制 ★ Servlet业务处理及其配置文件 ★ JSP调用页面(增、删、改、查),分页功能自动实现 2 .【 Struts1.2 版 】具体自动生成的内容如下: ★ VO、POJO对象 ★ DAO接口 ★ IMPL接口实现类 ★ DAO工厂 ★ VO、POJO工厂 ★ DBC数据库连接管理类,数据库事务处理机制 ★ EncodingFilter 处理中文乱码的编码过滤器 ★ Action、Form、struts-config.xml web.xml struts的处理核心类及配置文件 ★ JSP调用页面(全面支持struts1.2)(增、删、改、查),分页功能自动实现 (如果数据库是sqlserver,又需要分页的,请使用sqlserver2005) 3 .【 ASP.NET版 】具体自动生成的内容如下: ★ VO、POJO对象 ★ DAO接口 ★ IMPL接口实现类 ★ DAO工厂 ★ VO、POJO工厂 ★ DBC数据库连接管理类,数据库事务管理机制 ★ ASPX调用页面(增、删、改、查)(含.CS文件),分页功能自动实现 ★ Web.Config配置文件(VS2005工程需要的文件) 4、特色: ☆ 一键生成,简洁使用。 ☆ 生成的代码全部开源,没有任何通过插件或链接库来做的操作。 ☆ 支持多表的多主键处理。 ☆ 支持数据事务的操作。 ☆ 生成内容可以依据客户的需要来选择性的生成。 ☆ 支持自定义查询接口的生成,用户可以定义查询条件。 ☆ 生成的jsp、Servlet、Action、Asp.net 完全处理好了精度字段的精度及显示处理。 ☆ 目前支持Oracle、Sqlserver 数据库对象的自动生成代码。 ASP.NET 框架 (急!)asp.net 生成静态网页新闻内容分页。freetextbox发布新闻。 实现了ICallbackEventHandler接口,但是前台不执行javascript的ReceiveData方法! 问个ajax入门的,asp.net3.5 请高手解释以下代码意思,谢谢! 同样的问题这里在发一次,有关学习AJAX中的迷茫,求指点迷津 Gridview列表页面选中checkbox后,点分页在返回来还存在的情况? 谁知道这个效果如何实现的 treeview SQL的问题!很简单的! asp.net中怎样设置BUTTON控件的背景图片? 指定的路径或文件名太长??
例如:
你要根据用户ID查询用户是否存在,返回一个用户对象实例
public static UserInfo GetUserInfoByUserID(int UserId)
{
UserInfo user = new UserInfo();
string sql = "select * from UserInfo where UserId=@UserId";
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("@UserId",UserId)
};
SqlDataReader reader = DBHelper.GetSqlDataReader(sql, para);
if (reader.Read())
{
user.UserId = Convert.ToInt32(reader["UserId"]);
user.UserName = reader["UserName"].ToString();
user.PassWord = reader["PassWord"].ToString();
...
}
return user;
}数据库连接字符串一般写的WEB.CONFIG里,是为了修改其来方便。
写在<connectionStrings>
<add name="connectionString" connectionString="你的连接"/>
</connectionStrings>
你的name属性要和SqlHerlper里的ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;的ConnectionStrings["connectionString"]对应。
SqlHelper累如下。
也可以自己网上找很多的,我这个是贡初学者,没有涉及到访问存储过程的
public class SqlHelper
{
private static string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
public static SqlConnection GetSqlConnection()
{
SqlConnection con = new SqlConnection(connectionString);
return con;
}
public static void Open(SqlConnection con)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
else if (con.State == ConnectionState.Broken)
{
con.Close();
con.Open();
}
}
/// <summary>
/// 执行无参SQL语句
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static int ExecuteCommand(string sql)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
int number = cmd.ExecuteNonQuery();
con.Close();
return number;
}
/// <summary>
/// 执行带参SQL语句
/// </summary>
/// <param name="sql"></param>
/// <param name="values"></param>
/// <returns></returns>
public static int ExecuteCommand(string sql, params SqlParameter[] paras)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddRange(paras);
int number = cmd.ExecuteNonQuery();
con.Close();
return number;
}
/// <summary>
/// 执行无参SQL语句,并返回执行记录数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static object GetScalar(string sql)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
object obj = cmd.ExecuteScalar();
con.Close();
return obj;
}
/// <summary>
/// 执行有参SQL语句,并返回执行记录数
/// </summary>
/// <param name="sql"></param>
/// <param name="values"></param>
/// <returns></returns>
public static object GetScalar(string sql, params SqlParameter[] paras)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddRange(paras);
object obj = cmd.ExecuteScalar();
con.Close();
return obj;
}
/// <summary>
/// 执行无参SQL语句,并返回SqlDataReader
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static SqlDataReader GetSqlDataReader(string sql)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
/// <summary>
/// 执行有参SQL语句,并返回SqlDataReader
/// </summary>
/// <param name="sql"></param>
/// <param name="values"></param>
/// <returns></returns>
public static SqlDataReader GetSqlDataReader(string sql, params SqlParameter[] paras)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddRange(paras);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
/// <summary>
/// 执行无参SQL语句,并返回DataTable
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static DataTable GetDataTable(string sql)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con);
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
con.Close();
return dt
;
}
/// <summary>
/// 执行有参SQL语句,并返回DataTable
/// </summary>
/// <param name="sql"></param>
/// <param name="values"></param>
/// <returns></returns>
public static DataTable GetDataTable(string sql, params SqlParameter[] paras)
{
SqlConnection con = GetSqlConnection();
DBHelper.Open(con); DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddRange(paras);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
con.Close();
con.Dispose();
return dt;
}
}
void Application_BeginRequest(Object sender, EventArgs e)
{
StartProcessRequest(); }
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;
}
【autocode代码生成器】 全面支持自动生成 java 标准代码!
全面支持自动生成 struts1.2 标准代码!
全面支持自动生成 ASP.NET 标准代码! 全面支持当今流行的三大主流开发架构
同时欢迎大家有空关注我们的QQ空间 http://915842778.qzone.qq.com/ 需要的朋友可以到天空软件园(www.skycn.com) 、华军软件园(www.newhua.com)、CSDN社区( www.csdn.net)下载使用
(注:在其网站的软件搜索里输入 “autocode” 即可查询出autocode代码生成器来供大家下载的地址咯) autocode代码生成器各个版本自动生成代码的特点:--== 1 .【 JAVA版 】具体自动生成的内容如下: ★ VO、POJO对象
★ DAO接口
★ IMPL接口实现类
★ DAO工厂
★ VO、POJO工厂
★ DBC数据库连接管理类,数据库事务处理机制
★ Servlet业务处理及其配置文件
★ JSP调用页面(增、删、改、查),分页功能自动实现
2 .【 Struts1.2 版 】具体自动生成的内容如下:
★ VO、POJO对象
★ DAO接口
★ IMPL接口实现类
★ DAO工厂
★ VO、POJO工厂
★ DBC数据库连接管理类,数据库事务处理机制
★ EncodingFilter 处理中文乱码的编码过滤器
★ Action、Form、struts-config.xml web.xml struts的处理核心类及配置文件
★ JSP调用页面(全面支持struts1.2)(增、删、改、查),分页功能自动实现
(如果数据库是sqlserver,又需要分页的,请使用sqlserver2005)
3 .【 ASP.NET版 】具体自动生成的内容如下:
★ VO、POJO对象
★ DAO接口
★ IMPL接口实现类
★ DAO工厂
★ VO、POJO工厂
★ DBC数据库连接管理类,数据库事务管理机制
★ ASPX调用页面(增、删、改、查)(含.CS文件),分页功能自动实现
★ Web.Config配置文件(VS2005工程需要的文件)
4、特色:
☆ 一键生成,简洁使用。
☆ 生成的代码全部开源,没有任何通过插件或链接库来做的操作。
☆ 支持多表的多主键处理。
☆ 支持数据事务的操作。
☆ 生成内容可以依据客户的需要来选择性的生成。
☆ 支持自定义查询接口的生成,用户可以定义查询条件。
☆ 生成的jsp、Servlet、Action、Asp.net 完全处理好了精度字段的精度及显示处理。
☆ 目前支持Oracle、Sqlserver 数据库对象的自动生成代码。