Las cadenas en una consulta SQL están, por lo general, rodeadas de comillas simples. Por ejemplo
INSERT INTO tbl (html) VALUES ('html');
Pero si la cadena HTML también contiene una comilla simple, rompería la consulta SQL:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Ya lo ve en el resaltador de sintaxis, el valor SQL termina justo antes de foo
y el intérprete de SQL no puede entender lo que viene después. ¡Error de sintaxis SQL!
Pero eso no es lo único, también pone las puertas de par en par abierto para inyecciones SQL (ejemplos aquí ).
Realmente necesitará desinfectar el SQL durante construcción de la consulta SQL. Cómo hacerlo depende del lenguaje de programación que esté utilizando para ejecutar el SQL. Si es, por ejemplo, PHP, necesitará mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Una alternativa en PHP es usar declaraciones preparadas , manejará el escape de SQL por usted.
Si usa Java (JDBC
), entonces necesita PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Actualizar :resulta que en realidad estás usando Java. Deberá cambiar el código de la siguiente manera:
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();
No olvide manejar los recursos JDBC correctamente. Puede encontrar este artículo útil para obtener algunas ideas sobre cómo hacer cosas básicas de JDBC de la manera correcta. Espero que esto ayude.