我有一个站点,允许用户在数据库中搜索多个项目。但是,我对 SQL 不是很擅长,而且我读到允许用户在框中键入内容然后使用“SELECT 语句”是不安全的。代码如下:
搜索按钮将搜索作为参数发送:
protected void search_click (object sender, EventArgs e)
{
Response.Redirect("Search.aspx?Result=" + TextBoxSearch.Text);
}
onLoad 在我的搜索页面中获取值并调用 getData():
search = Request.QueryString["Result"].ToString();
getData();
获取数据()方法:
protected void getData()
{
using (SqlConnection con = new SqlConnection(strCon))
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "SELECT [categoryId], [category] FROM [Category] WHERE ([category]=@search)";
cmd.Parameters.AddWithValue("@search", search);
con.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
LabelCat.Text = reader.GetString(reader.GetOrdinal("category"));
HiddenFieldID.Value = reader.GetInt32(reader.GetOrdinal("categoryId")).ToString();
}
else
{
LabelCat.Text = "Add"; //When search is made but no cateogry found
}
}
}
con.Close();
}
}
这样安全吗?我觉得它对 sql 注入非常弱,但我又不太了解。如果它不安全,请建议我可以这样做的安全方法。
我正在使用 ASP.NET 和 C# webforms 在 VS12 中构建我的应用程序。使用 SQL Management Studio 构建我的数据库。
编辑:最终我将不得不使用连接语句在这里搜索几个表,不知道这是否相关但我应该提到它。
您已经使用了参数化查询,这是防止 SQL 注入的最低期望。
我建议您可以在 C# 代码中作为验证来处理一些要点
我没有看到您从中获取的文本有任何服务器端验证
TextBoxSearch.Text
,您可以检查一些可能是 SQL 注入尝试的字符集。您可以查看SQL 注入的输入集,并确保在执行 sql 查询之前输入字符串中不存在这些字符。
其他建议是,如果您希望在 sql 查询中有多个连接等,更好的选择是将其转换为存储过程。
我可以推荐您阅读Sommarskog.se/dyn-search吗?
它调查了迄今为止社区已知的所有可能的解决方案,并对每个选项进行了 SWOT 分析。
最好的问候,亨里克·施陶恩·波尔森