Làm sao để bảo vệ website của bạn trước tấn công SQL Injection

28 tháng 11, năm nay – 3023 lượt xemTrong tổng thể những loại tiến công nhằm mục đích vào những website hiện này thì SQL Injection là một trong những loại tiến công nguy khốn và phổ cập nhất, nó đã gây thiệt hại không nhỏ cho những doanh nghiệp và tổ chức triển khai trong nhiều năm trở lại đây. Trước khi tìm cách bảo về website của tất cả chúng ta trước nó thì cần phải tìm hiểu và khám phá xem liệu nó là gì và cách nó hoạt động giải trí thế nào .Tóm lại, SQL injection – còn gọi tắt là SQLi – sử dụng những lỗ hổng trong những input nguồn vào của website để nhằm mục đích mục tiêu gây hại cho website của tất cả chúng ta. Cụ thể là chúng dựa vào những câu lệnh SQL để đánh cắp thông tin nhạy cảm của người dùng, đổi khác cơ sở tài liệu, cản trở sự hoạt động giải trí của mạng lưới hệ thống … trong trường hợp xấu nhất hoàn toàn có thể xảy ra thì nó hoàn toàn có thể chiềm quyền sử dụng cơ sở tài liệu của tất cả chúng ta. ( RIP me ) .

Dưới đây là những gì mà mình nghĩ là bạn nên biết về SQL injection và làm sao để bảo vệ trang web của bạn chống lại nó. (Hi vọng với những thông tin mình cung cấp có thể “make your website better” ).

SQL Injection tấn công như nào?

Biết người biết ta – trăm trận trăm thắng – Tôn tử

SQL injection ( gọi là SQLi cho ngắn vậy ) được tổ chức triển khai ( organized ) bằng cách gửi những lệnh SQL ô nhiễm đến những sever cơ sở tài liệu trải qua những request mà trang web bạn được cho phép, ví dụ như những lệnh đăng nhập. Bất kì những nguồn vào website của bạn ( những thẻ input, những query string, cookies và files ) để hoàn toàn có thể được sử dụng để gửi những mã độc .Để xem những mà nó thao tác, bạn hoàn toàn có thể nhìn vào form đăng nhập dưới đây. Nó gồm có hai input để nhập username và password, một nút submit để gửi tài liệu .

Khi người dùng nhập thông tin đăng nhập và bấm login, thông tin của người dùng sẽ được gửi một tới servert trải qua một POST request sau đó sẽ được gán vào một câu lệnh SQL. Đoạn code đó sẽ trông như này :

$sql_command = "select * from users where username = '". $_POST['username']; $sql_command .= "' AND password = '". $_POST['password']. "'"; 

Đoạn code này sẽ sau đó sẽ được lên sever cơ sở tài liệu. tác dụng trả về của nó sẽ kiểm tra được người dùng nhập vào có hợp lệ hay có phải là người dùng trong mạng lưới hệ thống hay không ?. Một ví dụ là người dùng có username là ” john ” và password là ” 123456 ” ( đừng khi nào dùng mật khẩu này ) thì đoạn mã trên sẽ chuyển thành đoạn SQL như sau :

SELECT * FROM users WHERE username='john' AND password='123456' 

Đấy là trường hợp người dùng nhập thông tin hợp lệ ( ở đây có nghĩa là họ nhập đúng chuẩn username chỉ gồm có chữ hoặc số … ) Vậy thì điều gì xảy ra khi học nhập thông tin như bên dưới :

Kết quả của đoạn code phía bên trên giờ đây sẽ được biên dịch thành như này :

SELECT * FROM users WHERE username='john' OR 1=1; 
-- ' AND password='123456' 

Phần kiểm tra password đã bị comment lại. Kết quả trả về sẽ là thông tin của người dùng có username là ‘ john ‘ mà không thiết yếu phải ghi nhận mật khẩu .Bằng thủ pháp này thì ta đã có quyền quy cập của người dùng mà chỉ cần biết username của người đó .Đây là một trong những ví dụ nổi bật và đơn thuần nhất của SQLi. Bằng một vài thủ pháp thì người dùng hoàn toàn có thể thêm, sửa thậm chí còn là xóa những người dùng trong mạng lưới hệ thống. học hoàn toàn có thể đánh cắp hàng loạt thông tin người dùng chỉ bằng một đoạn lệnh rất ngắn .Trong trường hợp xấu hơn, khi mà liên kết đến sever cơ sở tài liệu được tạo ra ( và trấn áp ) bởi một thông tin tài khoản admin ( giống như thông tin tài khoản root trong MySQL ), kẻ tiến công hoàn toàn có thể làm nhiều điều hơn thế. Hắn hoàn toàn có thể sử dụng lỗ hổng SQLi để tạo thông tin tài khoản người dùng trên sever bị tiến công, kích hoạt tính năng Remote Desktop, thiết lập SMB chia sẽ những thư mục và tải lên những mã độc khác .

