1. Trang chủ
  2. » Tất cả

Những kinh nghiệm cơ bản lập trình ứng dụng web an toàn

11 260 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 274,47 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Những kinh nghiệm cơ bản lập trình ứng dụng web an toàn5 lỗ hổng bảo mật phổ biến nhất có thể phá hỏng dự án của bạn Trong bài viết này, chúng tôi sẽ nói về các cuộc tấn công có thể xảy

Trang 1

Những kinh nghiệm cơ bản lập trình ứng dụng web an toàn

5 lỗ hổng bảo mật phổ biến nhất có thể phá hỏng dự án của bạn

Trong bài viết này, chúng tôi sẽ nói về các cuộc tấn công có thể xảy ra với các ứng dụng web và cách để ngăn chặn chúng.

1) SQL Injection

Đây là lỗ hổng phổ biến nhất trong ứng dụng web Trên thực thế việc ngăn chặn SQL Injection không hề khó SQL Injection xảy ra khi một ứng dụng web không kiểm tra các thông số nhận được từ trình duyệt và trực tiếp thực thi chúng trong máy chủ cơ sở dữ liệu Vì vậy hãy kiểm tra thật kỹ các thông số, bạn sẽ có thể ngăn chặn tất cả các loại SQL Injection.

Ví dụ trong PHP, bạn có thể sử dụng hàm mysql_real_escape_string và nó sẽ chặn hầu hết các cuộc tấn công SQL Injection, nhưng hãy tưởng tượng rằng:

$id = mysql_real_escape_string($_POST['id']); $mQuery = "SELECT * FROM Users WHERE id = $id";

Nếu tin tặc nhập “1049 OR 1=1″ vào giá trị id, mysql_real_escape_string sẽ không giúp được gì nhiều bởi vì không có gì được loại bỏ từ chuỗi này và nó

là hợp lệ “1049 OR 1=1″ Thêm vào lớp bảo mật bổ sung luôn an toàn hơn các lớp bảo mật có sẵn trong thiết kế ứng dụng của bạn.

Ví dụ nếu bạn biết ID luôn là một giá trị số nguyên, hãy kiểm tra nó Đơn giản

gọi hàm is_int trong PHP để kiểm tra thông số Ngoài ra kinh nghiệm bảo mật

Trang 2

tốt sẽ là sử dụng Prepared Statements Thay vì sử dụng đoạn code bên trên, chúng ta dùng:

$id = mysql_real_escape_string($_POST['id']); if (!is_int($id))

display_error_and_return(); $stmt = $dbh->prepare("Select * from Users WHERE id = ?"); $stmt->bindParam(1, $id); $stmt->execute();

Bạn cũng có thể làm tương tự với ngôn ngữ ASP.NET:

SqlParameter[] myparm = new SqlParameter[1]; param[0] = new

SqlParameter("@Id", postID); myQuery = "SELECT * FROM Users WHERE ID=@Id";

Hoặc sử dụng hàm TryParse: if (!Int32.TryParse(postID, out integer))

display_error_and_return();

Luôn giữ trong đầu việc bạn những việc sau khi phát triển một ứng dụng web

có tương tác với cơ sở dữ liệu:

Không bao giờ cấp các quyền không cần thiết cho tài khoản kết nối tới CSDL của ứng dụng web trong hệ quản tị CSDL Đơn giản tạo một người dùng trong cơ sở dữ liệu và chỉ cấp quyền truy vấn SELECT nếu người dùng

không INSERT hay UPDATE.

Thực hiện việc loại bỏ các chuỗi kí tự, bên trên chúng ta đã sử dụng TryParse

và is_int bởi vì chúng ta biết thông số là một số nguyên Nếu bạn có một thông

số là một chuỗi kí tự như tên Category, khi bạn nắm được Category của mình

là một từ đơn, hãy kiểm tra dấu “cách”; nếu bạn biết được trong tên Category không được có những kí tự không mong muốn như dấu “=”, hãy kiểm tra lại.

Trang 3

2) File Uploaders

Khi bạn sử dụng một chương trình File Uploader, nếu không quản lý và kiểm soát tốt bạn sẽ tạo các cửa trên máy chủ tiếp cận các tệp tin từ bên ngoài Bạn cần có những biện pháp phòng ngừa tin tặc Nếu có thể, hãy mã hóa tên file và không bao giờ chứa tên file gốc trên ổ cứng của máy chủ Ví dụ, nếu bạn tải lên file Test.jpg, hãy tạo tên như sau:

$mNow = date("Y-m-d H:i:s"); $mOrigName = $OriginalFileName; $NewName

