Le stringhe in una query SQL sono -di solito- racchiuse tra virgolette singole. Es.
INSERT INTO tbl (html) VALUES ('html');
Ma se la stessa stringa HTML contiene anche una virgoletta singola, interromperebbe la query SQL:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Lo vedi già nell'evidenziatore della sintassi, il valore SQL termina subito prima di foo
e l'interprete SQL non riesce a capire cosa viene dopo. Errore di sintassi SQL!
Ma non è l'unico, apre anche le porte larghe aperto per iniezioni SQL (esempi qui ).
Avrai davvero bisogno di disinfettare l'SQL durante costruzione della query SQL. Come farlo dipende dal linguaggio di programmazione che stai usando per eseguire l'SQL. Se è per esempio PHP, avrai bisogno di mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Un'alternativa in PHP è usare dichiarazioni preparate , gestirà l'escape di SQL per te.
Se stai usando Java (JDBC
), è necessario PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Aggiorna :si scopre che stai effettivamente usando Java. Dovrai modificare il codice come segue:
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();
Non dimenticare di gestire correttamente le risorse JDBC. Puoi trovare questo articolo utile per ottenere alcune informazioni su come eseguire le cose JDBC di base nel modo corretto. Spero che questo aiuti.