Strings in een SQL-query worden -meestal- omgeven door enkele aanhalingstekens. Bijv.
INSERT INTO tbl (html) VALUES ('html');
Maar als de HTML-string zelf ook een enkel aanhalingsteken bevat, zou het de SQL-query breken:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Je ziet het al in de syntax highlighter, de SQL-waarde eindigt vlak voor foo
en de SQL-interpreter kan niet begrijpen wat daarna komt. SQL-syntaxisfout!
Maar dat is niet het enige, het zet de deuren ook wijd open voor SQL-injecties (voorbeelden hier ).
Je zult de SQL echt moeten opschonen tijdens het construeren van de SQL-query. Hoe u dit moet doen, hangt af van de programmeertaal die u gebruikt om de SQL uit te voeren. Als het bijvoorbeeld PHP is, heb je mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Een alternatief in PHP is het gebruik van voorbereide verklaringen , het zal SQL-escaping voor u afhandelen.
Als je Java gebruikt (JDBC
), dan heb je PreparedStatement
nodig
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Bijwerken :het blijkt dat je inderdaad Java gebruikt. U moet de code als volgt wijzigen:
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();
Vergeet niet goed om te gaan met JDBC-resources. Mogelijk vindt u dit artikel handig om wat inzicht te krijgen hoe je basis JDBC-dingen op de juiste manier kunt doen. Ik hoop dat dit helpt.