Как сохранить HTML-контент в базе данных - PullRequest
3 голосов
/ 13 октября 2011

У меня есть текстовая область на моей странице. В этой области я должен добавить HTML-код и сохранить его в базе данных. И это работает для простого HTML, но когда я выбираю какой-то текст из «Википедии», например, вставляю его и пытаюсь сохранить, когда нужно выполнить 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 и бритву. Я не знаю, может быть, мне нужно каким-то образом получить 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();

Ответы [ 5 ]

30 голосов
/ 13 октября 2011

Ух ты, НЕТ, НЕТ, НЕТ . Ваш код уязвим для внедрения 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-запроса, вы делаете что-то чрезвычайно опасное и неправильное.

2 голосов
/ 13 октября 2011

Попробуйте сохранить таким образом:

string sqlQuery = "INSERT INTO tbl_articles (Text) VALUES (@text)";
SqlCommand cmd = new SqlCommand(sqlQuery, db.Connection);
cmd.Parameters.Add("@text", article.ArticleText);
cmd.ExecuteNonQuery();
1 голос
/ 13 октября 2011

это должно быть параметризовано:

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

(это общая идея, она не полностью функциональна, как написано).

1 голос
/ 13 октября 2011

Попробуйте:

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();
1 голос
/ 13 октября 2011

Это классический пример открытия вашей системы для атаки Sql .

Вам необходимо экранировать символ ', потому что, если HTML содержит символ ', он будет нарушать оператор SQL при его выполнении.

РЕДАКТИРОВАТЬ: Используйте решение Darins для решения проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...