Home / Thủ Thuật / Hacking / Web7: SQL injection – Các cách phòng chống và kết luận

Web7: SQL injection – Các cách phòng chống và kết luận

Các cách phòng chống

Trong các bài viết trước, tôi đã trình bày về cách thức tấn công, các kĩ thuật bypass để khai thác lỗ hổng SQL injection. Ở bài viết này, tôi sẽ nói về cách phòng chống lỗ hổng nguy hiểm này.

Ngay từ khái niệm, chúng ta đã có thể biết được cách phòng chống hiệu quả Sql injection chính là việc kiểm tra kỹ càng tham số đầu vào. Những tham số mà từ đó người lập trình website sử dụng để xây dựng lên câu truy vấn tới cơ sở dữ liệu.

Công việc kiểm tra tham số đầu vào (áp dụng phòng tránh lỗi Sql injection) nên được tiến hành theo nhiều tầng:

  • Client: javascript (có thể bypass bằng các phần mềm tamper)
  • Server: C#, php, jsp

– Kiểm tra kiểu của dữ liệu: đối với dữ liệu kiểu số, kiểu chuỗi … chúng ta phải có những hàm validate tương ứng.

o Nếu là kiểu int:

  • ASP.NET: Int32.Parse(/*Param*/);
  • PHP: is_numeric($var), is_int($var), is_integer($var)…

o Nếu là kiểu chuỗi:

  • Thiết lập độ dài tối đa cần thiết: length <= MAX_LENGTH
  • Lọc bỏ ký tự nguy hiểm (bao gồm các meta characters trong DBMS), lọc bỏ các từ khóa như union, select, order, information_schema, insert, drop, load_file… (sử dụng các hàm như mysql_real_escape_string(), preg_replace()…)

 

Ví dụ:

Mã nguồn PHP:
<?php
$id = mysql_real_escape_string($_GET['id']);
$query = mysql_query("SELECT * FROM table where id = "' .$id. '");
?>
Mã nguồn PHP:
<?php
$id = preg_replace("/[^0-9]/","", $_GET['id']);
$query = mysql_query("SELECT * FROM table where id = "' .$id. '");
?>

 

  • Kiểm tra xem định dạng chuỗi: email, username, password… đều có một định dạng nhất định, do đó có thể viết các biểu thức chính qui (Regular Expression) cho mỗi định dạng này.

 

C#: System.Text.RegularExpressions;
PHP: preg_match(); …
Java: Pattern.matcher(); …

o Sử dụng các thư viện hỗ trợ:

  • C#: Parameters

 

cmd.Parameters.Add(“@var”, SqlDbType.Int);
cmd.Parameters[“@var”].Value = input;

o Phân quyền SQL

  • Tài khoản sử dụng cho ứng dụng web trong cơ sở dữ liệu dĩ nhiên phải có quyền đọc. Nhưng khi thực hiện thao tác thêm bài viết, thêm user thì nó phải cần thêm quyền ghi nữa. Do đó, tùy vào mỗi trường hợp mà ta thiết lập role phù hợp cho mỗi tài khoản web tương tác với cơ sở dữ liệu. Với những ứng dụng web thông thường, tài khoản cho ứng dụng web trong SQL SERVER nên chỉ được thiết lập quyền đọc (SELECT) (db_datareader) và quyền ghi (INSERT, UPDATE) (db_datawriter) như vậy sẽ không có quyền xóa một table.


Kết luận

SQL injection luôn được đánh giá là một trong những lỗ hổng bảo mật web nguy hiểm nhất trong nhiều năm qua. Do đó, đối với những người lập trình web cần hiểu rõ nguyên nhân và cách khắc phục sao cho hiệu quả. Những người quản trị cần có những cấu hình cần thiết để trách nguy cơ và giảm thiểu tác hại trong trường hợp ứng dụng web có lỗi có thể khai thác SQL Injection.

Các kỹ thuật tấn công, bypass trên đây, tùy vào những trường hợp cụ thể mà có những cách áp dụng khác nhau. Do tính chất đặc thù trong mỗi trường hợp cụ thể nên loạt bài viết không thể bao quát hết được tất cả các kỹ thuật. Với sự phát triển của các ứng dụng firewall (WAF) có thể những cách bypass nêu trên sẽ không còn hiệu quả nữa.

Print Friendly

About dongpolice

Check Also

sms-thuong-hieu

SMS Thương Hiệu

SMS thương hiệu, SMS Brandname Ngày nay, nhu cầu sử dụng sms, sms thương hiệu, …