Chống Lỗi SQL_Injection [Bảo Mật] - Cùng Học Web 123
Có thể bạn quan tâm
Trang
- Trang chủ
Thứ Năm, 18 tháng 7, 2013
Chống lỗi SQL_Injection [Bảo mật]
Cách 1: Ẩn thông báo lỗi MySQL Cách này được sử dụng để tắt các thông báo lỗi khi các tác vụ liên quan đến việc truy vấn cơ sở dữ liệu gặp sự cố. Nó không có tác dụng ngăn chặn việc tấn công. Trong PHP: 1. Thêm @ trước các hàm dễ gây lỗi Ví dụ: while( $row = @mysql_fetch_array($tin) ){} 2. Thêm error_reporting(0) ở đầu đoạn code PHP Nếu muốn hiển thị lỗi thì thay đổi 0 thành -1 Cách 2: Loại bỏ dấu nháy đơn ('), nháy kép ("), dấu (\) trong sql injection Đây là cách ngăn chặn SQL_Injection hiệu quả mà đơn giản. Trong PHP: Ví dụ Ta sẽ lấy tham số id trên thanh địa chỉ làm tham số truy vấn Url: http://localhost/baomatweb_sql/vidu6.php?id=1 if( isset($_GET['id']) ) { $id=$_GET['id']; }else{ $id=1; } $select = "SELECT * FROM tin WHERE idTin = $id " $qr = mysql_query($select) Nếu bây giờ Hacker thêm dấu (') vào sau số 1: http://localhost/baomatweb_sql/vidu6.php?id=1' Thì sẽ gặp thông báo lỗi: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\baomatweb_sql\vidu6.php on line 62 Với câu thông báo lỗi này thì chúng ta bị SQL Injection Phòng tránh: 1. Khi đưa tham số vào câu truy vấn, luôn luôn để tham số trong dấu nháy đơn. Có nháy đơn: $select = "SELECT * FROM tin WHERE idTin = '$id' " Không nháy đơn: $select = "SELECT * FROM tin WHERE idTin = $id " Với câu truy vấn không nháy đơn, sẽ tiềm ẩn lỗi SQL Injection. Nếu bây giờ Hacker thêm vào câu truy vấn một đoạn như sau: id=1 AND 1=2 UNION SELECT 1,2,3,4-- thì câu truy vấn sẽ thành: Có nháy đơn: $select = "SELECT * FROM tin WHERE idTin = '1 AND 1=2 UNION SELECT 1,2,3,4--' " Không nháy đơn: $select = "SELECT * FROM tin WHERE idTin = 1 AND 1=2 UNION SELECT 1,2,3,4-- " Rõ ràng với câu truy vấn có nháy đơn, thì nguyên một đoạn đó trở thành tham số của idTin. Do vậy bước đầu tiên đã ngăn được 1 phần của việc tấn công. Còn với truy vấn không có nháy đơn, đoạn chèn thêm sẽ hợp Logic của câu truy vấn và Hacker sẽ lấy được thông tin cần thiết. 2. Escape các dấu nháy đơn, nháy kép, dầu (\). Trường hợp các tham số trong câu truy vấn có dấu nháy đơn như trên thì Hacker vẫn có thể tấn công được bằng cách thêm đoạn như sau: id=1' AND 1=2 UNION SELECT 1,2,3,4-- Như vậy câu truy vấn sẽ thành: $select = "SELECT * FROM tin WHERE idTin = '1' AND 1=2 UNION SELECT 1,2,3,4--' " Dấu nháy đơn Hacker thêm vào có tác dụng đóng dấu nháy đơn phía trước, dấu (--) phía cuối có tác dụng biến các câu truy vấn sau nó thành chú thích. Do vậy mà câu truy vấn trên trở thành hợp lệ. Ta để ý thấy rằng Hacker nhất định sẽ phải thêm vào dấu (') để biến 1 thành tham số, còn đoạn phía sau trở thành một mệnh đề Logic. Từ suy nghĩ đó, ta sẽ vô hiệu hóa dấu (') mà Hacker thêm vào để không cho đoạn đó trở thành một mệnh đề Logic. Để vô hiêu hóa dấu (') ta chỉ việc thêm dấu (\) trước dấu nháy đơn đó. $select = "SELECT * FROM tin WHERE idTin = '1\' AND 1=2 UNION SELECT 1,2,3,4--' " Trong PHP có nhiều hàm giúp ta thêm dấu (\) trước dấu nháy đơn trước khi đưa vào truy vấn như: addslaches, mysql_real_escape_string. Ngoài ra còn có chế độ magic_quotes_gpc() giúp ta escape khi $_GET[] hay $_POST[] dữ liệu. Tuy nhiên để sử dụng hợp lý tất cả các hàm trên ta nên xây dựng một function sql_escape kết hợp tất cả lại function sql_escape($value) { if(get_magic_quotes_gpc()) { $value=stripcslashes($value); } if(function_exists("mysql_real_escape_string")) { $value=mysql_real_escape_string($value); }else{ $value=addslashes($value); } return $value; /** - Phải dùng câu truy vấn giống thế này mới phát huy hàm này $qr2="SELECT * FROM tin WHERE idLT= '".$id."'"; Hoặc $qr2="SELECT * FROM tin WHERE idLT= '$id' "; - Tuyệt đối không sử dụng câu truy vấn như thế này $qr2="SELECT * FROM tin WHERE idLT= $id "; Tóm lại; tất cả các tham số khi truy vấn phải để trong nháy đơn. **/ } Sử dụng hàm sql_escape: trước khi sử dụng ta require hàm đó vào trang ta đang muốn dùng require "sql_escape.php"; if( isset($_GET['id']) ) { $id=sql_escape($_GET['id']); }else{ $id=1; } $select = "SELECT * FROM tin WHERE idTin = '$id' " $qr = mysql_query($select) Cách 3: Ép kiểu dữ liệu Cách này chỉ có tác dụng khi dữ liệu lấy về là số, ví dụ như id=123 Trong PHP| Cú pháp: settype($value,"int"); |
| Cú pháp: id = parseInt(id) |
6 nhận xét:
Unknownlúc 09:24 10 tháng 4, 2014OK hayCảm ơn bạn nhiều nhé
Trả lờiXóaTrả lời- Trả lời
Unknownlúc 20:42 10 tháng 7, 2014Hay quá.cảm ơn bạn nhiều
Trả lờiXóaTrả lời- Trả lời
Unknownlúc 23:41 23 tháng 3, 2015Rất hay. Cảm ơn bạn nhiều.
Trả lờiXóaTrả lời- Trả lời
z3p3rlúc 21:46 5 tháng 10, 2015Hay <3
Trả lờiXóaTrả lời- Trả lời
Unknownlúc 15:08 17 tháng 5, 2016cho mình hỏi trên mssql không có error base có đúng không
Trả lờiXóaTrả lời- Trả lời
Unknownlúc 16:44 16 tháng 6, 2016// Chứa từ khóa nguy hiểm thì chuyển về trang nào đó header("Location:index.php")thì để ở file nào v admin
Trả lờiXóaTrả lời- Trả lời
Nhãn
- Bảo Mật (10)
- C# (1)
- Cảnh Giác (2)
- CMS (6)
- Dạy Con Làm Giàu (4)
- Đồ Họa (5)
- Giá trị cuộc sống (3)
- HTML & CSS (9)
- HTML5&CSS3 (3)
- JavaScript (1)
- JQuery (1)
- Kỹ năng cuộc sống (2)
- Kỹ Năng Mềm (5)
- Office (7)
- PHP & MySQL (11)
- Quản trị nhân sự (1)
- SEO (4)
- Web Server (3)
- Zend Framework (25)
Lưu trữ Blog
- ► 2014 (7)
- ► tháng 9 (2)
- ► tháng 6 (1)
- ► tháng 5 (1)
- ► tháng 4 (1)
- ► tháng 2 (2)
Từ khóa » Thêm Dấu Nháy đơn Trong Sql
-
Cách Thêm Dấu Nháy đơn (') Vào Câu Query Trong Sql
-
Làm Cách Nào để Chèn Một Giá Trị Có Dấu Nháy đơn (trích Dẫn đơn)?
-
Oracle SQL Thêm Dấu Nháy đơn - HelpEx
-
Cách Chèn Văn Bản Có '(dấu Nháy đơn) Vào Bảng SQL
-
Chèn, Insert Ký Tự Dấu Nháy ' Vào Trong Chuỗi MySQL Như Thế Nào
-
Chèn Dấu Nháy đơn ẩn Vào Trước Dữ Liệu (add An Apostrophe Before ...
-
WHERE - Mệnh đề - SQL & Database
-
Làm Cách Nào để Thay Thế Một Trích Dẫn Duy Nhất Trong PostgreSQL?
-
Mẹo Làm Việc Với Truy Vấn SQL - Microsoft Support
-
Insert Sql Khi Có Dấu ' | Giải Pháp Excel
-
LITERAL (Hằng) Trong SQL Server
-
So Sánh Access SQL Với SQL Server TSQL - Microsoft Support
-
Làm Cách Nào để Tìm Kiếm Tên Với Dấu Nháy đơn Trong SQL Server?
-
ERX Việt Nam - Trung Tâm đào Tạo Thực Chiến Quản Trị Doanh Nghiệp ...
Unknown