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