Tìm hiểu SQL Injection và cách phòng chống
1. SQL Injection là gì? 2. Ví dụ khai thác SQL Injection 3. Phòng chống tấn công SQL Injection 4. Kết luận 1. SQL Injection là gì? ...

1. SQL Injection là gì? 2. Ví dụ khai thác SQL Injection 3. Phòng chống tấn công SQL Injection 4. Kết luận
1. SQL Injection là gì?
2. Khai thác SQL Injection
if(isset($_POST['username']) && isset($_POST['password'])){ $sql = "SELECT * FROM tbl_user WHERE username='". $_POST['username'] . "' AND password = '" .$_POST['password'] ."'"; }Đoạn code trên hoạt động bình thường, không vấn đề gì xảy ra cho đến khi hacker đăng nhập với trường User là ' OR '1' = '1 và Password là ' OR '1' = '1
Và câu truy vấn cơ sở dữ liệu kiểm tra đăng nhập trở thành:
SELECT * FROM tbl_user WHERE username = '' OR '1' = '1' and password = '' OR '1' = '1'BUZZ, hacker đăng nhập thành công mà không cần có tài khoản đăng nhập. Nguyên nhân do đoạn code trên không lọc dữ liệu khi hacker nhập vào.
3. Phòng chống tấn công SQL Injection
Cách khắc phục khá đơn giản, nguyên tắc là kiểm soát chặt chẽ dữ liệu mà người dùng nhập vào.
Ví dụ với biến id tại đường dẫn sau: http://domain.com?id=5.
Có những cách sau:
- Ràng buộc kiểu dữ liệu
$id = $_GET['id']; //Ràng buộc kiểu dữ liệu số $id = isset($_GET['id'])?(string)(int)$_GET['id']:false;
- Loại bỏ các ký tự độc hại
$id = isset($_GET['id'])?(string)(int)$_GET['id']:false; $id = str_replace('/[^0-9]/', '', $id); $sql= 'SELECT * FROM tbl_user WHERE id= ' . mysqli_real_escape_string($id);
- Sử dụng PDO
if (isset($_GET['id'])){ $id = $_GET['id']; if ( is_numeric($id) == true){ try{ $dbh = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $q = "SELECT username FROM users WHERE id = :id"; // Prepare the SQL query $sth = $dbh->prepare($q); // Bind parameters to statement variables $sth->bindParam(':id', $id); // Execute statement $sth->execute(); $sth->setFetchMode(PDO::FETCH_ASSOC); $result = $sth->fetchColumn(); print( htmlentities($result) ); $dbh = null; } catch(PDOException $e){ http_response_code(500); die('Error establishing connection with database'); } } else{ http_response_code(400); die('Error processing bad or malformed request'); } }
4. Lời kết
Just a comment for testing
ReplyDeleteReply in short content
DeleteYou must test with very very long long comment. This can break your blog and design layout.
Delete
contact me on fiverr/tiennguyenvan to do a task for you.
ReplyDelete