= md5($mNow + " - " + $mOrigName;

Giờ thì lưu trữ tên file trong cơ sở dữ liệu và lưu file đó vào ổ đĩa với tên mới được tạo và không có phần mở rộng hay những phần mở rộng trung

gian như tmp hay usrfile…

Không bao giờ hiển thị đường dẫn nơi bạn lưu trữ những file được tải lên Ví

dụ không gửi thông báo “Thank you for uploading your file, you can see your file here yourwebsite.com/uploadedfiles/Test.jpg”.

Lưu trữ các tệp tin vào một thư mục có tên ngẫu nhiên thay vì có tên

như Upload, Uploads, UserFiles, UserUploads… Chỉ cần tạo ra chuỗi 10 kí

tự ngẫu nhiên như qS2lVDOL6o.

Không bao giờ cho phép thực thi các tập tin như php, asp, jsp trên thư mục tải lên, bạn có thể cấu hình bằng cách sử dụng htaccess trong Apache hay cấu hình trong IIS.

Ngoài ra, bạn có thể đơn giản là lưu trữ các file này trong cơ sở dữ liệu dạng binary.

Trang 4

3) Local hoặc Remote File Inclusion Attacks

PHP dễ bị tổn thương trước kiểu tấn công này nhất Nó xảy ra khi một đoạn code cố gắng include một trang khác sử dụng tham số là biến được lấy vào từ người dùng Ví dụ:

NewsId = $_POST['nid']; include $NewsID; hoặc require_once($NewsID); Điều này thực sự rất nguy hiểm Thậm chí tin tặc có thể thực thi mã lệnh trên chính máy chủ của bạn bằng cách tạo các mã PHP code vào tệp

tin apache log và sau đó lợi dụng điểm yếu của lỗ hổng File Inclusion để đọc các đoạn mã này từ file log Vì vậy bạn nên tránh xa việc sử dụng các hàm include, require với dữ liệu đầu vào động và được thay đổi bởi người dùng.

Với mỗi file, có một địa chỉ và ID riêng trên cơ sở dữ liệu, hãy tạo

đường dẫn như sau: downloadfile.php?ID=49 và trong code của bạn truy vấn cơ sở dữ liệu với tên file có ID=49, đọc nó và xử lý.

Nếu xử lý file trực tiếp, bạn có thể kiểm tra sự tồn tại những kí tự như “ ” “/” “http” “ftp” “https” … Nhưng phương pháp này không thực

sự tốt.

4) XSS

Để ngăn chặn XSS trong PHP sử dụng:

$UserParam = strip_tags($UserParam);

ASP.NET:

UserParam =

Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(UserParam);

Trang 5

Những điều được giải tích phía trên là những giới thiệu cơ bản nhất về lập trình web an toàn, nhưng hầu hết đều có thể ngăn chặn được các cuộc tấn công ứng dụng web.

5 lỗ hổng bảo mật phổ biến nhất có thể phá hỏng dự án của bạn

Khi tạo ra một dự án như một trang web hay một ứng dụng web bạn phải tuân thủ một số quy tắc cơ bản để đảm bảo người dùng được bảo vệ Để ngăn chặn một cuộc tấn công, bạn cần tập trung vào chất lượng code tạo ra trong giai đoạn lập trình, việc cấu hình hệ thống trong giai đoạn triển khai Dưới đây chỉ là 5 trong hàng hàng ngàn kịch bản tấn công có thể xảy ra do lỗi của người lập trình.

1 SQL Injection

SQL Injection là loại tấn công nổi tiếng nhất Nó thường được sử dụng để khai thác lỗ hổng của trang web trên nền tảng PHP hoặc ASP Các cuộc tấn công bao gồm việc tiêm mã độc vào những truy vấn SQL trong ứng dụng của bạn thông qua các giá trị đầu vào của ứng dụng Nếu thành công sẽ cho phép

kẻ tấn công thêm hoặc xóa nội dung cơ sở dữ liệu, lấy các giá trị trong CSDL như email, mật khẩu hoặc thông tin cá nhân người dùng trang web SQL Injection có thể xảy ra nếu một trang web chấp nhận những truy vấn không đáng tin cậy vào cơ sở dữ liệu hoặc tạo ra chúng một cách tự động.

Giả sử rằng các biến đăng nhập (bao gồm tên và mật khẩu) được đưa trực tiếp đến các câu truy vấn SQL thông qua phương thức POST Một đoạn code sẽ chịu trách nhiệm xử lý việc đăng nhập của người dùng có thể dễ dàng bị tổn thương:

Trang 6

Nếu một người dùng trang web gửi tới máy chủ giá trị admin– trong mục tên người dùng, truy vấn SQL sẽ thực hiện như sau

