关于在我的应用程序中阻止SQL注入,我有一个简单的问题。
我的Web应用程序的两个不同功能使用文本框,用户可以使用这些文本框从MSSQL数据库中搜索项目。此信息显示在GridView中。
我使用此方法创建查询:
sqldatasource.SelectCommand = "SELECT x from x where this_id LIKE '%" + txtbox.Text + "%' ORDER BY x ASC";
显然,用户输入并将其直接输入到这样的查询中会打开基本的SQL注入。请问有人可以解释我如何参数化以防止在我的应用程序中使用SQL注入?
提前致谢
答案 0 :(得分:5)
sqldatasource.SelectCommand = @"SELECT x from x where this_id LIKE @inText ORDER BY x ASC";
cmd.Parameters.AddWithValue("@inText", "%" + txtbox.Text + "%");
注意,如果您使用通配符启动LIKE
,您将会感到痛苦。一张大桌子会很伤心,慢慢来。
答案 1 :(得分:0)
一种(不是很好,但总比没有好)的方法是清理txtBox.Text的内容,然后使用已清理的结果。
sqlsource.SelectCommand = "SELECT x from x where this_id LIKE '%" + SanitizedString(txtBox.Text) + "%';";
// ... codes ...
private string SanitizedString(string given)
{
string sanitized = given.Replace(";", string.Empty);
sanitized = sanitized.Replace("--", string.Empty);
// ... ad nauseum, conditions galore ...
return sanitized;
}
......然而,这非常耗费人力。
要做的是以存储过程的形式使用绑定变量。从我所看到的,您可以绑定您的过滤器txtbox.Text条件,然后将其传入。
db上的查询很简单,例如:
SELECT x from X where this_id LIKE :filter ORDER BY x ASC
要调用它,您需要研究MSSQL如何与存储过程进行通信。
绑定变量使您的代码彻底防止SQL注入。 爱绑定变量,因为他们会爱你。邪恶的hax0rs不会。
答案 2 :(得分:-1)
感谢您的回答。最后,我在MSDN网站上使用了这个参数化查询:
GetSubInfo.SelectParameters.Add("xparam", txtbox.Text);
GetSubInfo.SelectCommand = "SELECT x from x where x_id LIKE @xparam ORDER BY x ASC";
这与Hogan的答案非常相似,语法略有不同。希望这有帮助!