无法移除撇号

3

如果没有任何带撇号的值,则此代码片段可以正常运行。但是,如果ddList.SelectedValue是“Women's day”之类的值,则会显示“Incorrect syntax near 's'. Unclosed quotation mark after the character string ''." 我尝试了albumName.Replace,但目前还没有成功。

protected void btnUpload_Click(object sender, EventArgs e)
{
    string albumName = ddList.SelectedValue.ToString();
    albumName.Replace("'", "''");

    conn.Open();
    SqlCommand command = new SqlCommand("select ID from Album where AlbumName = '" + albumName + "'", conn);

    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        AlbmID = Int32.Parse((reader["ID"].ToString())); 

    }
    reader.Close();

    if (fileuploadimages.HasFile == false)
    { ScriptManager.RegisterStartupScript(Page, Page.GetType(), "key", "<script>alert('No File Uploaded.')</script>", false); }
    else
    {
        //Get Filename from fileupload control
        string filename = Path.GetFileName(fileuploadimages.PostedFile.FileName);
        //Save images into SlideImages folder
        fileuploadimages.SaveAs(Server.MapPath("Pictures/" + filename));
        //Open the database connection

        //Query to insert images name and Description into database
        SqlCommand cmd = new SqlCommand("Insert into Images(ImagePath,Album_ID,ImageDesc) values(@ImagePath,@Album_ID,@ImageDesc)", conn);
        //Passing parameters to query
        cmd.Parameters.AddWithValue("@ImagePath", filename);
        cmd.Parameters.AddWithValue("@Album_ID", AlbmID);
        cmd.Parameters.AddWithValue("@ImageDesc", txtDescription.Text);
        cmd.ExecuteNonQuery();
        //Close dbconnection
        conn.Close();
        txtDescription.Text = "";
        BindDataList();
    }
}

6
你有一个SQL注入漏洞,需要使用参数来修复。 - SLaks
我知道。这是问题的原因吗? - user3229034
4
看起来你已经知道如何使用参数(第二个查询)。为什么不使用它(在第一个查询中)?那正是你解决这个问题的方法。目前你的第一个查询正在将用户输入作为代码执行,这基本上允许任何用户在你的数据库中执行他们想要的任何代码。 - David
@David 让我试试。 - user3229034
@user3229034 是的,这样做可以解决问题,因为将参数值设置为您的“albumName”将确保字符串被转义。我真诚地希望这段代码不在您的页面代码后台。 - 3Dave
2个回答

4
SqlCommand command = new SqlCommand("select ID from Album where AlbumName = @name", conn);
command.Parameters.Add(new SqlParameter("@name", albumName));
.
.
.

此外,您应该将连接、命令和读取器对象包装在 using() {} 结构中,以及时处理资源的释放。
当将动态内容放入 SQL 字符串中时,请使用此类参数以避免出现错误,以及 SQL 注入攻击和其他漏洞。
此外,您可以快速替换参数以执行多个查询,而无需重建字符串。

1
.Replace("'",@"\'") 

这将转义您的单引号/撇号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接