Điều gì đã xảy ra? Kí tự — sẽ được hiểu bởi DBMS như một comment, kết quả dẫn đến việc hoàn thành thực thi thất bại một phần của truy vấn SQL, phần này vốn dùng để kiểm soát mật khẩu Tin tặc sẽ khai thác nó để chiếm quyền quản trị dịch vụ.

Cách ngăn chặn kiểu tấn công SQL Injection: Cách bảo vệ hiểu quả nhất đối với kiểu tấn công này là lọc dữ liệu mà người dùng cung cấp bằng các

hàm: mysql_real_escape_string(), pg_escape_string()… Dữ liệu số phải được chuyển đổi bởi settype() or sprintf(), sau đó kiểm tra với s_numeric(),

ctype_digit() nhằm định dạng dữ liệu chính xác.

2 Stored XSS

Trong kiểu tấn công này, một script được viết bởi tin tặc sẽ được đưa vào cơ

sở dữ liệu của hệ thống bị ảnh hưởng Đối lập với kiểu tấn công SQL Injection, các mã độc không ảnh hưởng đến cơ sở dữ liệu mà chỉ ảnh hưởng tới người dùng của hệ thống Ví dụ như phần bình luận của trang web Tin tặc có thể khai thác tất cả người dùng mà người dùng không hề nghi ngờ trang web đã

bị lây nhiễm các mã độc javscript có thể đánh cắp phiên đăng nhập của người dùng.

Ví dụ:

Trang 7

Cách ngăn chặn Stored XSS

Để ngăn chặn Stored XSS cần một bộ lọc thích hợp cho các dữ liệu đầu vào Phương pháp tốt nhất là tạo ra một whitelist các kí tự được phép sử dụng trong các mục Nếu trang web dễ bị tổn thương trước Stored XSS thì tùy chọn httpOnly cho cookie gửi đi có thể giúp bảo vệ tốt hơn người dùng khỏi việc mất phiên người dùng Trong đa số trình duyệt hiện nay đã có thể ngăn chặn hành vi ăn cắp cookie bằng JavaScript từ người dùng.

3 Bảng mã Unicode

Sự phát triển của hệ thống kí tự ASCII mã hóa dựa trên các chữ cái tiếng Anh phổ biến toàn cầu Theo thời gian, thế giới bắt đầu sử dụng các ngôn ngữ và

hệ thống bảng chữ cái khác Do 1 byte không thể dùng để lưu trữ kí tự trong tất cả các ngôn ngữ, một hệ thống mã hóa mới dành cho các ngôn ngữ đa dạng đã được ra mắt Đó chính là chuẩn Unicode Trong hệ thống Unicode, mỗi kí tự được lưu trữ lớn hơn 1 byte Bảng mã UTF-8 là bảng mã nền tảng Unicode được sử dụng rộng rãi nhất, cho phép tin tặc có thể chèm một vài kí

tự ví dụ “ /” theo các cách khác nhau Bộ giải mã UTF-8 không kiểm tra tính hợp lệ của kí tự đặc biệt như “/”.

Ví dụ, để nói về các bảng mã, hãy cùng xem những đường link giống nhau được viết trong hệ thống bảng mã khác nhau:

Trang 8

Trong các hệ thống mã hóa khác nhau, kí tự sẽ được lưu trữ trong các vị trí khác nhau Do đó, bộ lọc danh sách đen các kí tự đầu vào sẽ yêu cầu sử dụng tất cả các bộ kí tự Cách phòng chống kiểu tấn công này là chuyển đổi tất cả

dữ liệu thành một định dạng thống nhất Sau đó chúng ta mới có thể kiểm thử chúng hợp lệ hay không và loại bỏ kí tự không mong muốn.

5 PHP Injection

Ngôn ngữ lập trình có các hàm cho phép thực thi mã bên ngoài Trong PHP

đó là require(), include(), eval(), and preg_replace cùng với modifier /e sẽ xem nơi lưu trữ chuỗi kí tự như một PHP code.

Ví dụ, giả sử trang web có một bộ điều khiển đơn giản dựa trên các tập tin là các biến gửi qua phương thức GET để đưa vào nội dung của một file có trước.

Như chúng ta thấy tập tin được gọi thông qua bởi phương thức GET và được

sử dụng thông qua hàm include() Đó là một lỗi nguy hiểm có thể bị khai thác

Trang 9

bởi tin tặc bằng nhiều cách khác nhau Bất kì mã nào cũng có thể được thực thi Ví dụ:

Đường dẫn đến mã độc được thông qua như một tham số của hàm Kịch bản này sẽ được thực thi bởi các máy chủ của tin tặc.

