C# 如何在数据库中保存HTML内容

C# 如何在数据库中保存HTML内容,c#,asp.net,sql-server,asp.net-mvc,razor,C#,Asp.net,Sql Server,Asp.net Mvc,Razor,我的页面上有文本区域。在那个区域,我必须添加一些HTML代码并将其保存到数据库中。它适用于简单的html,但当我从“wikipedia”中选择一些文本,然后粘贴它,并在需要执行SQL查询时尝试保存时,出现异常,出现以下错误: Incorrect syntax near 's'. The identifier that starts with '. Interestingly, old maps show the name as&nbsp;<em>Krakow</em&g

我的页面上有文本区域。在那个区域,我必须添加一些HTML代码并将其保存到数据库中。它适用于简单的html,但当我从“wikipedia”中选择一些文本,然后粘贴它,并在需要执行SQL查询时尝试保存时,出现异常,出现以下错误:

Incorrect syntax near 's'.
The identifier that starts with '. Interestingly, old maps show the name as&nbsp;<em>Krakow</em>.</p>
<p>Kragujevac experienced a lot of historical turbulence, ' is too long. Maximum length is 128.
The identifier that starts with '>Paleolithic</a>&nbsp;era. Kragujevac was first mentioned in the medieval period as related to the public square built in a sett' is too long. Maximum length is 128.
The label 'http' has already been declared. Label names must be unique within a query batch or stored procedure.
The label 'http' has already been declared. Label names must be unique within a query batch or stored procedure.
Unclosed quotation mark after the character string '>Belgrade Pashaluk</a>.</p>'
这是保存到数据库的代码:

string sql = @"insert into tbl_articles 
                               (Text) values 
                               ("'" + article.ArticleText"'"+")";

                SqlCommand cmd = new SqlCommand(sql, conn);

                cmd.ExecuteNonQuery();

这是一个经典的例子,它向一个新的应用程序开放您的系统

您需要转义
'
字符,因为如果Html包含
'
字符,它将在执行SQL语句时中断SQL语句


编辑:使用达林解决方案解决问题。

哇,不,不,不。您的代码容易受到SQL注入的攻击,如果不使用参数化查询,将会发生非常糟糕的事情。因此,请使用参数化查询

using (var conn = new SqlConnection("some conn string"))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "insert into tbl_articles (Text) values (@Text)";
    cmd.Parameters.AddWithValue("@Text", article.ArticleText);
    cmd.ExecuteNonQuery();
}
每当您在构建SQL查询时使用
+
运算符连接字符串时,您都在做非常危险和错误的事情。

尝试:

string sql = @"insert into tbl_articles 
                               (Text) values 
                               (@articleText)";

                SqlCommand cmd = new SqlCommand(sql, conn);
                cmd.Parameters.AddWithValue("@articleText",
                Server.HtmlEncode(article.articleText));

                cmd.ExecuteNonQuery();

尝试以这种方式保存:

string sqlQuery = "INSERT INTO tbl_articles (Text) VALUES (@text)";
SqlCommand cmd = new SqlCommand(sqlQuery, db.Connection);
cmd.Parameters.Add("@text", article.ArticleText);
cmd.ExecuteNonQuery();

这应该参数化:

    public void foo(string connectionString, string textToSave)
    {
        var cmdString = "insert into tbl_articles (text) values (@text)";
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            using (SqlCommand comm = new SqlCommand(cmdString, conn))
            {
                comm.Parameters.Add("@text", SqlDbType.VarChar, -1).Value = textToSave;
                comm.ExecuteNonQuery();
            }
        }
    }

(这是一个笼统的想法,它并没有完全按照书面形式发挥作用。)

问题在于您的文章文本包含需要转义的单引号(也称撇号)。为什么要在这里构建动态SQL而不是使用参数化查询?创建一个与字符串中的内容完全相同的过程,并将HTML作为参数传递。。。就像魔法一样。你需要做的不仅仅是保护你的系统。撇号只是冰山一角。我强调了造成当前错误的原因,但正如您所说,解决方案不仅仅是处理
为什么要将其HtmlEncode写入数据库?我想你会想出来,而不是进去。你需要在它出来的时候解码…所以你想对进入数据库的文本进行HTMLEncode,然后对从数据库出来的文本进行HTMLEncode?误引一部著名电影,“我不认为这意味着你认为它意味着什么。”你只需要转义文本,这样它就可以正确安全地保存到数据库中,而不是HtmlEncode;同样,由于它已经是HTML,您可能不想在从数据库中提取它时对其进行解码。@JeremyHolovacs,确切地说,这就是我使用语句将它们放入
的原因。谢谢。我总是使用参数化查询,但我正在构建快速测试,并使用这种方法来构建查询。所以我以为问题出在别的地方。非常感谢:)这里还有一件事,参数化查询可以从SQL注入中保存,但不能从XSS中保存,所以请使用AntiXSS库,并在保存输入之前对其进行清理。我是认真的,做吧!:)嘿@DarinDimitrov我们能在存储过程中遵循相同的过程吗?
    public void foo(string connectionString, string textToSave)
    {
        var cmdString = "insert into tbl_articles (text) values (@text)";
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            using (SqlCommand comm = new SqlCommand(cmdString, conn))
            {
                comm.Parameters.Add("@text", SqlDbType.VarChar, -1).Value = textToSave;
                comm.ExecuteNonQuery();
            }
        }
    }