Низовете в SQL заявка обикновено са заобиколени от единични кавички. Напр.
INSERT INTO tbl (html) VALUES ('html');
Но ако самият HTML низ съдържа и единични кавички, това ще наруши SQL заявката:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Вече го виждате в маркера на синтаксиса, SQL стойността завършва точно преди foo
и SQL интерпретаторът не може да разбере какво идва след това. Грешка в синтаксиса на SQL!
Но това не е единственото, то също така поставя вратите широко отворен за SQL инжекции (примери тук ).
Наистина ще трябва да дезинфекцирате SQL по време конструиране на SQL заявка. Как да го направите зависи от езика за програмиране, който използвате за изпълнение на SQL. Ако е например PHP, ще ви трябва mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Алтернатива в PHP е използването на подготвени оператори , той ще се справи с SQL екранирането вместо вас.
Ако използвате Java (JDBC
), тогава имате нужда от PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Актуализиране :оказва се, че всъщност използвате Java. Ще трябва да промените кода, както следва:
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();
Не забравяйте да боравите правилно с ресурсите на JDBC. Може да намерите тази статия полезно, за да получите информация как да правите основни JDBC неща по правилния начин. Надявам се това да помогне.