Tiêm SQL ( SQLi )
Xin chào,
Cảm ơn bạn đã dành thời gian đọc bài viết — up! Tôi rât cảm kich!
Nội dung hôm nay sẽ tìm hiểu về 'SQL Injection'
Nội dung hoàn toàn dựa trên kinh nghiệm & kiến thức cá nhân của tôi, sự tương tác với những người tuyệt vời trong lĩnh vực Phát triển phần mềm và Sec ứng dụng, đồng thời đọc rất nhiều và mã hóa an toàn.
Trong bài viết này, tôi sẽ cố gắng đơn giản hóa nội dung ở mức cơ bản. Tôi chắc chắn rằng độc giả sẽ có những suy nghĩ và nhận xét của riêng họ, và tôi hoan nghênh mọi phản hồi và thảo luận.
Lượt xem / Nhận xét / Ý kiến là của riêng tôi chứ không phải của chủ nhân trước đây / hiện tại của tôi.
Hãy cùng nhau tìm hiểu nhé!
SQL injection là gì?
Một kiểu tấn công bảo mật ứng dụng trong đó tác nhân độc hại chèn mã SQL độc hại vào trường nhập dễ bị tấn công để truy cập và thao tác dữ liệu trong cơ sở dữ liệu. SQLi cho phép kẻ tấn công xem/sửa đổi/xóa dữ liệu trong cơ sở dữ liệu.
Làm cách nào để sửa lỗi SQLi?
Không nối các truy vấn SQL và giá trị đầu vào.
Luôn thực hiện xác thực đầu vào ( ý kiến cá nhân của tôi, nó thực sự ngăn chặn rất nhiều chữ ký độc hại ) và sau đó làm theo một trong các chiến lược bên dưới để sửa lỗi SQLi -
- Truy vấn được tham số hóa: Truyền các giá trị đầu vào dưới dạng tham số cho các câu lệnh sql. Điều này đạt được bằng cách sử dụng các truy vấn được tham số hóa. Điều này ngăn các đầu vào độc hại được thực thi dưới dạng mã SQL.
- Các thủ tục được lưu trữ: Sẽ tốt hơn nhiều nếu không có các truy vấn sql SQL trong mã và chuyển chúng sang DB thông qua các thủ tục được lưu trữ.
Truy vấn được tham số hóa:
Trong mẫu mã bên dưới, tên và mật khẩu được chuyển vào dưới dạng tham số cho câu lệnh sql thông qua 'setString()' . Nó là một phương thức của PreparedStatement.
....
// simple basic example
// assume name and pass are obtained from some input
// conn is the connection
String sqlStatement = "SELECT * FROM userdetails WHERE name = ? AND pass = ?";
PreparedStatement stmt = conn.prepareStatement(sqlStatement);
stmt.setString(1, name);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
// carry on with your logic
....
Trong mẫu mã bên dưới, 'tên' và 'vị trí' được chuyển vào dưới dạng tham số cho thủ tục được lưu trữ 'userDetails' thông qua 'setString()'. Nó là một phương thức của CallableStatement. Đầu ra được nhận thông qua tham số 'đầu ra' sử dụng 'registerOutParameter'. Nó là một phương thức khác của CallableStatement.
....
// simple basic example
// Assume name and location are obtained from some input
// conn is the connection
CallableStatement stmt = conn.prepareCall("{ call userdetails(?,?,?) }");
stmt.setString(1, name);
stmt.setString(2, location);
stmt.registerOutParameter(3, java.sql.Types.INTEGER);
stmt.execute();
int output = stmt.getInt(3);
// carry on with your logic...
....
Nhận xét / Phản hồi luôn được hoan nghênh vì tôi luôn tìm cách cải thiện nội dung và ngày càng tốt hơn.
Ghi nguồn: Kinh nghiệm của riêng tôi trong Sec ứng dụng, diễn giải nội dung từ nhiều trang web trực tuyến, các công cụ Open AI, DALL-E, Developer và NLP.
Cảm ơn!
Thêm tôi trên LinkedIn

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