Vậy làm thế nào để bảo vệ khỏi tấn công SQL Injection?

Với mỗi một kênh nguồn vào ( input element, file, cookies … ) sẽ tương ứng với một kiểu tiến công SQLi. Cách tốt nhất để bảo vệ khỏi tiến công SQLi là trấn áp những tài liệu nguồn vào website của bạn .Dưới đây sẽ là một vài giải pháp có ích để bảo vệ rằng input người dùng nhập vào là bảo đảm an toàn :

Nguyên tắc 1: Đừng bao giờ tin vào thông tin người dùng nhập vào.

Nguyên tắc tiên phong cũng là lớn nhất về input người dùng nhập và là ” don’t trust and verify ” – nó có nghĩa là toàn bộ những form từ người dùng nhập lên cần phải được kiểm duyệt một cách nghiêm chỉnh. Nó không chỉ gồm có những input boxes như kiểu textarea hay input text mà nó còn gồm có rất nhiều những khác ví dụ như hidden input, query string parameters, cookies và file uploads .Không phải là browser của tất cả chúng ta không được cho phép biến hóa những thông tin mà ta gửi đi thì ta không hề đổi khác nó. Có một tool tên là Burp Suite cho phép người dùng hoàn toàn có thể capture lại HTTP request và đổi khác nó, thêm những hidden input trước khi gửi nó đến server. Và nếu bạn nghĩ rằng mình mưu trí bằng cách sử dụng Base64 để mã hóa dữ liệu của mình thì nó hoàn toàn có thể giải thuật một cách thuận tiện, sửa đổi và tái mã hóa .

Nguyên tắc 2 : Validate dữ liệu trên server side.

Validation là quy trình để bảo vệ tài liệu người dùng gửi lên là hợp lệ. Ví dụ ở trong PHP, bạn hoàn toàn có thể dùng hàm mysql_real_escape_string ( ) để vô hiệu những kí tự hoàn toàn có thể gây tác động ảnh hưởng đến câu lệnh SQL .Đoạn code tiên phong sẽ sửa thành như này :

$con=mysqli_connect("localhost","user","password","db");
$username = mysqli_real_escape_string($con, $_POST['username']); 
$password = mysqli_real_escape_string($con, $_POST['password']); 
$sql_command = "select * from users where username = '". $username; $sql_command .= "' AND password = '". $password. "'"; 

Edit một chút ít đã giúp bảo vệ code của tất cả chúng ta trước tiến công SQLi bằng cách thêm vào kí tự ( \ ) trước những dấu nháy đơn mà người dùng có ý thêm vào .

Một số lưu ý về tính toán:  Nếu bạn đã thêm việc validate dữ liệu ở client side thì người dùng có thể pass qua những validation phía client side bằng các sửa các mã HTML họ nhận được hay tắt các javascript ở phía client đi. 

Trong một số ít ngôn từ lập trình, ví dụ điển hình như ASP.NET, gồm có những tính năng tự động hóa xem xét những tài liệu nguồn vào và sử dụng những bộ lọc để vô hiệu nó. Nhưng điều này vẫn hoàn toàn có thể bị tin tặc lách qua nếu đủ tinh xảo. Dù sao thì việc kiểm tra tài liệu nguồn vào cũng chẳng khi nào là điều quá thận trọng cả .

Nguyên tắc 3: Sử dụng command parameters

Một lựa chọn tốt hơn để chông tiến công SQLi là sử dụng placeholder để giữ chỗ trong câu lệnh SQL sau này khi người dùng nhập tài liệu thì sẽ điền đầy vào đó .Ví dụ về đoạn code sau :

SqlCommand cmd = new SqlCommand ("SELECT * FROM users WHERE username=@username AND password=@password",con); 

SqlParameter username = new SqlParameter(); username.ParameterName = "@username"; username.value = txtUsername.Text; cmd.Parameters.Add(username); 

SqlParameter password = new SqlParameter(); password.ParameterName = "@password"; password.value = txtPassword.Text; cmd.Parameters.Add(password); 

Đầu tiên ta sẽ tạo ra một SqlCommand  object và sử dụng placeholder  @parameter_name trong đoạn lệnh, nó sẽ được thêm vào khi người dùng thêm điền dữ liệu vào.

Sau đó tạo thêm một instances của  SqlParameter objects, sau đó nội dụng người dùng nhập vào sẽ được lưu vào đây thay vì chèn trực tiếp vào câu lệnh SQL.

Cuối cùng, ta thêm cái  SqlParameter object vào SqlCommand object’s Parameter collection, và dữ liệu người dùng nhập vào sẽ được truyền vào trong câu lệnh SQL.

Trong PHP sẽ có PDO và mysqli hoàn toàn có thể xử lý giống như ASP.net. Bạn hoàn toàn có thể tìm hiểu thêm ở đây .

