Cách phát hiện và khắc phục lỗi SQL injection trong PHP

Cách phát hiện và khắc phục lỗi SQL injection trong PHP

SQL Injection Là một trong những kiểu hack web phổ biến vào những năm trước đây, nhưng mãi cho đến hiện nay vẫn có khá nhiều trang web vẫn mắc lỗi này vì thế trong bài viết này sẽ mô tả về SQL injection và bạn sẽ cảm thấy an tâm hơn khi hiểu rõ về nó.

Bằng cách inject các mã SQL query/command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không cần username và password, remote execution, dump data và lấy root của SQL server.

Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, ...etc

Cách phát hiện:

1. Ở PHP thông thường sẽ có 2 dạng về lỗi này, dạng thứ nhất có thể nhìn thấy được - gọi là thẳng là SQL injection, dạng thứ hai không nhìn thấy đựơc mặc dù nó bị lỗi thiệt - gọi là Blind SQL injection.

Thông thường thì để kiểm tra lỗi SQL injection ở dạng thứ nhất, ta thường thêm dấu ' (dấu nhấy) vào phía sau các địa chỉ có dạng: user.php?id=1 hoặc user.php?id=

vd:http:domain/user.php?id=1'  hoặc http://domain/useer.php?id=' đều được.

2. Còn ở dạng thứ hai thì khó hơn, bởi vì người ta có thể dễ dàng ngăn chặn các thông báo lỗi gửi từ máy chủ bằng cách thêm ký tự @ trước câu lệnh SQL, ví dụ:

view plainprint ?

$id = $_GET[id]; mysql_query("SELECT * FROM tbl_name  WHERE id=$id"); $id = $_GET[id]; @mysql_query("SELECT * FROM sanchoituoitre.vn WHERE id=$id");

Nếu từ phía hacker thì sẽ khó có thể tìm ra được, vì thế nếu bạn không rõ về SQL injection bạn có thể thêm @ vào trước câu lệnh như trong ví dụ trên dùng để che dấu lỗi.

Hoặc sử dụng error_reporting(0); ở đầu đoạn PHP để che dấu lỗi.

Còn nếu site cần kiểm tra do bạn làm webmaster thì có thể làm như sau:

view plainprint ?

$id = $_GET[id]; mysql_query("SELECT * FROM tbl_name  WHERE id=$id");

$id = $_GET[id]; @mysql_query("SELECT * FROM  tbl_name  WHERE id=$id"); 

Với cách phát hiện: http:domain/user.php?id=1'  thì biến $id sẽ được khai báo là ' (dấu nháy) nếu bị dính lỗi, và trong đoạn code đã dùng print để in giá trị của biến $id ra, nếu nhìn thấy dấu nhấy thì là dính lỗi, nếu không thì hãy kiểm tra lại 1 lần nữa vì trong đoạn code trên hoàn toàn chưa được fix lỗi, he he.

Cách khắc phục:

Cũng căn cứ theo ví dụ trên, bạn có thể dùng hàm intval() để khắc phục lỗi này, ví dụ:
+ Chưa fix (unfix):

view plainprint ?

$id = $_GET[id]; mysql_query("SELECT * FROM tbl_name   WHERE id=$id"); $id = $_GET[id]; @mysql_query("SELECT * FROM tbl_name   WHERE id=$id");

+ Đã fix (fixed):

view plainprint ?

$id = $_GET[id]; mysql_query("SELECT * FROM tbl_name  WHERE id=$id"); $id = $_GET[id]; @mysql_query("SELECT * FROM tbl_name  WHERE id=$id");

Trong intval, int có nghĩa là integrals (Số nguyên) còn val có nghĩa là value (Giá trị) vì vậy giá trị của biến $id phải là số nguyên, làm vậy hacker sẽ không thể inject (tiêm vô) đoạn SQL của bạn.

Bạn thấy bài viết này như thế nào?: 
No votes yet
Ảnh của Tommy Tran

Tommy owner Express Magazine

Drupal Developer having 9+ year experience, implementation and having strong knowledge of technical specifications, workflow development. Ability to perform effectively and efficiently in team and individually. Always enthusiastic and interseted to study new technologies

  • Skype ID: tthanhthuy

Tìm kiếm bất động sản

 

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
CMS Drupal, Drupal 7 Theme, Drupal Modules, Drupal Webform, Khoa hoc Drupal

Drupal Theme Developer Course

Việc chuyển đổi website design thành giao diện Drupal đòi hỏi một số kiến thức nhất định. Drupal Theming có thể rất chậm, nhưng có thể làm rất nhanh chóng, nếu bạn hiểu Drupal và cách theming Drupal một cách chuẩn mực.

Phần 1 - Cài đặt, model và CRUD trong Symfony 2

Giải nén → đổi tên thư mục Symfony thành sfdemo, sao chép vào thư mục “/var/www”

Facebook, Mark Zuckerberg

Ông chủ Facebook ở nhà đẹp cỡ nào?

Theo báo AsiaOne, tuy là một tỷ phú nhưng Zuckerberg vẫn vay theo hình thức thế chấp nhà để có dinh cơ trị giá 13,5 triệu USD, tương đương hơn 282 tỷ đồng. Sau khi tậu nhà, năm nay Zuckerberg đã làm đám cưới với cô bạn gái Priscilla Chan và hiện cặp đôi này đang sống hạnh phúc trong căn nhà đầy vẻ lãng mạn và trẻ trung này.

Công ty diệt chuột T&C

 

Diet con trung