【问题标题】:How to save HTML content in database如何在数据库中保存 HTML 内容
【发布时间】:2011-10-13 19:20:11
【问题描述】:

我的页面上有文本区域。在那个区域,我必须添加一些 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>'

我正在使用 asp mvc 和 razor 引擎。我不知道也许我需要以某种方式输入 html。我还为 ArticleText 属性添加了这个:

[AllowHtml]        
        public string ArticleText { get; set; }

这是保存到数据库的代码:

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

                SqlCommand cmd = new SqlCommand(sql, conn);

                cmd.ExecuteNonQuery();

【问题讨论】:

  • 问题是您的 ArticleText 包含需要转义的单引号(又名撇号)。为什么要在这里构建动态 SQL 而不是使用参数化查询?
  • 制作一个 proc,它完全符合您在字符串中的操作,并将 HTML 作为参数传递......就像魔术一样。

标签: c# asp.net sql-server asp.net-mvc razor


【解决方案1】:

哇,不,不,不。您的代码容易受到 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 查询时使用 + 运算符连接字符串时,您都在做一些极其危险和错误的事情。

【讨论】:

  • @JeremyHolovacs,确切地说,这就是我将它们放在using 声明中的原因。
  • 谢谢。我总是使用参数化查询,但我正在构建快速测试并使用这种方式来构建查询。所以我认为问题出在其他地方。非常感谢:)
  • 这里还有一件事,参数化查询可以使您免于 SQL 注入,但不能免于 XSS,因此请使用 AntiXSS 库,并在保存输入之前对其进行清理。我是认真的,做吧! :)
  • 嘿@DarinDimitrov 我们可以在存储过程中遵循相同的过程吗?
【解决方案2】:

尝试以这种方式保存:

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

【讨论】:

    【解决方案3】:

    试试:

    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();
    

    【讨论】:

    • 你为什么要将它的 HtmlEncode 编码到数据库中?我想你会想出来,而不是进去。
    • 出门需要解码。
    • ...所以你想HTMLEncode进入数据库的文本,然后HtmlDecode来自数据库的文本?错误地引用一部著名的电影,“我不认为这意味着你认为它意味着什么。”您只需要对文本进行转义,以便将其正确安全地保存到数据库中,而不是对其进行 HtmlEncode;同样,由于它已经是 HTML,您可能不想在从数据库中提取它时对其进行解码。
    【解决方案4】:

    这是将系统打开到Sql injection attack 的经典示例。

    您需要对' 字符进行转义,因为如果Html 包含' 字符,则会在执行时破坏SQL 语句。

    编辑:使用 Darins 解决方案来解决问题。

    【讨论】:

    • 您需要做的不仅仅是保护您的系统
    • 附议。撇号只是冰山一角。
    • 我在某种程度上强调了手头错误的真正原因,但是正如您所说,解决方案不仅仅是照顾'
    【解决方案5】:

    这应该被参数化:

        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();
                }
            }
        }
    

    (这是一般的想法,它并不像写的那样完全起作用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2016-03-31
      • 2021-07-30
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多