Strenge i en SQL-forespørgsel er -normalt- omgivet af enkelte anførselstegn. F.eks.
INSERT INTO tbl (html) VALUES ('html');
Men hvis selve HTML-strengen også indeholder et enkelt anførselstegn, ville det bryde SQL-forespørgslen:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Du ser det allerede i syntaksfremhævningen, SQL-værdien slutter lige før foo
og SQL-fortolkeren kan ikke forstå, hvad der kommer derefter. SQL-syntaksfejl!
Men det er ikke det eneste, det sætter også dørene vide åben for SQL-injektioner (eksempler her ).
Du bliver virkelig nødt til at rense SQL'en i løbet af opbygning af SQL-forespørgslen. Hvordan man gør det afhænger af det programmeringssprog, du bruger til at udføre SQL. Hvis det for eksempel er PHP, skal du bruge mysql_real_escape_string() :
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Et alternativ i PHP er at bruge forberedte erklæringer , vil den håndtere SQL-escape for dig.
Hvis du bruger Java (JDBC
), så har du brug for PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Opdater :det viser sig, at du rent faktisk bruger Java. Du skal ændre koden som følger:
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();
Glem ikke at håndtere JDBC-ressourcer korrekt. Du kan muligvis finde denne artikel nyttigt at få lidt indsigt i, hvordan man gør grundlæggende JDBC-ting på den rigtige måde. Håber dette hjælper.