哪一个是更好的方法来阻止sql注入
本文关键字:sql 注入 方法 更好 哪一个 | 更新日期: 2023-09-27 18:11:35
我有数据库功能,在不同的条件下选择数据。实现这一目标有两种可能的方法。第一个
public string select(string name)
{
string s = null;
query = "select * from tablename where name=@name";
con.Open();
com=new SqlCeCommand(query,con);
com.Parameters.AddWithValue("@name",name);
sdr=com.ExecuteReader();
while (sdr.Read())
{
s = sdr.GetString(0);
}
return s;
}
在这种方法中,我需要为查询中的小变化编写不同的函数,如顺序,地址代替名称或查询中的多个参数,top 20等。但是这种方法在sql注入方面是安全的。第二个
public string select(string query)
{
string s = null;
con.Open();
com=new SqlCeCommand(query,con);
sdr=com.ExecuteReader();
while (sdr.Read())
{
s = sdr.GetString(0);
}
return s;
}
在第二种方法中,我通过带值的函数参数传递数据库查询,因此我不需要com.Parameters.AddWithValue("@name",name);
,也不需要为选择查询的更改编写不同的函数。查询中的参数值由代码给出,而不是由用户给出。当用户没有输入参数时,这种方法是否可能进行sql注入?
哪一个是安全的,高效的,因为我的应用程序不能承受数据丢失
主要防御:
选项#1:使用预处理语句(参数化查询)
选项#2:使用存储过程
选项#3:转义所有用户输入
额外的防御:
Also Enforce: Least Privilege
同时执行:白名单输入验证
源www.owasp.org您考虑过使用Linq to SQL或EDM吗?使用对象意味着你的代码(理论上)是安全的,不受SQL注入攻击。
在这种方法中,当用户不提供输入时,sql注入是否可能对参数。
只要您的用户不与数据库交互,那么谁会试图在您的参数中注入SQL。
一般来说,只要你使用参数与你的查询,你是安全的SQL注入。