经过多次辩论后,我停止使用LINQ并转移到存储过程。现在我正在使用所有存储过程,我遇到了LINQ认为理所当然的事情。一个是单引号。
一位同事向我展示了以下方法,以便更容易调用存储过程,而无需为每个查询写出很长的路径。我现在的问题是处理诸如Mc'Kay
或O'Reilly
等人名之类的数据。单引号弄乱了我传递它的字符串。
public static void exe(string sql)
{
SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, con);
if (con.State == ConnectionState.Closed) { con.Open(); }
cmd.ExecuteNonQuery(); con.Close();
}
我一直在网站上使用这种方法和另一种非常相似的方法。我可以清理这种方法的最佳方法是什么,这样我就可以操作具有''''在它中,仍然是安全/安全的SQL注入。我希望在这个方法或帮助方法中做到这一点,所以我不必去自从我进行此切换后已经写入的每个查询。
我调用传入过程名称的存储过程,然后用逗号分隔后面的params。如果param是一个字符串,我用单引号括起来。
答案 0 :(得分:0)
排序答案:在编写查询时用单引号替换单引号。这就是你如何逃避SQL Server中的单引号。即:
var escapedValue = originalValue.Replace("'","''");
好建议:如所有注释中所述,不要以这种方式编写查询,并使用参数化查询或存储过程,并传递参数值:您将避免数字和日期解析,SQL注入等问题攻击,以及更多不同的,多次意外的问题。
此外,如果您使用的是存储过程,则必须具有已有的参数。请简单地使用它们!这真的很容易:
换句话说:只需创建一个命令,将commant类型设置为存储过程,设置存储过程名称,将参数及其值添加到参数集合中,并将其除外。通过这种方式,您将忘记上述问题。