Łańcuchy w zapytaniu SQL są -zazwyczaj- ujęte w pojedyncze cudzysłowy. Np.
INSERT INTO tbl (html) VALUES ('html');
Ale jeśli sam ciąg HTML zawiera również pojedynczy cudzysłów, spowoduje to przerwanie zapytania SQL:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Widzisz to już w podświetlaczu składni, wartość SQL kończy się tuż przed foo
a interpreter SQL nie może zrozumieć, co nastąpi później. Błąd składni SQL!
Ale to nie jedyne, to także sprawia, że drzwi są szerokie otwarte dla wstrzyknięć SQL (przykłady tutaj ).
Naprawdę będziesz musiał oczyścić SQL podczas konstruowanie zapytania SQL. Jak to zrobić, zależy od języka programowania, którego używasz do wykonywania SQL. Jeśli jest to na przykład PHP, będziesz potrzebować mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Alternatywą w PHP jest użycie przygotowanych instrukcji , obsłuży on dla Ciebie escaping SQL.
Jeśli używasz Javy (JDBC
), wtedy potrzebujesz PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Aktualizacja :okazuje się, że faktycznie używasz Javy. Musisz zmienić kod w następujący sposób:
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();
Nie zapomnij o prawidłowej obsłudze zasobów JDBC. Możesz znaleźć ten artykuł przydatne, aby uzyskać wgląd w to, jak prawidłowo wykonywać podstawowe czynności JDBC. Mam nadzieję, że to pomoże.