1

データ型Stringを使用して、HTML を含む を MySQL データベースに保存しようとしています。Longtextしかし、常に「SQL構文にエラーがあります」と表示されます。通常の保存を試みましたが、String動作します。

更新

これはクエリです:

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

私はJavaを使用しています。

4

4 に答える 4

9

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 を適切な方法で実行する方法についての洞察を得るのに役立つ場合があります。お役に立てれば。

于 2010-04-14T22:55:21.013 に答える
2

mysql_real_escape_string保存したい文字列に対して関数を使用してみてください。これが最も簡単な方法です。

于 2010-04-14T22:47:47.477 に答える
1

データベースに挿入する前に文字列をエスケープする必要があります。

于 2010-04-14T22:46:22.280 に答える
1

クエリを見ずに言うのは難しい。投稿できますか?

エスケープが必要な html 文字列の一部があると思いますが、それを見逃したのではないでしょうか?

于 2010-04-14T22:46:53.123 に答える