我为数据库中记录的每个学生都提供了一张图片。但是,当我想要显示学生的详细信息时。除了图像之外,还显示了所有其他内容。我的代码显示没有运行时错误或调试错误。该方法的Id输入是输入的学号,以便显示该学生的信息。
private void Image(string id)
{
byte[] bytes = (byte[])GetData("SELECT Image FROM SI WHERE Username=" + id).Rows[0]["Image"];
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
imgPic.ImageUrl = "data:image/jpg;base64," + base64String;
}
private DataTable GetData(string query)
{
DataTable dt = new DataTable();
string constr = ConfigurationManager.ConnectionStrings["tlcString"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(query))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
sda.SelectCommand = cmd;
sda.Fill(dt);
}
}
return dt;
}
}
答案 0 :(得分:2)
您希望为此创建一个完全独立的ashx处理程序或aspx页面,该页面需要URL中的ID,并在页面加载时执行以下操作:
void Page_Load(object sender, EventArgs e)
{
string ID = Request.QueryString["ID"];
byte[] bytes = (byte[])GetData("SELECT Image FROM SI WHERE Username=" + ID;
Response.BinaryWrite(bytes);
}
然后,当前页面中的ASP:Image
可以使用更像这样的传统网址:
private void Image(string id)
{
imgPic.ImageUrl = "mynewpage.ashx?ID=" + id;
}
这对于Sql Injection攻击是疯狂的。这实际上是乞求你被黑客攻击。问题出在GetData()
方法中,该方法缺少任何参数化查询的机制。该方法实际上会强制您编写错误的代码。您需要将方法更改为更像这样的内容:
private DataTable GetData(string query, params SqlParameter[] parameters)
{
DataTable dt = new DataTable();
string constr = ConfigurationManager.ConnectionStrings["tlcString"].ConnectionString;
//You can stack these up
using (SqlConnection con = new SqlConnection(constr))
using (SqlCommand cmd = new SqlCommand(query, con))
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
foreach(var p in parameters)
cmd.Parameters.Add(p);
sda.Fill(dt);
}
return dt;
}
现在您可以更改Page_Load()来执行此操作:
void Page_Load(object sender, EventArgs e)
{
var userID = new SqlParameter("@Username", SqlDbType.Int);
userID.Value = Request.QueryString["ID"];
byte[] bytes = (byte[])GetData("SELECT Image FROM SI WHERE Username= @Username", userID).Rows[0]["Image"];
Response.BinaryWrite(bytes);
}
完成后 - 这是重要的! - 返回并检查使用GetData()
方法的其他任何地方,以确保修复使用字符串连接的任何其他地方将数据转换为查询。这非常重要,您甚至可能希望跳过方法上的params
选项,以强制任何未明确创建参数数组的查询出现编译错误,但 确定 你得到了所有。