开发一个安全的小网站(一)防止sql注入
2015-09-02 21:58
507 查看
首先直接靠拼接字符串来做数据库的查询是很危险的
错误的写法比如:
这样如果传进来的参数为 'and 1=1--
则最后执行的sql语句为 select * from [表名] where [字段]=''and 1=1--'
这样就会将本来是数据的参数就变成了sql指令,这样很危险
安全的写法应该是用参数化,就是将传进来的参数当成数据,交到dbms处理
参数化的写法是这样
(cookie,codeid)values(@cookie,@codeid)";//这里指定参数
com.Parameters.AddWithValue("@cookie", SqlDbType.VarChar);//这里指定参数的类型
com.Parameters["@cookie"].Value = cookie;
com.Parameters.AddWithValue("@codeid", SqlDbType.Int);//将传进来的参数放入sql参数中,这样在编译时就确定了类型,提高了执行效率
com.Parameters["@codeid"].Value = intcodeid;
conn.Open();
com.ExecuteNonQuery();
com.Dispose();
conn.Close();
}
错误的写法比如:
string flag = Request[参数]; string sql="select * from [表名] where [字段]="+flag; OleDbConnection conn = getconn(); OleDbCommand com = new OleDbCommand(); com.CommandText = sql; com.Connection = conn; conn.Open(); com.ExecuteNonQuery(); com.Dispose(); conn.Close();
这样如果传进来的参数为 'and 1=1--
则最后执行的sql语句为 select * from [表名] where [字段]=''and 1=1--'
这样就会将本来是数据的参数就变成了sql指令,这样很危险
安全的写法应该是用参数化,就是将传进来的参数当成数据,交到dbms处理
参数化的写法是这样
public void inster(string cookie,string codeid) { int intcodeid = Convert.ToInt16(codeid); OleDbConnection conn = getconn(); OleDbCommand com = new OleDbCommand(); com.Connection = conn; com.CommandText = "insert into