图像控件未被来自数据库

时间:2017-11-13 22:25:51

标签: c# asp.net sql-server

我为数据库中记录的每个学生都提供了一张图片。但是,当我想要显示学生的详细信息时。除了图像之外,还显示了所有其他内容。我的代码显示没有运行时错误或调试错误。该方法的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;
    }
}

1 个答案:

答案 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选项,以强制任何未明确创建参数数组的查询出现编译错误,但 确定 你得到了所有。