Các ngăn chặn PHP Injection

Cấu hình máy chủ sẽ giúp ích bạn phòng tránh kiểu tấn công này Các tùy chọn allow_url_fopen có thể chặn file truy cập từ bên ngoài máy chủ dành cho các hàm file_get_contents, fopen, include, và require Các bảo vệ tốt nhất là không cho phép dữ liệu đầu vào từ người dùng vào các hàm thực thi script

Bộ lọc chuỗi kí tự đầu vào và tạo ra whitelist các file được phép là điều cần thiết Ngoài ra còn nhiều kiểu tấn công tương tự cũng được các tin tặc khai thác như: Local File Include, Php Object Injection…

5 Account Lockout

Minh họa tốt nhất cho các cuộc tấn công này là câu chuyện về một người dùng trong một trang web đấu giá lớn nhất thế giới Người này đưa ra giá rất cao cho một sản phẩm 15 phút trước khi phiên đấu giá đóng

cửa, một người dùng khác bước vào đấu giá Trước khi đấu giá kết thúc, người dùng đầu tiên cố gắng chốt lại quyết định cuối cùng của mình, ông đã

bị đăng xuất khỏi dịch vụ và nhận được thông báo tài khoản của ông bị khóa trong vòng 30 phút và không được đấu giá thêm.

Tại sao hệ thống lại xử lí như vậy?

Trang 10

Người dùng thứ hai đã có thể thấy được người dùng đầu tiên đăng nhập Hắn thực hiện nhiều lần đăng nhập vào tài khoản người dùng thứ nhất với mật khẩu sai Với mục đích ngăn chặn các cuộc tấn công brute-force , hệ thống sẽ khóa tài khoản người dùng sau khi vượt quá lần đăng nhập thất bại Tin tặc

sử dụng Account Lockout có thể khiến tài khoản người dùng không thể truy cập được nữa.

Cách ngăn chặn Account Lockout: Thay vì khóa tài khoản người dùng sau khi vượt quá số lần đăng nhập thất bại, bạn nên xem xét việc yêu cầu người dùng

gõ mã Captcha sau mỗi lần đăng nhập tiếp theo Điều này sẽ bảo vệ các trang web khỏi kiểu tấn công brute-force mà không từ chối truy cập người dùng Một giải pháp khác là chặn địa chỉ IP trong một khoản thời gian nhất định Nhưng vẫn có thể tin tặc và người dùng bị tấn công có chung địa chỉ IP Nó vẫn sẽ khiến người dùng không thể truy cập vào tài khoản.

Kiểm tra bảo mật

Kiểm tra thủ công trang web của bạn với những lỗ hổng bảo mật là điều cần thiết Để tiết kiệm thời gian bạn có thể sử dụng một số công cụ tìm kiếm lỗ hổng tự động Chúng ra hãy cùng nói về 3 phương pháp kiểm tra bảo mật: Black Box Testing

Kiểm thử viên Black box chỉ thực hiện thông tin về các hàm trong một trang web và không cần biết cấu trung bên trong ứng dụng Họ sẽ kiểm tra những

dữ liệu đầu vào nào hợp lệ và kết quả đầu ra có chính xác hay không

Acunetix là một ví dụ về phầm mềm Black Box Testing.

White Box Testing

Trang 11

White Box Testing lại dựa theo quy tắc ngược lại Kiểm thử viên sẽ toàn quyền truy cập vào mã nguồn, các lỗ hổng bảo mật sẽ được phát hiện thông qua việc kiểm tra code RATS là một ví dụ phần mềm White Box Testing tự động.

Grey Box Testing

Đó là sự kết hợp cả 2 phương pháp nêu trên Kĩ thuật này đòi hỏi chúng ta tiếp cận toàn bộ tài liệu tạo ra trong suốt quá trình phát triển ứng dụng nhưng không tiếp cận vào mã nguồn Theo phương pháp này, chúng ta có thể điều chỉnh mức độ kiểm tra biến cụ thể trong Black Box Testing.

Tổng kết

Năm kiểu tấn công được lựa chọn không được đề cập đến chuyên sâu, chỉ là một vài kịch bản cơ bản được nêu ra Chắc chắn còn có rất nhiều các cuộc tấn công đe dọa doanh nghiệp của bạn Bất kể lập trình viên, quản lí dự án hay các công ty khởi nghiệp cần nhận thức được tầm quan trọng trong việc bảo

vệ ứng dụng của mình Không thực hiện các biện pháp bảo mật đầy đủ có thể khiến bạn bị mất uy tín với khách hàng ngay cả khi đó là dịch vụ tốt nhất.

Ngày đăng: 14/12/2021, 20:40

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w