Chống Lỗi SQL_Injection [Bảo Mật] - Cùng Học Web 123

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");
if( isset($_GET['id']) ) { $id=$_GET['id']); settype($id,"int"); }else{ $id=1; } $select = "SELECT * FROM tin WHERE idTin = '$id' " $qr = mysql_query($select) Trong JQuery Thường khi truyền tham số trong JQuery ta hay truyền trong Ajax. Do vậy để đảm bảo ta cũng nên bảo mật trong JQuery.
Cú pháp: id = parseInt(id)
<script> $(document).ready(function(){ var id = 1.2; id = parseInt(id); alert(id); }); </script> Kết quả: id=1 Cách 4: Sử dụng blacklist chứa những từ khóa nguy hiểm Ta sẽ sử dụng một danh sách chứa những từ khóa nguy hiểm. Những từ trong câu truy vấn của chúng ta sẽ được so sánh với những từ khóa trong danh sách này. Nếu có từ khóa nguy hiểm nào được phát hiện thì không cho Query, ngược lại thì được truy vấn. function sql_blacklist($qr) { // Chuyển câu truy vấn thành chữ hoa $strToUpper = strtoupper($qr); $blackList=array( "UNION","INFORMATION","SCHEMA", "DELETE","INSERT","DROP","--" ); for($i=0;$i<count($blackList);$i++) { $blackKey=$blackList[$i]; // Nếu có từ khóa được phát hiện thì trả về vị trí của nó $pos=strpos($strToUpper,$blackKey); if( $pos > 0) { return true; } } return false; } Sử dụng hàm sql_blacklist: trước khi sử dụng ta require hàm đó vào trang muốn dùng require "sql_blacklist.php"; if( isset($_GET['id']) ) { $id=$_GET['id']; }else{ $id=1; } $qr2="SELECT * FROM tin WHERE idLT= '$id' "; if( sql_blacklist($qr2) == false ) { // Không chứa từ khóa nguy hiểm // Query }else{ // Chứa từ khóa nguy hiểm thì chuyển về trang nào đó header("Location:index.php"); }

6 nhận xét:

  1. Unknownlúc 09:24 10 tháng 4, 2014

    OK hayCảm ơn bạn nhiều nhé

    Trả lờiXóaTrả lời
      Trả lời
  2. Unknownlúc 20:42 10 tháng 7, 2014

    Hay quá.cảm ơn bạn nhiều

    Trả lờiXóaTrả lời
      Trả lời
  3. Unknownlúc 23:41 23 tháng 3, 2015

    Rất hay. Cảm ơn bạn nhiều.

    Trả lờiXóaTrả lời
      Trả lời
  4. z3p3rlúc 21:46 5 tháng 10, 2015

    Hay <3

    Trả lờiXóaTrả lời
      Trả lời
  5. Unknownlúc 15:08 17 tháng 5, 2016

    cho 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
  6. 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
Thêm nhận xétTải thêm... Bài đăng Mới hơn Bài đăng Cũ hơn Trang chủ Đăng ký: Đăng Nhận xét (Atom)

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

  • ▼  2013 (98)
    • ▼  tháng 7 (74)
      • Reset CSS [HTML&CSS]
      • Excel 2007 - Các hàm thông dụng [Office]
      • Tài liệu Excel [Office]
      • Bài 4: Lệnh Color Range : Chọn một dãy màu [Đồ họa]
      • Chống ăn cắp băng thông [Bảo mật]
      • Thao tác với Workbook và WorkSheet trong Excel [Of...
      • Bài 3: Công cụ Magic Wand Tool-lựa chọn vùng chọn ...
      • Tự động đánh số thứ tự cột hoặc hàng trong Excel [...
      • Định dạng dữ liệu, canh chỉnh, vẽ boder trong Exce...
      • Regular Expressions trong PHP [PHP]
      • Bài 1: Giới thiệu C# [C#]
      • Cảnh Giác Với Các Tin Tuyển Dụng Trên Internet Và ...
      • Cách làm giàu đơn giản áp dụng cho mọi người
      • DCLG Tập 1: Cha giàu cha nghèo Phần 1
      • Cách viết E-mail xin việc hiệu quả [Kỹ năng mềm]
      • Cách trỏ tên miền về máy chủ [Web Server]
      • Tên miền (Domain Name) là gì? [Web Server]
      • Hosting là gì [Web Server]
      • Bài 2: Công cụ tạo vùng chọn Lasso Tool [Photoshop]
      • Bài 1: Mở một file trong Photoshop [Photoshop CS6]
      • Excel, sử dụng tổ hợp phím tắt để di chuyển [Office]
      • Giới thiệu Excel Phần I [Office]
      • Tấn công XSS và cách phòng chống [Bảo mật]
      • Kĩ thuật tấn công CROSS-SITE SCRIPTING (XSS) [Bảo ...
      • Các trang web về bảo mật [Bảo mật]
      • Tấn công SQL Injection [Bảo mật]
      • Chống lỗi SQL_Injection [Bảo mật]
      • Ẩn thông báo lỗi MySQL [Bảo mật]
      • SQL Injection Phần 2 [Bảo Mật]
      • SQL Injection Phần 1 [Bảo Mật]
      • Tối ưu hóa thẻ Meta Description [SEO]
      • 10 lời khuyên giúp tối ưu thẻ title [SEO]
      • Cài đặt WordPress [CMS]
      • Các lệnh cơ bản trong JavaScript [JavaScript]
      • Lấy dữ liệu từ trang HTML - HTML DOM [PHP]
      • Chức năng download với PHP thuần [PHP]
      • Hàm set_time_limit trong PHP [PHP]
      • Sử dụng câu truy vấn tìm kiếm [PHP]
      • Sử dụng tiếp đầu ngữ trước tên các bảng trong data...
      • Lưu ý về magic_quotes_gpc, hàm addslashes, hàm mys...
      • Session và Cookie trong PHP [PHP]
      • Xử lý giá trị trong Form PHP [PHP]
      • Tùy chọn magic_quotes_gpc trong PHP [PHP]
      • Smooth Page Scroll to Top with jQuery [JQuery]
      • Bảng mã màu cho Web (Web color) [Css]
      • Css-vấn đề chồng chéo và thứ tự ưu tiên [Css]
      • CSS là gì? [Css]
      • Ngôn ngữ HTML (Phần 2) [HTML]
      • Ngôn ngữ HTML (Phần 1) [HTML]
      • Disable layout khi sử dụng Ajax [Zend Framework]
      • Nạp một file khác trong View [Zend Framework]
      • Không cần gọi View cho Action [Zend Framework]
      • Kiểm tra có phải Ajax Request hay không ? [Zend Fr...
      • Chức năng tìm kiếm trong Zend [Zend Framework]
      • Refresh Captcha trong Zend Framework [Zend Framework]
      • Zend_Captcha [Zend Framework]
      • Zend_Acl phân quyền cho người dùng (ứng dụng trên ...
      • Zend_Acl phân quyền cho người dùng (ứng dụng trên ...
      • Tạo thư viện riêng trong Zend Framework [Zend Fram...
      • Chứng thực đăng nhập với Zend_Auth [Zend Framework]
      • Zend_Form kết hợp với Validate và Filter [Zend Fra...
      • Zend_Filter [Zend Framework]
      • Zend_Validate [Zend Framework]
      • Tìm hiểu cơ bản về Zend_Form [Zend Framework]
      • Phân trang cơ bản với Zend_Paginator [Zend Framework]
      • Tương tác cơ sở dữ liệu sử dụng Zend_Db_Select [Ze...
      • Tương tác cơ sở dữ liệu với Zend_Db [Zend Framework]
      • Cách thêm thẻ Meta Description trong Zend [Zend Fr...
      • Tối ưu thẻ Title trong Zend [Zend Framework]
      • Xây dựng Project Zend Framework [Zend Framework]
      • Cách lấy mảng dữ liệu từ đối tượng Zend_Paginator ...
      • Tương tác cở sở dữ liệu với Zend_Db_Table [Zend Fr...
      • Cấu hình kết nối cở sở dữ liệu trong Zend Framewor...
      • Câu lệnh tăng số lần xem của 1 bài viết [Zend Fram...

Từ khóa » Thêm Dấu Nháy đơn Trong Sql