Nguyên tắc 4: Định nghĩa kiểu dữ liệu cho input

Tips này giành cho những ngôn từ như kiểu PHP vậy, khi bạn gõ code thì không liên tục xác lập kiểu tài liệu cho những biếnViệc định nghĩa rõ ràng kiểu tài liệu cho tài liệu nguồn vào như một cách để vô hiệu những tài liệu hoàn toàn có thể gây sai cho câu lệnh SQL .Ví dụ như :

$age = (int)$_POST['age']; 

Cách làm trên chỉ đúng để xác nhận với kiểu của tài liệu chứ nó không hề trấn áp việc nhập tuổi có đúng không ví dụ như > 1000 tuổi hay giá trị âm ví dụ điển hình .Và một trong những cách tốt để chống tiến công SQLi là tránh sử dụng dấu nhanh đơn trong lệnh SQL khi không có string được truyền vào. Bạn sử dụng đoạn code này :

$sql_command = "select * from users where age = ". $age; 

sẽ bảo đảm an toàn hơn việc sử dụng dòng lệnh này :

$sql_command = "select * from users where age = '". $age. "'"; 

Làm thế nào để nhổ tận gốc lỗ hổng SQL Injection.

Bạn nên kiểm tra code của mỗi trang, đặc biệt quan trọng là những nơi bạn kết hơp giữa nội dung ( contents ), những lệnh, những chuỗi … với tài liệu từ phía người dùng. Rà soát lại hàng loạt mã nguồn, tìm kiếm những lỗ hổng bảo mật thông tin là một phần vốn có của quy trình phát triền ứng dụng của bạn .Bạn cũng hoàn toàn có thể sử dụng một tools để ” quét ” như sqlmap để tìm kiếm những lỗ hổng mà SQLi hoàn toàn có thể tận dụng trong website của bạn. Trong một vài trường hợp, thì hacker cũng dùng nó để tìm ra lỗ hổng để tiến công website của bạn .

Vài dòng cuối cùng

Không chăm sóc bạn đã đổ bao nhiêu tiền cho việc kiến thiết xây dựng mạng lưới hệ thống bảo mật thông tin cho website của bạn thì bạn vẫn phải chuẩn bị sẵn sàng cho việc một ngày nào đó SQLi sẽ ghé thăm nhà bạn và ” làm khó dễ ” đôi chút cái mạng lưới hệ thống đó. Cẩn thận chưa khi nào là đủ và tất cả chúng ta cần hiểu rằng đừng khi nào cho hacker thắng lợi dù chỉ một lần .Dưới đây còn một vài tips mà hoàn toàn có thể giúp bạn hạn chế tối đa ảnh hưởng tác động từ việc trở thành nạn nhận của SQLi

Tránh quyền quản trị 

Sử dụng thông tin tài khoản ” root ” để liên kết ứng dụng web của bạn tới sever database là một trong những sai sót tệ nhất mà bạn cần tránh. Những mối đe dọa của nó thì mình đã trình diễn ở trên. Việc để hacker chiếm quyền quản trị thì việc tài liệu còn nguyên vẹn là trọn vẹn khó hoàn toàn có thể xảy ra .

Mã hóa những dữ liệu nhạy cảm.

Hãy mà hóa những tài liệu nhạy cảm trong cơ sở tài liệu của bạn. Nó gồm có mật khẩu, câu hỏi và câu vấn đáp bí hiểm, những tài liệu về kinh tế tài chính, thông tin sức khỏe thể chất và những thông tin có ích cho hacker. Nó bảo vệ rằng nếu mà thông tin mà có lộ ra ngoài thì tin tặc cũng không hề sử dụng nó nhằm mục đích mục tiêu gây hại cho người mua của tất cả chúng ta .Nếu bạn mã hóa mật khẩu thì nên sử dụng những thuật toàn can đảm và mạnh mẽ như SHA – 2, nó sẽ sớm trở thành tiêu chuẩn công nghiệp cho bảo vệ mật khẩu. MD5 hay SHA – 1 đã lỗi thời và hoàn toàn có thể bị giải thuật .

Không lưu những thông tin nhạy cảm nên không thực sự cần thiết.

Bất kì đâu bạn lưu trữ thông tin trong cơ sở dữ liệu, nó cũng có thể gây hại cho khổ chủ nếu chúng rơi vào tay kẻ xấu, nên tốt nhất đừng lưu trữ nó nếu có thể.

Kết luận

SQL injection vẫn sống sót xung quanh ta trong nhiêu thập kỉ và có năng lực vẫn sẽ liên tục thống trị bảng xếp hạng những kiểu tiến công nguy hại trong nhiều năm tới. Chúng ta vẫn cần phải luôn chuẩn bị sẵn sàng những công cụ để bảo về website của tất cả chúng ta khi một ngày nào đó nó ghé thăm .Hi vọng bài viết của mình sẽ giúp ích cho những bạn .Nguồn : Sitepoint