Các chuỗi trong một truy vấn SQL - thường được bao quanh bởi các dấu ngoặc kép. Ví dụ:
INSERT INTO tbl (html) VALUES ('html');
Nhưng nếu bản thân chuỗi HTML cũng chứa một trích dẫn đơn, nó sẽ phá vỡ truy vấn SQL:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
Bạn đã thấy nó trong công cụ đánh dấu cú pháp, giá trị SQL kết thúc ngay trước foo
và trình thông dịch SQL không thể hiểu điều gì xảy ra sau đó. Lỗi cú pháp SQL!
Nhưng đó không phải là duy nhất, nó còn đặt ra những cánh cửa rộng rãi mở cho Chèn SQL ( ví dụ ở đây ).
Bạn thực sự cần phải làm sạch SQL trong suốt xây dựng truy vấn SQL. Cách thực hiện tùy thuộc vào ngôn ngữ lập trình bạn đang sử dụng để thực thi SQL. Nếu đó là PHP chẳng hạn, bạn sẽ cần mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
Một giải pháp thay thế trong PHP là sử dụng câu lệnh chuẩn bị sẵn , nó sẽ xử lý việc thoát SQL cho bạn.
Nếu bạn đang sử dụng Java ( JDBC
), thì bạn cần có PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
Cập nhật :hóa ra bạn đang thực sự sử dụng Java. Bạn sẽ cần thay đổi mã như sau:
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();
Đừng quên xử lý tài nguyên JDBC đúng cách. Bạn có thể tìm thấy bài viết này hữu ích để có được một số thông tin chi tiết về cách thực hiện nội dung JDBC cơ bản theo cách thích hợp. Hy vọng điều này sẽ hữu ích.