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 内容。希望这可以帮助。