Strängar i en SQL-fråga är -vanligen- omgivna av enkla citattecken. T.ex.
INSERT INTO tbl (html) VALUES ('html');
Men om själva HTML-strängen också innehåller ett enskilt citat, skulle det bryta SQL-frågan:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Du ser det redan i syntaxmarkören, SQL-värdet slutar precis före foo
och SQL-tolken kan inte förstå vad som kommer därefter. SQL-syntaxfel!
Men det är inte det enda, det ger också dörrarna vida öppen för SQL-injektioner (exempel här ).
Du måste verkligen rensa SQL under konstruera SQL-frågan. Hur man gör det beror på vilket programmeringsspråk du använder för att köra SQL. Om det till exempel är PHP, behöver du mysql_real_escape_string() :
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Ett alternativ i PHP är att använda förberedda uttalanden , kommer den att hantera SQL-escape åt dig.
Om du använder Java (JDBC
), då behöver du PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Uppdatera :det visar sig att du faktiskt använder Java. Du måste ändra koden enligt följande:
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();
Glöm inte att hantera JDBC-resurser på rätt sätt. Du kan hitta denna artikel användbar för att få lite insikter om hur man gör grundläggande JDBC-grejer på rätt sätt. Hoppas detta hjälper.