Хранить HTML в базе данных MySQL - PullRequest
0 голосов
/ 15 апреля 2010

Я пытаюсь сохранить String, содержащий HTML, в базе данных MySQL, используя тип данных Longtext Но он всегда говорит: «В вашем синтаксисе SQL есть ошибка». Я пытался сохранить нормальный String, и он работает.

Обновление :

Это запрос:

st.executeUpdate("insert into website(URL,phishing,source_code,active) values('" + URL + "','" + phishingState + "','" + sourceCode + "','" + webSiteState + "');");

Я использую Java.

Ответы [ 4 ]

8 голосов
/ 15 апреля 2010

Строки в запросе SQL обычно заключаются в одинарные кавычки. Э.Г.

INSERT INTO tbl (html) VALUES ('html');

Но если строка HTML сама содержит одинарную кавычку, это приведет к нарушению SQL-запроса:

INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');

Вы уже видите это в подсветке синтаксиса, значение SQL заканчивается прямо перед foo, и интерпретатор SQL не может понять, что произойдет после этого. Ошибка синтаксиса SQL!

Но это не единственное, оно также открывает двери в ширину для SQL-инъекций ( примеров здесь ).

Вам действительно нужно санировать SQL во время построения SQL-запроса. Как это сделать, зависит от языка программирования, который вы используете для выполнения SQL. Если это, например, PHP, вам понадобится mysql_real_escape_string():

$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";

Альтернативой в PHP является использование подготовленных операторов , он будет обрабатывать экранирование SQL для вас.

Если вы используете Java ( JDBC ), тогда вам нужно PreparedStatement:

String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);

Обновление : оказывается, что вы на самом деле используете Java. Вам нужно изменить код следующим образом:

String sql = "INSERT INTO website (URL, phishing, source_code, active) VALUES (?, ?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, URL);
preparedStatement.setString(2, phishingState);
preparedStatement.setString(3, sourceCode);
preparedStatement.setString(4, webSiteState);
preparedStatement.executeUpdate();

Не забудьте правильно обрабатывать ресурсы JDBC. эта статья может оказаться полезной, чтобы получить представление о том, как правильно выполнять базовые функции JDBC. Надеюсь, это поможет.

2 голосов
/ 15 апреля 2010

Попробуйте использовать функцию mysql_real_escape_string для строки, которую хотите сохранить. Это самый простой способ.

1 голос
/ 15 апреля 2010

Сложно сказать, не видя запроса. Вы можете опубликовать это?

Я предполагаю, что есть некоторая часть html-строки, которую нужно экранировать, что, возможно, вы пропустили?

1 голос
/ 15 апреля 2010

Вам нужно экранировать строку перед вставкой в ​​базу данных.

...