Tổng quan về viết mã an toàn và phân tích mã nguồn
Tổng quan về viết mã an toàn
Ngày nay, bên cạnh tiêu chí hiệu quả, an toàn là một yếu tố quan trọng cần được chú trọng trong các chương trình ứng dụng Một chương trình được xem là an toàn khi có khả năng phát hiện, ngăn chặn, chống chịu và phục hồi trước các mối đe dọa từ bên ngoài.
According to the National Institute of Standards and Technology (NIST), over 15,000 vulnerabilities have been reported and added to the Common Vulnerabilities and Exposures (CVE) database The increasing number of reported vulnerabilities raises growing concerns in the cybersecurity community.
1.1.1.2 Viết mã an toàn là gì?
Viết mã an toàn là yếu tố quan trọng trong phát triển phần mềm an toàn, với mục tiêu chính của lập trình viên là tạo ra mã hoạt động hiệu quả cho các nhiệm vụ cụ thể Tuy nhiên, việc không chú ý đến các mối nguy hiểm có thể dẫn đến những lỗ hổng bảo mật nghiêm trọng, gây ra sự cố cho chương trình hoặc tạo điều kiện cho các cuộc tấn công từ chối dịch vụ Để ngăn chặn những sai sót này, cần áp dụng các kỹ thuật lập trình an toàn, giúp giảm thiểu lỗi phần mềm và nâng cao chất lượng sản phẩm Quá trình phát triển yếu kém thường dẫn đến những lỗ hổng không được phát hiện trong giai đoạn đầu, và khi sản phẩm ra mắt, các lỗ hổng này thường được phát hiện và báo cáo bởi các nhà nghiên cứu.
Lỗ hổng bảo mật do tin tặc khai thác thường không được phát hiện cho đến khi gây ra thiệt hại lớn Việc phát triển và phát hành bản vá lỗi để khắc phục lỗ hổng này cần thời gian Sau khi bản vá lỗi được tạo ra, nó cần được cấu hình trên hệ thống hoặc ứng dụng hiện có để khắc phục các vấn đề an ninh.
Hệ thống quản lý bản vá lỗi hiện tại không thực sự hiệu quả do nhiều lý do Đầu tiên, quá trình phát triển và phát hành bản vá lỗi tốn nhiều thời gian Thứ hai, một số bản vá có thể không tương thích với các ứng dụng hoặc hệ thống hiện tại, khiến việc triển khai ngay lập tức trở nên khó khăn mà không cần kiểm tra Ngoài ra, việc cấu hình sai các bản vá mới có thể dẫn đến những vấn đề an ninh nghiêm trọng.
Nhìn chung, những tác động của các lỗ hổng và quản lý các bản vá lỗi bao gồm các chi phí: [6]
Đánh giá khả năng dễ bị tổn thương/tấn công của hệ thống
Phát triển bản vá lỗi
Thu thập, tổng hợp và thử nghiệm các bản vá lỗi
Thông báo bản vá lỗi
Hỗ trợ các vấn đề quản lý bản vá lỗi
Thời gian ngưng trệ trong thời gian áp dụng các bản vá lỗi
Chi phí khắc phục các vấn đề bảo mật thông qua việc phát triển và áp dụng bản vá lỗi thường cao gấp nhiều lần so với việc sửa chữa lỗi bảo mật trong giai đoạn đầu của quy trình phát triển phần mềm.
1.1.2 Các kỹ thuật tiêu biểu
Lịch sử cho thấy rằng các chương trình thường bị tấn công do khai thác lỗi lập trình và lỗi logic Các chuyên gia bảo mật đã phân tích hàng ngàn báo cáo về các cuộc tấn công và phát hiện rằng hầu hết lỗ hổng bảo mật xuất phát từ một số lỗi lập trình phổ biến Bằng cách nhận diện và nghiên cứu các kiểu tấn công này, chúng ta có thể thực hiện các biện pháp chủ động nhằm giảm thiểu hoặc loại bỏ lỗ hổng trong chương trình trước khi triển khai.
Các lỗ hổng này sẽ được trình bày chi tiết trong Chương 2 của luận văn.
Tổng quan về phân tích mã nguồn loại bỏ lỗi lập trình làm tăng hiệu quả của chương trình
hiệu quả của chương trình
1.2.1 Làm tăng hiệu quả của chương trình máy tính
Các bài toán thực tế dẫn đến sự phát triển của các chương trình máy tính và phần mềm ứng dụng nhằm giải quyết những vấn đề đó Tuy nhiên, nhiệm vụ của các phần mềm này không chỉ dừng lại ở việc giải quyết bài toán mà còn phải đáp ứng nhiều tiêu chí khác nhau.
Sự hiệu quả của ứng dụng là tiêu chí quan trọng để đánh giá khả năng giải quyết vấn đề Nó có thể được cảm nhận qua tốc độ xử lý: “Ứng dụng có giải quyết vấn đề nhanh chóng không?” và khả năng xử lý nhiều vấn đề cùng lúc Việc cải thiện hiệu quả phần mềm không chỉ giúp tiết kiệm chi phí mà còn giảm thiểu nhu cầu nâng cấp phần cứng khi ứng dụng được sử dụng rộng rãi Nếu ứng dụng hoạt động kém hiệu quả, chi phí phát sinh sẽ tăng theo quy mô sử dụng Ngược lại, ứng dụng hiệu quả sẽ giúp giảm thiểu chi phí nâng cấp phần cứng, hoặc thậm chí không cần nâng cấp.
Việc phát triển ứng dụng hiệu quả đòi hỏi sự tối ưu hóa chương trình ngay từ giai đoạn đầu Tối ưu hóa không chỉ giúp nâng cao hiệu suất sản phẩm mà còn là yếu tố quyết định trong quá trình phát triển phần mềm Để đạt được mục tiêu này, cần áp dụng các phương pháp tối ưu hóa ngay từ khi viết mã nguồn, nhằm đảm bảo sản phẩm hoạt động hiệu quả nhất.
1.2.1.1 Tối ưu hóa chương trình là gì?
Tối ưu hóa chương trình trong công nghệ thông tin và truyền thông là quá trình điều chỉnh phần mềm để nâng cao hiệu suất hoạt động, giảm thiểu việc sử dụng tài nguyên Điều này có thể bao gồm việc cải thiện tốc độ thực thi, giảm lượng bộ nhớ và tài nguyên tiêu thụ, cũng như tiết kiệm điện năng.
Tối ưu hóa thường liên quan đến việc cải thiện một hoặc nhiều khía cạnh của hệ thống, nhưng không có giải pháp nào hoàn hảo cho mọi vấn đề Trong các hệ thống yêu cầu thời gian thực thi ngắn, có thể cần sử dụng nhiều bộ nhớ hơn để đạt được mục tiêu Ngược lại, nếu bộ nhớ có chi phí cao, việc tiết kiệm bộ nhớ sẽ trở thành ưu tiên hàng đầu, dẫn đến việc chọn các giải thuật có thể làm tăng thời gian thực thi Do đó, việc tìm kiếm giải pháp đáp ứng tất cả yêu cầu của hệ thống là rất khó khăn, buộc các nhà phát triển phải chấp nhận các đánh đổi để tập trung vào khía cạnh quan trọng nhất.
Tối ưu mã nguồn là phương pháp cải thiện hiệu suất chương trình bằng cách thay thế các đoạn mã cũ bằng mã mới hiệu quả hơn, mà không làm thay đổi hành vi hay chức năng của chương trình Kết quả là, chương trình sẽ hoạt động nhanh hơn, tiêu thụ ít tài nguyên và điện năng hơn, đồng thời vẫn giữ nguyên nhiệm vụ ban đầu.
Để tối ưu mã nguồn và đảm bảo lập trình an toàn, câu hỏi quan trọng cần đặt ra là: “Làm thế nào để đánh giá hiệu quả và độ an toàn của mã nguồn hiện tại?”
Tối ưu mã nguồn và lập trình an toàn là những lĩnh vực quan trọng xuất phát từ nhu cầu thực tế, nhằm cải thiện hiệu suất chương trình và giảm thiểu chi phí triển khai Lập trình viên cần dựa vào các tiêu chí hệ thống để thực hiện các thay đổi, giúp chương trình hoạt động hiệu quả hơn và tiết kiệm tài nguyên, đồng thời đảm bảo tính chính xác Trong lĩnh vực lập trình an toàn, việc phân tích các báo cáo về sự cố bảo mật từ nhiều nguồn giúp xác định các lỗ hổng và lỗi phổ biến Các lập trình viên sẽ dựa vào kinh nghiệm thực tế và thống kê từ các tổ chức uy tín để cải thiện chất lượng mã nguồn của mình.
Những khuyến nghị từ kinh nghiệm thực tế đóng vai trò là kim chỉ nam trong việc đánh giá tính tối ưu và an toàn của mã nguồn trong luận văn này Các quy tắc thực nghiệm, hay còn gọi là luật, được sử dụng để hướng dẫn quá trình đánh giá này.
Trong luận văn này, NVLV quan tâm đến hai loại luật chính:
Luật về tối ưu mã nguồn
Luật về lập trình an toàn
Một vài ví dụ về hai loại luật này sẽ được trình bày trong phần 1.2.3
Việc lựa chọn nguồn tài nguyên liên quan đến luật là rất quan trọng, vì nguồn gốc của luật sẽ xác định độ tin cậy khi áp dụng vào phân tích mã nguồn.
Chúng ta sẽ lựa chọn các nguồn tài liệu an toàn và đáng tin cậy, bao gồm trang tài liệu trực tuyến của Oracle cho mã nguồn Java, tài liệu từ Microsoft cho ngôn ngữ NET, và hướng dẫn từ các công ty công nghệ lớn như Google và AppPerfect Ngoài ra, các cuốn sách nổi tiếng về tối ưu mã nguồn và lập trình an toàn cũng sẽ được tham khảo Những luật liên quan sẽ được trình bày chi tiết trong các chương tiếp theo.
1.2.3 Cây cú pháp trừu tƣợng
Việc áp dụng luật vào mã nguồn là một yếu tố quan trọng cần chú ý Để áp dụng luật hiệu quả, trước tiên, chúng ta cần hiểu rõ nội dung của luật, đối tượng áp dụng và cách thức thực hiện Các luật liên quan đến tối ưu mã nguồn và lập trình an toàn thường được đề cập trong những trường hợp cụ thể của mã nguồn Dưới đây, chúng ta sẽ xem xét một số ví dụ về luật để làm rõ vấn đề này.
Sử dụng phương thức String.Length để so sánh với chuỗi rỗng [16] Ví dụ: public bool IsEmpty(string str)
{ return str.Equals(""); // Vi phạm
Nên sửa lại thành: public bool IsEmpty(string str)
Giải thích: có nhiều cách để kiểm tra chuỗi là rỗng hay không Cách dùng
Trong C#, việc so sánh độ dài chuỗi bằng thuộc tính Length là phương pháp nhanh nhất và được khuyến nghị bởi FxCop và StyleCop Tuy nhiên, cần lưu ý rằng việc so sánh này có thể không chính xác khi chuỗi là rỗng hoặc không đồng nhất.
Sử dụng Try…Catch…Finally Ví dụ: public void TryToCatchException()
//Thiếu Finally public void TryToCatchException()
Catch(Exception ex){//Có Exception
Việc sử dụng các lệnh Try…Catch là hoàn toàn chính xác, tuy nhiên, cần lưu ý rằng nên thêm câu lệnh Finally để xử lý lỗi một cách hiệu quả FxCop và StyleCop khuyến nghị rằng câu lệnh Finally nên được bao gồm trong tất cả các cấu trúc Try…Catch để đảm bảo tính toàn vẹn của mã nguồn.
Tất cả các biến nên là “private” [14] Ví dụ: class Person
{ string name; // Vi phạm int age; // Vi phạm
Nên sửa lại thành: class Person
{ private string name; // Đúng private int age; // Đúng
Giải thích: việc khai báo thêm Private nhằm mục đích khai báo tường minh việc biến name và age là biến chỉ dùng trong lớp Person
Dựa trên những ví dụ cụ thể trên, chúng ta nhận thấy các luật luôn áp dụng trên các mục tiêu cụ thể của mã nguồn
Trong ví dụ đầu tiên, luật áp dụng cho việc gọi phương thức của một đối tượng kiểu string trong NET, cụ thể là "str.Equals("")" Việc sửa đổi này sẽ ảnh hưởng đến mã nguồn bằng cách tạo ra một lời gọi phương thức khác.
Nhiệm vụ chính của luận văn
Từ các trình bày ở trên, trong luận văn đặt ra các nhiệm vụ cụ thể như sau:
(1) Nghiên cứu các phương pháp nâng cao kỹ thuật của viết mã loại bỏ những lỗi lập trình nhằm tăng hiệu quả của chương trình phần mềm
Khám phá các lỗ hổng bảo mật, giải pháp và quy tắc viết mã nguồn an toàn trên nền tảng NET Framework để làm chủ những phương pháp và quy tắc này.
(3) Áp dụng phương pháp ngăn chặn lỗi bảo mật qua sản phẩm phần mềm Website dientutieudung.vn để chứng minh hiệu quả của phương pháp.
Kết chương
Trong chương đầu tiên, chúng ta đã khám phá các khái niệm cơ bản về lập trình an toàn, cùng với những kỹ thuật viết mã an toàn quan trọng trong phát triển phần mềm Bên cạnh đó, các khái niệm liên quan đến phân tích mã nguồn, như luật tối ưu mã nguồn và lập trình an toàn, cũng như cây cú pháp trừu tượng (AST), đã được đề cập để làm rõ tầm quan trọng của chúng trong thực tiễn.
Tìm hiểu một số lỗ hổng bảo mật và các kỹ thuật loại bỏ lỗi lập trình làm tăng hiệu quả cho chương trình
Một số lỗ hổng bảo mật phổ biến
Trong chương trước, chúng ta đã đề cập rằng hầu hết các chương trình thường bị tấn công do khai thác lỗi lập trình và lỗi logic Bằng cách nhận diện và nghiên cứu các kiểu tấn công phổ biến hiện nay, chúng ta có thể thực hiện các biện pháp chủ động nhằm giảm thiểu hoặc loại bỏ các lỗ hổng trong chương trình trước khi đưa vào triển khai.
2.1.1 Tấn công bằng lỗi tràn bộ đệm (Buffer Overflow)
Lỗi tràn bộ đệm xảy ra khi một chương trình cho phép ghi dữ liệu đầu vào vượt quá phạm vi bộ nhớ đã được cấp phát, dẫn đến nguy cơ bị tấn công và kiểm soát ứng dụng Các ngôn ngữ lập trình như C và C++ thường dễ bị tổn thương hơn, trong khi Java, C# và Visual Basic có cơ chế kiểm soát biên giúp giảm thiểu rủi ro này.
{ char buffer1[5] = "VXYZ"; char buffer2[5] = "PQRS"; strcpy(buffer2, argv[1]); printf("buffer1:%s,bufffer2:%s\n",buffer1,buffer2);return 0;
Trong ví dụ trên, tham số được sao chép vào mảng buffer2 mà không kiểm tra kích thước đủ để chứa, dẫn đến nguy cơ tràn bộ đệm.
Để đảm bảo an toàn khi thực hiện các thao tác ghi trên vùng bộ nhớ, cần luôn kiểm tra kích thước và phạm vi vùng bộ nhớ khả dụng.
2.1.2 Tấn công thông qua lỗi tràn số nguyên (Integer overflow)
Lỗi tràn số nguyên xảy ra khi một biến nguyên cố gắng lưu trữ giá trị vượt quá khoảng giá trị cho phép, thường là kết quả của các phép toán trên số nguyên Ví dụ, một biến int có thể lưu trữ giá trị tối đa là 2.147.483.647, vì vậy khi giá trị vượt quá mức này, sẽ dẫn đến lỗi tràn.
Tràn số nguyên xảy ra khi biến “number” liên tục cộng dồn các giá trị nguyên mà không kiểm soát các toán hạng, dẫn đến việc kết quả không phản ánh đúng giá trị mong muốn của lập trình viên Điều này tạo ra rủi ro về lỗi tràn số nguyên trong mã nguồn.
Giải pháp đề xuất: Kiểm tra các toán hạng trong các biểu thức tính toán số nguyên nếu cần thiết
2.1.3 Tấn công qua lỗi định dạng chuỗi (Format string attack)
Kiểu tấn công này xảy ra khi dữ liệu đầu vào từ người dùng được xử lý như một câu lệnh, cho phép kẻ tấn công truy cập thông tin nhạy cảm, thực thi mã độc hoặc lộ dữ liệu trong ngăn xếp Các chuỗi ký tự độc hại như %x hay %n có thể được sử dụng để khai thác lỗ hổng Ngôn ngữ lập trình C và C++ là những ngôn ngữ dễ bị tấn công nhất.
Ví dụ về tấn công định dạng chuỗi
Trong ví dụ trên, nếu đối số đầu vào có chứa một tham số chuỗi như %x hay
%n, chương trình sẽ in ra những kết quả không mong muốn Sử dụng printf(argv[1]) thay cho printf("%s", argv[1]) khiến cho chương trình dễ bị tấn công hơn
Giải pháp đề xuất: Không sử dụng các hàm xuất chuỗi theo các đặc tả tựa như %s, %n…
2.1.4 Tấn công bằng việc chèn câu lệnh (Command Injection)
Chèn câu lệnh là một dạng tấn công mạng, trong đó mã độc hại được tiêm vào dữ liệu đầu vào và sau đó được thực thi qua "shell" hoặc các ngôn ngữ thông dịch khác Kỹ thuật này có thể dẫn đến việc chạy các lệnh không mong muốn trên hệ thống, gây ra rủi ro bảo mật nghiêm trọng.
{ char command[MAX]="head"; strcat(command, argv[1]); system(command);
Ví dụ về chèn câu lệnh (command injection)
Chương trình thực thi lệnh UNIX “head filename” để hiển thị 10 dòng đầu tiên của tệp tin được nhập vào Hàm “strcat” kết hợp lệnh với tên tệp, trong khi hàm “system” thực hiện lệnh đó Tuy nhiên, do không có xác nhận đầu vào, kẻ tấn công có thể chèn lệnh độc hại vào dữ liệu, chẳng hạn như “hello.c; rm welcome.c”, dẫn đến việc chương trình hiển thị nội dung của “hello.c” và xóa tệp “welcome.c”.
Giải pháp đề xuất: Kiểm tra câu lệnh truyền vào trước khi thực hiện
2.1.5 Tấn công bằng chèn câu truy vấn SQL (SQL Injection)
Chèn câu truy vấn SQL là một kỹ thuật tấn công cho phép kẻ xấu khai thác lỗ hổng trong việc kiểm tra dữ liệu đầu vào của ứng dụng web và thông báo lỗi từ hệ quản trị cơ sở dữ liệu Tấn công này có thể dẫn đến việc thực hiện các thao tác như xóa, chèn, hoặc cập nhật dữ liệu trong cơ sở dữ liệu của ứng dụng, thậm chí kiểm soát cả server mà ứng dụng đang hoạt động Lỗi này thường xuất hiện trên các ứng dụng web sử dụng hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, và DB2.
Tấn công SQL injection xảy ra do việc không kiểm tra ký tự thoát trong câu truy vấn, dẫn đến lỗ hổng bảo mật khi dữ liệu đầu vào không được kiểm soát Hậu quả là người dùng có thể thực hiện các truy vấn không mong muốn đối với cơ sở dữ liệu của ứng dụng Ví dụ, đoạn mã sau đây minh họa cho lỗi này: statement = "SELECT * FROM users WHERE name = '" + userName + "';".
Câu lệnh này nhằm mục đích trả về các bản ghi tên người dùng từ bảng người dùng, nhưng nếu biến “userName” bị nhập sai cách bởi người dùng ác ý, nó có thể biến thành một câu truy vấn SQL với mục đích khác so với ý định ban đầu của tác giả.
Ví dụ, ta nhập vào giá trị của biến “userName” như sau: a' or 't'='t
Khiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
Khi sử dụng đoạn mã trong thủ tục xác thực, ví dụ này yêu cầu người dùng phải chọn một tên hợp lệ do điều kiện 't'='t' luôn đúng Mặc dù hầu hết các SQL server cho phép thực hiện nhiều truy vấn trong một lần gọi, một số API SQL như mysql_query của PHP lại không hỗ trợ điều này vì lý do bảo mật Điều này chỉ ngăn chặn tin tặc tấn công bằng cách sử dụng các câu lệnh riêng lẻ mà không ngăn chặn việc thay đổi từ trong cú pháp truy vấn Các giá trị của biến “userName” trong câu truy vấn có thể dẫn đến việc xóa người dùng từ bảng, tương tự như việc xóa toàn bộ dữ liệu trong bảng, do đó tiết lộ thông tin của tất cả người dùng Ví dụ này minh họa một API cho phép thực hiện nhiều truy vấn cùng lúc với cú pháp cuối cùng như sau: a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't'.
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM DATA WHERE 't' = 't';
Nếu chương trình không được kiểm soát chặt chẽ, có thể xảy ra những truy vấn không mong muốn, dẫn đến hậu quả nghiêm trọng như việc cơ sở dữ liệu bị phá hoại hoặc thông tin quan trọng bị đánh cắp.
Để đảm bảo an toàn cho câu truy vấn đầu vào, cần kiểm tra kỹ lưỡng hoặc sử dụng các lớp được cung cấp sẵn trong các ngôn ngữ lập trình, chẳng hạn như Parameters trong NET và lớp PreparedStatement trong Java.
2.1.6 Tấn công dựa trên lỗi tương tranh (Race condition)
Tương tranh hay “Race condition” còn có tên gọi khác là “Time of check to time of use”, viết tắt là “TOCTOU” hoặc “TOCTTOU” [6,7]
Quá trình tấn công sử dụng tương tranh thường diễn ra theo kịch bản sau:
Hình 2: Quá trình tương tranh
Bước 1: Một nguồn tài nguyên (R) được kiểm tra với một giá trị cụ thể nào đó (X)
Bước 2: Giá trị của nguồn này (R) sau đó bị thay đổi (Y)
Kết chương
Trong chương này, chúng ta đã khám phá các kỹ thuật tối ưu mã nguồn cơ bản nhằm nâng cao hiệu năng chương trình và nhận diện những lỗi thường gặp trong lập trình có thể dẫn đến nguy cơ tấn công an ninh Điều này nhấn mạnh tầm quan trọng của việc tuân thủ các quy tắc trong quá trình cài đặt và triển khai ứng dụng.
Các kỹ thuật và quy tắc viết mã an toàn áp dụng trong xây dựng phần mềm trên nền tảng NET Framework
Quy trình chi tiết kỹ thuật viết mã an toàn và loại bỏ lỗi lập trình
Trong chương đầu, chúng ta đã tìm hiểu các khái niệm cơ bản về luật Để áp dụng hiệu quả các quy định này trong việc phát triển ứng dụng, cần khai thác thông tin quan trọng liên quan đến luật.
Luật nói về cái gì?
Tại sao lại phải hoặc nên áp dụng luật này?
Nó có hiệu quả trong mọi trường hợp hay không? Khi nào nên áp dụng?
Áp dụng nó như thế nào?
Để tối ưu mã nguồn và lập trình an toàn, chúng ta cần tìm hiểu các kỹ thuật phổ biến và giải pháp liên quan, từ đó nhận diện mối liên hệ giữa những kỹ thuật này và các quy định pháp luật sẽ áp dụng sau này Những kỹ thuật được đề cập là chung, có thể áp dụng cho nhiều ngôn ngữ lập trình khác nhau.
3.1.1 Xây dựng tập luật Đây là công việc đầu tiên phải hoàn thành trước khi bắt tay vào triển khai ứng dụng Sau khi chọn được nguồn các luật đủ uy tín và tin cậy, chúng ta sẽ dựa theo những gì mà các nguồn này cung cấp để xây dựng nên tập luật cụ thể có thể áp dụng trong ứng dụng mà đồ án này sẽ triển khai
Các luật mà chúng ta xây dựng cần bao gồm thông tin hữu ích như ví dụ và cách sử dụng để đảm bảo mã nguồn không vi phạm Những thông tin này giúp người sử dụng hiểu rõ hơn về luật, từ đó họ có thể tự tránh vi phạm mà không cần sự hỗ trợ từ ứng dụng sau này.
3.1.2 Chiến lƣợc áp dụng luật
3.1.2.1 Sử dụng luật phân tích mã nguồn
Nhiệm vụ chính của luận văn này là phát hiện các thành phần tiềm năng trong mã nguồn bằng cách sử dụng tập luật tổng hợp từ nhiều nguồn khác nhau Như đã đề cập trước đó, mỗi luật sẽ ảnh hưởng đến các thành phần khác nhau của mã nguồn, được hình thành từ quá trình phân tích mã nguồn thành cây cú pháp trừu tượng (AST) Do đó, chúng tôi sẽ áp dụng một chiến lược cụ thể để phát hiện các thành phần tiềm năng này.
Bước 1: Với từng tệp mã nguồn trong folder/project, chúng ta phân tích chúng thành một cây cú pháp trừu tượng
Bước 2: Chúng ta phân loại các thành phần của mỗi cây cú pháp trừu tượng thành những nhóm đồng nhất, chẳng hạn như nhóm chứa các lời gọi phương thức và nhóm chứa các khai báo biến.
Bước 3: Đối với từng luật trong bộ luật đã xây dựng, chúng ta áp dụng luật đó vào các thành phần mà luật ảnh hưởng Nếu các thành phần này vi phạm các điều kiện được quy định, chúng sẽ trở thành những thành phần tiềm năng.
Bước 4: Đối với mỗi thành phần tiềm năng đã được phát hiện, chúng ta sẽ thu thập thông tin cần thiết và tổng hợp vào một danh sách Danh sách này sẽ được gửi lại cho người sử dụng.
Việc áp dụng luật trong lập trình có thể rất đa dạng và phụ thuộc vào ngữ nghĩa của chương trình Do đó, các thành phần tiềm năng cần được liệt kê đầy đủ để lập trình viên có thể quyết định áp dụng hay không áp dụng các luật vào mã nguồn của mình.
3.1.2.2 Sử dụng luật thay đổi mã nguồn
Sau khi phân tích mã nguồn để xác định các thành phần tiềm năng, bước tiếp theo là tìm cách điều chỉnh mã nguồn để tuân thủ luật pháp Việc sửa đổi và điều chỉnh mã nguồn là nhiệm vụ quan trọng mà ứng dụng cần thực hiện Tuy nhiên, không phải mọi quy định pháp luật đều có thể dễ dàng thay đổi; điều này thường phụ thuộc vào ngữ nghĩa của chương trình, do đó, trách nhiệm sửa chữa sẽ thuộc về lập trình viên.
Việc sửa chữa mã nguồn được thực hiện qua các bước sau:
Bước đầu tiên là chọn một thành phần tiềm năng từ danh sách phát hiện, vì thành phần này sẽ cung cấp đầy đủ thông tin về luật mà nó đã vi phạm.
Bước 2: Kiểm tra xem thành phần đó còn vi phạm luật hay không bằng cách áp dụng kỹ thuật phân tích mã nguồn như cây cú pháp trừu tượng Nếu vẫn còn vi phạm, tức là chưa được sửa chữa, sẽ có hai trường hợp xảy ra.
Nếu luật nó không phụ thuộc nhiều vào ngữ nghĩa chương trình, một sự thay đổi mã nguồn tự động sẽ được đưa ra
Nếu luật phụ thuộc vào ngữ nghĩa của chương trình, lập trình viên sẽ tự động điều chỉnh mã nguồn dựa trên thông tin chi tiết từ luật đó.
Bước 3: Sự thay đổi mã nguồn được áp dụng
Các luật tự động kiểm tra tính vi phạm và đưa ra cách sửa chữa Do đó, ứng dụng cần phát triển một chiến lược tổng quát để đơn giản hóa quá trình sửa chữa, có thể là tự động hoặc cung cấp gợi ý cho lập trình viên.
3.1.3 Ƣu điểm của những chiến lƣợc đề xuất
Những chiến lược đã đề xuất (phân tích – thay đổi mã nguồn) có một số ưu điểm sau:
Chiến lược được xây dựng một cách rõ ràng và mạch lạc, thể hiện rõ mục tiêu và ý đồ Điều này không chỉ giúp tăng cường sự hiểu biết mà còn tạo điều kiện thuận lợi cho quá trình triển khai và cài đặt.
Đối với chiến lƣợc phân tích mã nguồn:
Quy trình phân tích mã nguồn tìm kiếm lỗ hổng bảo mật
Phân tích mã nguồn để phát hiện lỗ hổng bảo mật là một nhiệm vụ đầy thách thức Điều này chủ yếu do hai nguyên nhân: đầu tiên, hầu hết các lỗ hổng bảo mật xuất phát từ lỗi lập trình liên quan đến việc không kiểm tra đầu vào; thứ hai, mỗi ngôn ngữ lập trình có ngữ cảnh và cách viết riêng, dẫn đến việc cần có các mẫu thử khác nhau cho từng ngôn ngữ Thêm vào đó, nhiều lỗ hổng chỉ được phát hiện khi phần mềm đã hoàn thành hoặc thông qua các sản phẩm demo được kiểm tra bởi các chuyên gia phân tích bảo mật.
Trong luận văn này, tác giả đề xuất một phương pháp phân tích mã nguồn nhằm cảnh báo các đoạn mã có nguy cơ gây ra lỗ hổng bảo mật nghiêm trọng Các lập trình viên sẽ phân tích các lỗi cảnh báo và đưa ra cách khắc phục Chúng ta sẽ tìm hiểu về "Cheat Sheet", bảng chứa các mẫu thử và đoạn mã thường gây ra lỗ hổng bảo mật Chương trình phân tích sử dụng Cheat Sheet để quét mã nguồn dự án, ví dụ như phát hiện lỗ hổng SQL Injection qua các câu truy vấn SQL chèn trực tiếp vào mã Việc quét xung quanh các từ khóa SQL như SELECT, WHERE, và AND giúp tăng khả năng phát hiện lỗ hổng nhờ vào nhiều mẫu thử trong bảng Cheat Sheet.
Dưới đây là các bước phân tích mã nguồn:
Để nâng cao hiệu quả bảo mật, bước đầu tiên là xây dựng hoặc cập nhật các bảng Cheat Sheet cho từng lỗ hổng bảo mật dựa trên kinh nghiệm của các chuyên gia Việc so sánh chuỗi bằng phương pháp Regex sẽ giúp đạt được kết quả chính xác hơn.
Bước 3: Chương trình sẽ kiểm tra từng đoạn mã nguồn và nếu phát hiện chuỗi mã trùng với mẫu thử trong bảng Cheat Sheet, nó sẽ đánh dấu đoạn mã đó, đưa vào danh sách có nguy cơ gây nguy hiểm và thông báo cho lập trình viên.
Việc tự động sửa lỗi các lỗ hổng trong mã nguồn thường không mang lại hiệu quả cao do độ phức tạp của vấn đề Mỗi khi có cảnh báo, chương trình sẽ cung cấp cho lập trình viên hướng dẫn sửa lỗi và mô tả chi tiết về lỗi, giúp họ khắc phục nhanh chóng và hiệu quả hơn.
Các kỹ thuật điển hình ngăn chặn lỗ hổng bảo mật áp dụng trên nền tảng NET Framework
Công nghệ NET Framework mang đến cho lập trình viên một nền tảng mạnh mẽ, giúp xây dựng các ứng dụng an toàn và hiệu suất cao Việc tuân thủ các quy định của Microsoft sẽ cải thiện đáng kể hiệu năng của ứng dụng.
3.3.1 Các kỹ thuật ngăn chặn lỗ hổng bảo mật
Trong chương 2, mục 2.1, chúng ta đã thảo luận về các kỹ thuật viết mã an toàn, đồng thời nêu rõ những lỗ hổng bảo mật phổ biến và đặc điểm của chúng Hiện tại, chúng ta sẽ trình bày các giải pháp cụ thể cho từng vấn đề, tập trung vào một ngôn ngữ hoặc nền tảng nhất định.
Trong bài viết này, chúng tôi sẽ giới thiệu một số lỗ hổng phổ biến nhất trong ứng dụng web để giúp bạn hiểu rõ hơn về cách giải quyết các vấn đề này.
3.3.1.1 Kiểm tra dữ liệu đầu vào (Validate Input)
.NET Framework cung cấp cho lập trình viên một số công cụ dùng để kiểm tra đầu vào, gọi là Validation Web Controls [19,32,36]
Validation Web Controls là công cụ thiết kế nhằm kiểm tra dữ liệu nhập từ người dùng trước khi tiến hành các tác vụ tiếp theo Quá trình này diễn ra trên máy khách, và nếu người dùng không đáp ứng đủ yêu cầu đầu vào, hệ thống sẽ hiển thị thông báo để thông báo cho họ.
Hiện tại có 5 công cụ cho lập trình lựa chọn để kiểm tra đầu vào:
Tên công cụ Mục đích
RequiredFieldValidator Chắc chắn dữ liệu được nhập Dành cho những form yêu cầu bắt buộc cần nhập
CompareValidator So sánh giá trị nhập với một form hoặc một giá trị có sẵn Dùng để kiểm tra chéo giữa 2 form khác nhau
Cũng dùng để kiểm tra kiểu nhập vào form: là chuỗi, hoặc số …
RangeValidator Dùng để kiểm tra việc nhập dữ liệu có nằm trong một khoảng giá trị hay là không
RegularExpressionValidator kiểm tra dữ liệu nhập vào theo một mẫu đã định sẵn, thường sử dụng Regex Trong khi đó, CustomValidator cho phép lập trình viên tự xây dựng các logic để kiểm tra đầu vào theo nhu cầu riêng.
Bảng 12: Các công cụ dùng để kiểm tra đầu vào
Trong ASP.NET, việc sử dụng các điều khiển xác thực (Validation Web Controls) là rất quan trọng để kiểm tra dữ liệu đầu vào trực tiếp trên biểu mẫu Điều này không chỉ giúp giảm thiểu lỗi mà còn nâng cao tính chính xác và hiệu quả của ứng dụng.
Để kiểm tra và xác thực dữ liệu từ các nguồn như cookies, URL/query, HTTP Headers, và files, lập trình viên cần sử dụng lớp Regex, sẽ được giải thích chi tiết trong phần 3.1.1.4.
3.3.1.2 Tràn bộ đệm (Buffer Overflow)
.NET Framework cung cấp các tính năng giúp loại bỏ nguy cơ lỗi tràn bộ đệm, đảm bảo an toàn cho ứng dụng nhờ vào sự quản lý của CLR (Common Language Runtime) Dưới đây là các thành phần của CLR cùng với nhiệm vụ của từng phần.
Garbage Collection (GC): Bộ phận thu gom rác
CLR tự động quản lý bộ nhớ để giảm thiểu rò rỉ bộ nhớ Khi cần thiết, Garbage Collector (GC) sẽ tự động giải phóng các vùng nhớ không còn được tham chiếu, giúp lập trình viên không phải lo lắng về việc này, trừ khi họ muốn thực hiện một cách thủ công.
CAS quản lý quyền hạn cho các chương trình dựa trên thiết lập bảo mật của máy Ví dụ, nếu thiết lập cho phép chương trình sửa đổi hoặc tạo file mới nhưng không cho phép xóa file, CAS sẽ đảm bảo rằng các đoạn mã tuân thủ các quy định này.
Code Verification: Bộ phận chứng nhận đoạn mã
Nó đảm bảo việc thực thi mã chính xác và an toàn, ngăn chặn các hành động trái phép như truy cập vào vùng bộ nhớ không được phép, đồng thời bảo vệ kiểu dữ liệu.
IL-to-native translators and optimizer's:
Bộ phận chuyển đổi IL thành mã máy và tối ưu hóa chương trình là CLR, sử dụng trình biên dịch JIT để chuyển mã IL thành mã máy Đồng thời, CLR cũng điều chỉnh theo đặc điểm của máy để tối ưu hóa việc thực thi mã.
Với tính năng quản lý chặt chẽ của CLR, Buffer Overflow sẽ được ngăn chặn hiệu quả, giúp các lập trình viên yên tâm hơn trong việc kiểm tra và khắc phục lỗ hổng bảo mật này.
3.3.1.3 Thực thi mã script độc - XSS (Cross Site Scripting)
Trong chương 2, chúng ta đã xác định rằng, để ngăn chặn được XSS, thì chúng ta cần phải làm những việc sau:
Lọc và kiểm tra tất cả những thông tin người dùng nhập
Thiết lập tập kí tự và ngôn ngữ địa phương cho mỗi trang được sinh bởi web server
Mã hóa tất cả các kí tự đặc biệt thành những định dạng của kí tự ASCII/Unicode
Để hiển thị dữ liệu đặc biệt, cần lọc và mã hóa các kí tự đặc biệt Để kiểm tra dữ liệu đầu vào, tham khảo phần 3.1.1.1, nơi mô tả chi tiết các công cụ kiểm tra đầu vào của NET Framework Để thiết lập các kí tự và ngôn ngữ địa phương, có thể định nghĩa requestEncoding và responseEncoding trong các thuộc tính của phần tử.
nằm trong file web.config của ứng dụng [32]
Trong ASP.NET, thành phần Request Validation được thiết lập mặc định để kiểm tra các nhãn HTML và ký tự đặc biệt, nhằm ngăn chặn việc gửi thông tin không an toàn lên web server Điều này giúp bảo vệ ứng dụng khỏi việc người dùng chèn mã script độc hại Bên cạnh đó, Request Validation cũng thực hiện kiểm tra tất cả dữ liệu có thể chứa danh sách nguy hiểm, và nếu phát hiện bất kỳ vấn đề nào, hệ thống sẽ thông báo lỗi cho người dùng.
Các quy tắc viết mã nguồn áp dụng trên nền NET Framework
3.4.1 Mục tiêu của quy tắc là gì?
Chúng ta đã phát triển một chiến lược phân tích mã nguồn dựa trên một tập luật cụ thể nhằm phát hiện lỗi trong quá trình phát triển phần mềm Để đánh giá hiệu quả và tính an toàn của mã nguồn, chúng ta cần dựa vào những quy tắc được hình thành từ các thực nghiệm thực tế, giúp nâng cao độ an toàn và hiệu quả khi áp dụng các luật này vào mã nguồn của chương trình.
Mỗi ngôn ngữ lập trình đều có những quy tắc rõ ràng, hay còn gọi là văn hóa viết mã nguồn, giúp lập trình viên dễ dàng phát hiện lỗi Hiện nay, với sự đa dạng của các ngôn ngữ lập trình, các quy tắc này thường tương đồng, tạo điều kiện thuận lợi cho việc chuyển đổi giữa các ngôn ngữ mà không cần học quá nhiều Trong vòng đời phát triển phần mềm (SDLC), việc tuân thủ quy tắc giúp mã nguồn trở nên rõ ràng, từ đó việc bảo trì phần mềm khi gặp sự cố sẽ diễn ra nhanh chóng Lỗi trong chương trình, dù lớn hay nhỏ, là điều bình thường và mọi chương trình đều phải đối mặt với ít nhất một lỗi Mục tiêu của các quy tắc này là nhằm giải quyết hiệu quả các vấn đề phát sinh khi chương trình gặp lỗi.
Bảo trì phần mềm nhanh chóng là điều cần thiết để giảm thiểu chi phí cho cả người dùng và nhà phát triển Khi phần mềm đã được thương mại hóa, việc khắc phục các lỗi phát sinh cần được thực hiện kịp thời nhằm đảm bảo hiệu suất và sự hài lòng của khách hàng.
Việc xuất ra các hướng dẫn và chú thích cho các lớp, thành viên và hàm trong phần mềm là rất quan trọng, nhất là khi phần mềm chứa hàng nghìn dòng mã và đối tượng cần khai báo Chú thích rõ ràng giúp các thành viên trong đội phát triển dễ dàng bảo trì và sử dụng mã nguồn, đồng thời hỗ trợ người viết mã khi cần xem lại trong tương lai Quy tắc chung trong việc chú thích không chỉ giúp lập trình viên dễ đọc mà còn tạo điều kiện thuận lợi khi cần xuất tài liệu.
Để làm cho việc đọc mã trở nên hấp dẫn, dễ nhớ và hiểu nhanh hơn, việc áp dụng quy tắc viết mã là rất quan trọng Hãy tưởng tượng một lập trình viên phải xử lý hàng ngàn dòng mã với tên biến không đồng nhất, khoảng cách và vị trí các thành phần lộn xộn; điều này sẽ khiến việc tìm kiếm và hiểu mã trở nên khó khăn và phức tạp Ngược lại, nếu có quy định rõ ràng về cách viết, hiển thị và sắp xếp mã, quá trình làm việc sẽ trở nên dễ dàng và hiệu quả hơn.
3.4.2 Xây dựng quy tắc cho ngôn ngữ lập trình C# dựa trên nền tảng NET
C# là một ngôn ngữ lập trình mới, thuộc nền tảng NET Framework, được phát triển bởi Microsoft sau các ngôn ngữ như C/C++ và Java Ngôn ngữ này kế thừa và cải tiến nhiều quy tắc từ các ngôn ngữ trước đó, nhằm nâng cao hiệu quả trong việc phát triển phần mềm.
Microsoft đã đưa ra nhiều quy tắc viết mã C# nhằm tối ưu hóa mã nguồn cho các nhà phát triển phần mềm Cấu trúc của mỗi quy tắc phụ thuộc vào các phương pháp quản lý khác nhau, nhưng đều bao gồm các thành phần cơ bản.
(1) Nhóm quy tắc: chỉ ra rằng quy tắc này nằm ở nhóm nào
(2) Mã quy tắc: là mã định danh của quy tắc khi thông báo cho lập trình viên
(3) Tên quy tắc: tên ngắn gọn của quy tắc
(4) Mô tả chi tiết: mô tả chi tiết về quy tắc giúp cho lập trình viên hiểu được vấn đề
(5) Cách sửa lỗi: thông báo cho lập trình viên biết làm sao để sửa lỗi
Mỗi quy tắc được thiết lập nhằm phục vụ một mục tiêu cụ thể, giúp tối ưu hóa mã nguồn của chương trình Dựa trên các mục tiêu này, NVLV đã phân loại các quy tắc thành nhiều nhóm khác nhau.
Nhóm bảo trì: tập hợp các quy tắc làm tăng khả năng bảo trì mã nguồn
Nhóm tài liệu là tập hợp các quy tắc nhằm viết và định dạng các mô tả, giải thích, cũng như chú thích cho các đối tượng trong mã nguồn, tương đương với mục tiêu thứ hai.
Việc trình bày mã nguồn đóng vai trò quan trọng trong khả năng đọc và hiểu nhanh của lập trình viên Để đạt được mục tiêu này, nhóm NVLV đã chia thành 5 nhóm quy tắc cụ thể Nhóm đầu tiên là quy tắc đặt tên, yêu cầu cách đặt tên cho biến, hàm, lớp, kiểu dữ liệu và đối tượng trong mã nguồn Nhóm thứ hai liên quan đến việc sắp xếp khuôn mẫu, ví dụ trong C# cần sắp xếp đúng các thành phần thuộc tính như set và get Nhóm hiển thị tập hợp các quy tắc về bố trí mã và khoảng cách giữa các dòng mã Nhóm khả năng đọc mã nguồn đảm bảo rằng mã được định dạng dễ đọc Cuối cùng, nhóm khoảng cách mã nguồn quy định khoảng cách xung quanh các từ khóa và biểu tượng toán tử.
Phụ lục 1 của luận văn trình bày một số quy tắc được phân loại theo nhóm mã nguồn trong ngôn ngữ C# (.NET Framework) Đề tài được giới thiệu trong luận văn sẽ áp dụng hầu hết các quy tắc này trong quá trình xây dựng.
Áp dụng trong xây dựng ứng dụng dientutieudung.vn
3.5.1 Cấu trúc ứng dụng dientutieudung.vn Điện Tử Tiêu Dùng (ĐTTD) là một trang báo mạng, nơi đưa tin về các tin công nghệ, điện tử và gia dụng, được phát triển bởi chính tác giả của luận văn
Cấu trúc của ĐTTD gồm 3 ứng dụng riêng biệt:
(1) Phần 1: CMS – Hệ thống backend
Là nơi các phóng viên đẩy tin bài, xuất bản bài viết, upload files, quản trị người dùng, phân quyền cho người dùng…
(2) Phần 2: Resources – Nơi lưu trữ, tài nguyên, media cho ĐTTD
Tất cả các media, files sẽ được cung cấp từ ứng dụng này
(3) Phần 3: Show – Hệ thống Frontend
Hiển thị các tin bài đã được xuất bản cho người dùng
The system is built on the NET platform and utilizes a 3-Tier architecture, which consists of three distinct layers: the Data Layer, the Business Layer, and the Presentation Layer.
Hình 6: Cấu trúc ứng dụng ĐTTD
3.5.2 Nhận định lỗ hổng bảo mật có thể có trong ứng dụng
Với ứng dụng ĐTTD được chia làm 03 phần riêng biệt như vậy, chúng ta có thể đánh giá khả năng có lỗ hổng ở 3 phần như sau:
STT Tên lỗi Lý do
1 Phân quyền người dùng Có quản lý người dùng bao gồm: Phóng viên,
Biên tập viên, Thư kí (xuất bản tin bài), Quản lý quảng cáo, Quản trị website …
2 SQL Injection Có form đăng nhập và các phần và các tham số trên địa chỉ web ĐTTD
HTML và các kí tự đặc biệt để đăng tin bài
4 Cookies Lưu phiên giao dịch
5 Error handling Bắt các lỗi của website
STT Tên lỗi Lý do
1 XSS Các phóng viên được quyền sử dụng các thẻ
HTML và các kí tự đặc biệt để đăng tin bài
STT Tên lỗi Lý do
1 SQL Injection Là web động nên sẽ có nhiều tham số dễ bị chèn mã độc
2 XSS Các phóng viên được quyền sử dụng các thẻ
HTML và các kí tự đặc biệt để đăng tin bài; có nhiều tham số trên URL
3 Cookies Lưu phiên giao dịch
4 Error handling Lỗi hiển thị của ứng dụng khi có một ai đó cố tình muốn “thử” độ tin cậy của web
3.5.3 Hướng giải quyết các lỗ hổng cho website dientutieudung.vn
3.5.3.1 Áp dụng các quy tắc để tối ưu mã nguồn
Để tối ưu hóa mã nguồn và nâng cao hiệu quả cho website dientutieudung.vn, NVLV đã áp dụng triệt để các quy tắc được nêu trong Phụ lục 2 Những quy tắc này nhằm đảm bảo việc bảo trì dễ dàng trong tương lai, xuất các chú thích thành tài liệu hướng dẫn mã nguồn, và định dạng mã nguồn sao cho dễ đọc và dễ hiểu Dưới đây là một đoạn mã từ website dientutieudung.vn.
/// Chuoi can duoc ma hoa
/// Tra ve chuoi da duoc ma hoa public static string EncryptMD5(string s)
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); byte[] hashedDataBytes;
UTF8Encoding encoder = new UTF8Encoding(); hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(s));
StringBuilder sb = new StringBuilder(); foreach (byte b in hashedDataBytes)
Một đoạn mã dùng để mã hóa chuỗi thành MD5
(1) Để bảo trì website trong tương lai, mỗi lớp (class) nằm trong website là một file riêng biệt, đi kèm tên lớp chính là tên file
(2) Tại mỗi hàm (function), lớp (class), đối tượng… đều được chú thích rõ dàng
(3) Với việc áp dụng các quy tắc đặt tên, cách sắp sếp các khối mã, khoảng cách dòng, khoảng cách các toán tử vv…
/// Loai bo SQL Injection Loai bo cac ki tu dac biet trong SQL
/// Noi dung can loai bo
/// Tra ve noi dung khong con cac ki tu dac biet cua SQL public static string RemoveSQLInjection(string text)
//text = text.Replace("-", ""); text = text.Replace(";", ""); return text;
} Đoạn mã dùng để loại bỏ bớt các kí tự đặc biệt trong việc ngăn chặn SQL Injection
3.5.3.2 Áp dụng các kỹ thuật để ngăn chặn lỗ hổng bảo mật
Mục 3.1 đã mô tả chi tiết cho việc chặn lại các lỗ hổng bảo mật cho một website được viết bằng ASP.NET Và dưới đây là cách để bảo vệ website dientieudung.vn:
STT Tên lỗi Áp dụng
+ Sử dụng các công cụ có sẵn của ASP.NET là Membership để phân quyền cho người dùng
+ Áp dụng các luật từ 3.16 đến 3.22 trong việc quản trị và xác thực người dùng thông qua mật khẩu
+ Áp dụng các luật từ 3.47 đến 3.55 trong việc ngăn chặn lỗi SQL Injection
+ Sử dụng SqlParameter và StoreProcedure để lấy, xóa, sửa, thêm dữ liệu vào CSDL
+ Xây dựng hàm số để loại bỏ và thay thế những từ khóa, kí tự đặc biệt nằm trong các câu lệnh truy vấn
3 XSS + Áp dụng luật từ 3.33 đến 3.41 để ngăn chặn lỗi XSS
+ Chỉ cho phép người dùng được POST những thẻ HTML: table, tr,td, div, p, br, span, quote, h1, h2, h3, h4, h5, h6, h7… Cấm các thẻ script và các thẻ meta, link, style…
+ Xây dựng điều khiển mà cho phép người dùng có thể căn chỉnh, định dạng văn bản một cách trực quan (WYSIWYG)
Người dùng chỉ được phép tải lên máy chủ các loại file và hình ảnh như png, jpg, gif, doc, docx, xls, xlsx, ppt, pptx, zip, rar Tất cả các file có khả năng thực thi như exe, js, com đều bị cấm.
4 Cookies Trong phần đăng nhập, việc phải lưu cookie là không thể tránh khỏi Các luật sau được áp dụng:
+ Mã hóa dữ liệu khi lưu vào Cookie (3.40) + Thiết lập thời gian hết hạn (hết phiên giao dịch) ngắn
Hệ thống CMS của dientutieudung.vn là mục tiêu chính của kẻ tấn công, vì vậy họ luôn tìm cách khai thác lỗi để phát hiện cấu trúc và thông tin cần thiết cho cuộc tấn công Để bảo vệ hệ thống, cần áp dụng triệt để các biện pháp bảo mật của ASP.NET và thực thi nghiêm ngặt luật 3.38.
II Hệ thống Front-end
STT Tên lỗi Áp dụng
1 SQL Injection + Áp dụng các luật từ 3.47 đến 3.55 trong việc ngăn chặn lỗi SQL Injection
Sử dụng SqlParameter và StoreProcedure là phương pháp hiệu quả để lấy dữ liệu từ cơ sở dữ liệu (CSDL) Để tối ưu hóa các câu lệnh truy vấn, cần xây dựng hàm số nhằm loại bỏ và thay thế các từ khóa cũng như ký tự đặc biệt không mong muốn.
2 XSS + Áp dụng luật từ 3.33 đến 3.41 để ngăn chặn lỗi XSS
+ Chỉ cho phép người dùng được POST (trong phần Bình luận của website) những thẻ HTML: p, br Cấm các thẻ script và các thẻ meta, link, style
3 Cookies Website yêu cầu người dùng đăng nhập trước khi bình luận vào nội dung của website Vì vậy các luật sau được áp dụng:
+ Mã hóa dữ liệu khi lưu vào Cookie (3.40) + Thiết lập thời gian hết hạn (hết phiên giao dịch) ngắn
4 Error Áp dụng triệt để các loại bắt lỗi của ASP.NET Luật 3.38
STT Tên lỗi Áp dụng
1 XSS Kiểm tra kiểu file trước khi chạy file
3.5.4 Thử nghiệm và kết quả
3.5.4.1 Phần mềm áp dụng để kiểm tra lỗ hổng bảo mật
Hiện nay, có nhiều phần mềm để kiểm tra và đánh giá mức độ bảo mật của ứng dụng, với mỗi ngôn ngữ sở hữu các công cụ chuyên dụng riêng Đối với NET, công cụ FxCop 10 và StyleCop do Microsoft phát triển là những lựa chọn hiệu quả để đánh giá mã nguồn.
Hình 7: Giao diện phần mềm FxCop
FxCop 10 là công cụ chuyên dùng để phân tích các đoạn mã có quản đã được biên dịch và thông báo các thông tin liên quan về cấu trúc của mã nguồn, ngôn ngữ địa phương (localization), hiệu xuất (performance) và khả năng về bảo mật của chương trình FxCop tập hợp rất nhiều những luật được quy định trong việc lập trình và thiết kế chương trình đã được xây dựng bởi hãng Microsoft để làm cho việc phát triển và bảo trì chương trình một cách nhanh chóng Để xem thêm chi tiết về FxCop có thể xem tại đây: http://msdn.microsoft.com/en- us/library/bb429476(v=vs.80).aspx
SWAAT là công cụ phân tích mã nguồn tĩnh dành cho ứng dụng web, được phát triển trên nền tảng NET với ngôn ngữ C# Công cụ này hoạt động qua giao diện Console và Windows Form, hiện tại đang được cộng đồng phát triển theo dạng Console Khi khởi động, SWAAT đọc các mẫu từ file XML và chuyển đổi chúng thành Regular Expression Trong quá trình phân tích, SWAAT sẽ kiểm tra đoạn mã và nhận diện các lỗi bảo mật phổ biến như SQL Injection và XSS Sau mỗi lần phân tích, SWAAT xuất báo cáo dưới định dạng XML để người dùng tham khảo SWAAT hỗ trợ nhiều ngôn ngữ lập trình như Java, JSP, ASP Net và PHP, và được phát triển bởi OWASP Thông tin chi tiết có thể xem tại trang web của OWASP.
Hình 8: Giao diện cấu hình của StyleCop
StyleCop là công cụ phân tích mã nguồn C# tĩnh được phát triển bởi Microsoft, giúp phát hiện lỗi thiết kế và lỗ hổng trong mã nguồn thông qua các tập luật và hướng dẫn Công cụ này có thể chạy trong Visual Studio hoặc được tích hợp vào các dự án đang phát triển Để biết thêm thông tin chi tiết, hãy truy cập http://stylecop.codeplex.com/.
Trong luận văn này, NVLV tiến hành phân tích và thử nghiệm các quy tắc cũng như hướng dẫn viết mã nguồn trên trang web dientutieudung.vn, như đã trình bày trong mục 3.2 Với việc sử dụng ngôn ngữ lập trình NET (C#), công cụ StyleCop sẽ được áp dụng để phân tích mã nguồn một cách hiệu quả.
Mục tiêu của thử nghiệm này là phát hiện và khắc phục các lỗi đã được chỉ ra ở mục 3.2, nhằm đảm bảo hệ thống website dientutieudung.vn được bảo mật và nâng cao hiệu năng khi có lượng người truy cập đông Đồng thời, các luật trong phần 3.1.2 sẽ được áp dụng vào website này, như đã nêu trong Phụ lục 1 của luận văn.
Hình 9: Kết quả phân tích code của StyleCop cho CMS
Sau khi dùng StyleCop để phân tích thì kết quả như sau:
Tổng cộng có: 0 lỗi; 1030 cảnh báo; 0 thông báo
Hình 10: Kết quả phân tích code của StyleCop cho Show
Kết quả khi dùng StyleCop để phân tích mã nguồn
Kết quả: 0 lỗi; 1018 cảnh báo; 0 thông báo
Kết chương
Trong chương này, chúng tôi đã đề xuất một chiến lược áp dụng các luật đã xây dựng để phát hiện các thành phần tiềm năng trong mã nguồn Chiến lược này mang lại nhiều ưu điểm phù hợp với nhiệm vụ của luận văn Bên cạnh đó, chương cũng giới thiệu phương pháp phân tích mã nguồn nhằm phát hiện các đoạn mã có nguy cơ gây ra lỗ hổng nghiêm trọng trong phần mềm.
Chúng ta sử dụng một nền tảng để phát triển ứng dụng, áp dụng kiến thức từ Chương 2 về lỗ hổng bảo mật nhằm xây dựng chính sách và luật Qua đó, chúng ta phân tích và đánh giá ứng dụng, từ đó xác định kết quả sau khi áp dụng các chính sách và luật này.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Kết luận
Luận văn đã hoàn tất việc nghiên cứu các giải pháp kỹ thuật để cải thiện mã nguồn, nhằm khắc phục lỗi lập trình và nâng cao hiệu suất của chương trình.
Chương 1 của luận văn đã cung cấp các khái niệm cơ bản nhằm tìm ra giải pháp khắc phục lỗi lập trình và nâng cao hiệu quả chương trình Các lỗi logic thường gặp khiến chương trình không an toàn và kém hiệu quả có thể được giảm thiểu nếu lập trình viên tuân thủ các quy tắc và hướng dẫn đã được tổng hợp từ nhiều báo cáo Đặc biệt, chương này cũng đề xuất giải pháp phân tích mã nguồn thông qua Cây cú pháp trừu tượng (Abstract Syntax Tree), áp dụng cho hầu hết các ngôn ngữ lập trình.
Chương 2 của luận văn, chúng ta đã tìm hiểu và đưa ra danh sách các lỗi cơ bản mà các lập trình viên hay mắc khi viết mã nguồn Các lỗi này làm cho chương trình không được an toàn và được sếp vào mức độ rủi do cao Các lỗi này là tràn bộ đệm (Overflow), tràn số nguyên, chèn lệnh, chèn câu truy vấn SQL, tấn công định dạng chuỗi, giả mạo tham số, XSS, không đánh giá dữ liệu đầu vào, tương tranh, đầu độc cookie, không bắt các lỗi… Các vụ tấn công gần đây hầu hết đều được thực hiện bằng việc khai thác các lỗi này, đó là việc chủ quan của các lập trình viên trong việc kiểm tra đầu vào của dữ liệu Làm sao để tăng hiệu quả của chương trình cũng được làm rõ tại chương này Việc tăng hiệu quả của chương trình thực ra là áp dụng các luật và thuật toán sao cho hợp lý trong từng trường hợp cụ thể Có thể kể đến như tối ưu nhánh, dịch chuyển mã, truyền hằng số, phủ hằng số, loại bỏ mã chết, loại bỏ biểu thức con chung, loại bỏ câu điều kiện trong vòng lặp, loại bỏ biến chết, tái liên kết, dịch chuyển biến, giảm cường độ…
Bằng cách phân tích chi tiết các lỗi cơ bản và áp dụng các thuật toán tối ưu, chúng tôi sẽ cải thiện hiệu suất cho trang web dientutieudung.vn được xây dựng trên nền tảng NET.
Chương 3 đề xuất quy trình phân tích và tối ưu mã nguồn mà không làm thay đổi thuật toán của chương trình, đồng thời mô tả các lỗi thường gặp trong web ứng dụng và phương pháp ngăn chặn chúng dựa trên chính sách và công cụ của ASP.NET và NET Framework Chương này cũng giới thiệu phương pháp phân tích mã nguồn để phát hiện các lỗ hổng nghiêm trọng và quy tắc viết mã an toàn, minh bạch theo hướng dẫn của NET Framework, được chia thành ba nhóm: bảo trì, tài liệu, và trình bày Nhóm trình bày lại được chia thành năm nhóm nhỏ: đặt tên, sắp xếp khuôn mẫu, hiển thị, khả năng đọc mã nguồn, và khoảng cách mã nguồn Những quy tắc này không chỉ áp dụng cho NET Framework mà còn cho nhiều ngôn ngữ lập trình khác như Java Việc áp dụng quy tắc viết mã và sử dụng công cụ của NET Framework giúp bảo vệ website dientutieudung.vn một cách hiệu quả khi thương mại hóa, góp phần vào mục tiêu chính của luận văn là nâng cao tính an toàn cho chương trình.
Các kết quả chính đạt đƣợc trong luận văn nhƣ sau:
(1) Mô tả tầm quan trọng và trình bày những khái niệm chung về lập trình an toàn đối với quá trình phát triển phần mềm
(2) Trình bày những kỹ thuật cơ bản và phổ biến nhất về các lĩnh vực nâng cao hiệu quả của chương trình và lập trình an toàn
Để giải quyết bài toán áp dụng các kỹ thuật phân tích mã nguồn cho các ngôn ngữ lập trình, cần đề xuất một chiến lược hiệu quả Chiến lược này không chỉ giúp cải thiện chất lượng mã nguồn mà còn tối ưu hóa quy trình phát triển phần mềm Các ưu điểm của chiến lược bao gồm việc phát hiện sớm lỗi, tăng cường khả năng bảo trì, và nâng cao hiệu suất làm việc của lập trình viên Việc áp dụng các kỹ thuật phân tích mã nguồn sẽ mang lại lợi ích lớn cho cả dự án và đội ngũ phát triển.
(4) Đề xuất phương pháp phân tích mã nguồn để tìm ra các đoạn mã có nguy cơ gây lỗ hổng nghiêm trọng trong phần mềm
(5) Tổng hợp và xây dựng được một số tập luật liên quan đến tối ưu mã nguồn
(6) Áp dụng các luật đã xây dựng và thuật toán vào website dientutieudung.vn nhằm nâng cao hiệu quả của website khi thương mại
Những khó khăn gặp phải trong quá trình thực hiện đề tài
Tối ưu hóa mã nguồn để nâng cao hiệu quả chương trình và lập trình an toàn là những lĩnh vực mới mẻ đối với tác giả Việc tìm kiếm tài liệu phù hợp cho từng ngôn ngữ trên mạng cũng tốn nhiều thời gian.
Mục tiêu ban đầu của tác giả là tìm kiếm giải pháp cho việc phân tích mã nguồn của nhiều ngôn ngữ lập trình khác nhau như Java, NET, C/C++ và PL/SQL Mỗi ngôn ngữ có những quy tắc và luật lệ riêng, đòi hỏi kiến thức sâu rộng và kinh nghiệm thực tiễn để hiểu và áp dụng hiệu quả.
Hướng giải quyết các khó khăn
Tác giả đã tìm kiếm sự hướng dẫn từ PGS.TS Huỳnh Quyết Thắng để nhận những tài liệu hữu ích về tối ưu mã nguồn, nhằm nâng cao hiệu suất chương trình và đảm bảo lập trình an toàn Sau đó, tác giả đã dành nhiều thời gian để đọc và nghiên cứu các tài liệu này.
(2) Tải và tìm hiểu các sách trên mạng cho mỗi loại ngôn ngữ để chọn lọc ra các tập luật của từng ngôn ngữ
Nghiên cứu cho thấy việc áp dụng kỹ thuật loại bỏ lỗi lập trình và quy tắc viết mã an toàn trong phát triển phần mềm mang lại nhiều lợi ích Phần mềm trở nên ít lỗi hơn, mã nguồn sạch hơn, thời gian bảo trì được rút ngắn và hiệu quả sử dụng được nâng cao.
Kiến nghị
Trong quá trình nghiên cứu và hoàn thành luận văn, tác giả nhận thấy rằng việc áp dụng các kỹ thuật loại bỏ lỗi lập trình, lập trình an toàn và quy tắc viết mã là rất quan trọng để xây dựng phần mềm hiệu quả Để đạt được điều này, các công ty và tổ chức phần mềm, cũng như các lập trình viên, cần chú trọng đến một số vấn đề thiết yếu.
Thường xuyên thảo luận về kỹ thuật lập trình an toàn và cách loại bỏ lỗi lập trình trong nhóm làm việc và cộng đồng mạng sẽ giúp phát triển các khái niệm và kỹ thuật mới, từ đó ngăn chặn hiệu quả những lỗi không mong muốn.
Lập trình viên cần liên tục cập nhật kiến thức về các lỗ hổng bảo mật mới và các biện pháp khắc phục hiệu quả để đảm bảo an toàn cho hệ thống.
Các công ty và tổ chức cần thường xuyên cập nhật và làm mới các quy tắc viết mã nguồn để đảm bảo tính hiệu quả và bảo mật Việc phổ biến những quy tắc này cho các lập trình viên trong nội bộ là rất quan trọng để duy trì sự nhất quán và chất lượng trong quá trình phát triển phần mềm.
Định hướng phát triển
Do những hạn chế về điều kiện cá nhân, luận văn vẫn chưa đạt được nhiều mục tiêu mà tác giả kỳ vọng Trong tương lai, tác giả sẽ tập trung vào việc phát triển và hoàn thiện những mục tiêu này.
Xây dựng ứng dụng phân tích và tối ưu cho các ngôn ngữ lập trình như Java, NET, C/C++ giúp lập trình viên dễ dàng kiểm tra và phát hiện lỗi.
Việc tìm hiểu và xây dựng thêm các luật để tối ưu hóa ứng dụng là vô cùng quan trọng, giúp phát hiện nhiều thành phần tiềm năng, từ đó mở ra cơ hội cho mã nguồn được tối ưu và an toàn hơn Tuy nhiên, việc loại bỏ các thành phần tiềm năng thường phức tạp và phụ thuộc vào ngữ nghĩa của mã nguồn, dẫn đến khó khăn trong việc sửa đổi tự động, có thể gây ra sự không đồng nhất Do đó, cần dành nhiều thời gian để nghiên cứu và áp dụng hiệu quả các luật này.
DANH MỤC TÀI LIỆU THAM KHẢO
1 National Vulnerability Database (http://nvd.nist.gov/faq.cfm)
2 Maggie Johnson, “Code Optimization”, CS 143, 2008
3 Napsu Karmitsa, “Code Optimization and Performance Tuning”, L&SC- course, 2011
4 Donald Knuth, “Structured Programming with go to Statements”, ACM Computing Surveys, Volume 6 Issue 4, Pages 261 - 301, 1974
5 George Mason University, “Lecture 11: Code Optimization”, CS 540, 2009
6 Trupti Shiralkar, Brenda Grove, “Guidelines for Secure Coding”, 2009
7 Mark G Graff, Kenneth R van Wyk, “Secure Coding: Principles & Practices”,
8 Mark G Graff, “Secure Coding - The State of the Practice”, 2001
9 Robert C Seacord, “Secure Programming”, CS 15392, 2009
10 “Program optimization”, http://en.wikipedia.org/wiki/Code_optimization, last visited April 2013
11 “Loop invariant”, http://en.wikipedia.org/wiki/Loop_invariant, last visited April 2013
12 Google's CodePro Analytix, “CodePro Audit Rule Set – Security”, https://developers.google.com/java-dev- tools/codepro/doc/features/audit/Security, last visited April 2013
13 Oracle, “Secure Coding Guidelines for the Java Programming Language, Version 4.0”, http://www.oracle.com/technetwork/java/seccodeguide- 139067.html, last visited April 2013
14 Gary McGraw, Edward W Felten, “Java Security Guidelines: Developing and Using Java More Securely”, http://www.securingjava.com/chapter- seven/chapter-seven-1.html, last visited April 2013
15 “Abstract syntax tree”, http://en.wikipedia.org/wiki/Abstract_syntax_tree, last visited May 2013
16 C# Empty Strings, http://www.dotnetperls.com/empty-string
17 StyleaCop Rules Document, http://www.stylecop.com/docs/
18 Davis, N Secure Software Development Life Cycle Processes Technical Note, Carnegie Mellon University, July 2006
19 Framework Design Guidelines, http://msdn.microsoft.com/en- us/library/ms229042.aspx
20 Grossman, J Myth-Busting Web Application Buffer Overflows Whitehat Security Reports WhiteHat Security, Inc 2006
22 Alcorn, W The Cross-site Scripting Virus Whitepaper at BindShell.Net October 2005
23 Friedl, S SQL Injection Attacks by Example Unixwiz.net Tech Tips July
24 Berg, A Improper error handling Information Security Magazine 26 August
25 Open Web Application Security Project (OWASP) The Ten Most Critical Web Application Security Vulnerabilities 2013
26 Ollmann, G HTML Code Injection and Cross-site scripting Technicalinfo.net
27 SearchSecurity.com staff Security Bytes: Injection flaw in popular browsers Information Security Magazine 9 December 2004
28 Curphey, M., Araujo, R Do Configuration Management During Design & Development Software Mag.com October 2005
29 Klein, A DOM Based Cross Site Scripting or XSS of the Third Kind A look at an overlooked flavor of XSS Web Application Security Consortium July
30 Curphey, M., Araujo, R Getting it Right: Error Handling and Exception Management Software Mag.com March 2006
31 Mitchell, S Sams Teach Yourself ASP.Net in 24 Hours Sams Publishing
32 Meier, J.D., Mackman, A., Dunner, M., Vasireddy, S Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication Microsoft Corporation January 2006
33 Nagel, C Enterprise Services with the NET Framework: Developing Distributed Business Solutions with NET Enterprise Services Addison Wesley Professional June 2005
34 FxCop Document, http://msdn.microsoft.com/en- us/library/bb429476(v=vs.80).aspx
35 Meijer, E., Gough, J Technical Overview of the Common Language Runtime CiteSeer.IST 2000
36 Sawer, C Using Spring‟s MVC framework for web form validation February
37 MySQL AB MySQL Developer‟s guide MySQL Press 7 April 2006 IT Governance Institute Control Objectives for Information and related Technology (COBIT) Version 4.0, 2005
38 Diane Pozefsky, Department of Computer Science, University of North
Carolina, “Code Optimization Techniques”, http://wwwx.cs.unc.edu/~pozefsky/Fall08/CodeOptimizationTechniques.html, last visited April 2013
39 Model Engineering College, “Code Optimization”, http://www.mec.ac.in/resources/notes/notes/compiler/module5/code_optimizat ion.htm, last visited April 2013
40 Java Code Style, http://geosoft.no/development/javastyle.html, last visited 9/2013
Các quy tắc được phân nhóm và áp dụng để xây dựng website dientutieudung.vn Dưới đây là một số quy tắc có thể áp dụng trong ngôn ngữ C# và các ngôn ngữ lập trình khác trên nền tảng NET Framework Những nguyên tắc này cũng có thể được sử dụng trong các ngôn ngữ tương đồng như Java để phát triển phần mềm hiệu quả.
STT Tên quy tắc Cách khắc phục
I.1 Nhóm khoảng cách mã nguồn
R1001 Khoảng cách xung quanh từ khóa
The following keywords must always be followed by a single space: catch, fixed, for, foreach, from, group, if, in, into, join, let, lock, orderby, return, select, stackalloc, switch, throw, using, where, while, and yield.
Những từ khóa sau đây không cần nhất thiết theo sau nó là bất kì dấu cách nào: checked, default, sizeof, typeof, unchecked
Các từ khóa mới nên luôn theo sau nó là một dấu cách trừ khi nó được sử dụng để tạo ra một mảng
(array) mới, trong trường hợp này thì không cần dấu cách giữa từ khóa và các khung mở []
Chúng ta sẽ thêm hoặc bỏ khoảng cách sau mỗi từ khóa như theo phần giải thích
R1002 Khoảng cách xung quanh dấu phẩy (,)
Một dấu phẩy luôn cần được theo sau bởi một dấu cách đơn duy nhất, trừ khi nó là ký tự cuối cùng trên dòng lệnh Đồng thời, dấu phẩy không được đi trước bởi bất kỳ dấu cách nào, trừ khi nó là ký tự đầu tiên của dòng lệnh Hãy đảm bảo rằng các dấu phẩy được theo sau bởi một dấu cách đơn.
R1003 Khoảng cách xung quanh một dấu chấm phẩy
Dấu chấm phẩy phải luôn được theo sau bởi một dấu cách đơn, trừ khi nó là ký tự cuối cùng của dòng lệnh Ngoài ra, dấu chấm phẩy không nên bắt đầu bằng dấu cách, trừ khi nó là ký tự đầu tiên trên dòng lệnh Hãy chắc chắn rằng các dấu chấm phẩy luôn được theo sau bởi một dấu cách đơn.
R1004 Khoảng cách xung quanh biểu tƣợng toán tử
Các biểu tượng điều hành như dấu hai chấm, phép toán số học, phép gán, câu lệnh điều kiện, phép logic và các phép toán quan hệ cần phải được bao quanh bởi dấu cách ở hai bên Ví dụ: trong câu lệnh "int x = 4 + y;", các biểu tượng này được sử dụng đúng cách với khoảng cách phù hợp.
Các toán tử nguyên phân cần có một dấu cách trước chúng nhưng không có dấu cách nào sau chúng Ví dụ: bool x = !value; Hãy chắc chắn rằng các dấu cách xung quanh các biểu tượng tuân theo quy tắc đã nêu.
Trong trường hợp ngoại lệ, khi các biểu tượng đứng trước hoặc sau dấu ngoặc đơn hoặc khung, sẽ không có khoảng cách giữa các biểu tượng và khung Ví dụ minh họa: if (!value).
R1005 Bắt đầu một dòng chú thích nằm trên đầu các đối tƣợng không bắt đầu bằng dấu cách
Vi phạm quy tắc này xảy ra khi một dòng trong một tiêu đề tài liệu hướng dẫn không bắt đầu với một dấu cách đơn Ví dụ:
/// The document root.
/// The Xml header token. private void Method1(int x, int y)
Các dòng tiêu đề phải bắt đầu với một khoảng trắng sau ba dấu gạch chéo hàng đầu về phía trước:
/// The document root.
/// The Xml header token. private void Method1(int x, int y)
} Đảm bảo rằng các dòng tiêu đề bắt đầu bằng một dấu cách đơn Đảm bảo rằng các
Vi phạm quy tắc này xảy ra khi một dòng chú thích không bắt đầu với một dấu cách đơn Ví dụ: private void Method1()
Các ý kiến nên bắt đầu với một dấu cách đơn sau khi các dấu gạch chéo hàng đầu phía trước: private void Method1()
Ngoại lệ cho quy tắc này xuất hiện khi chú thích được dùng để nhận xét một dòng mã, cho phép bỏ qua dấu cách nếu chú thích bắt đầu bằng bốn dấu chéo Ví dụ: private void Method1()
Chú thích cần bắt đầu bằng bốn dấu chéo, trong khi dấu cách đầu có thể được bỏ qua.
R1007 Trước một kiểu từ khóa dạng preprocessor là một dấu cách
Vi phạm quy tắc này xảy ra khi các từ khóa tiền xử lý (preprocessor) trong một chỉ thị tiền xử lý là trước bởi khoảng cách Ví dụ:
Không nên có khoảng trắng giữa dấu # và từ khóa tiền xử lý (preprocessor) Đảm bảo rằng dấu # luôn liền kề với từ khóa tiền xử lý để tránh lỗi cú pháp.
I.2 Nhóm khả năng đọc mã nguồn
R1100 Không sử dụng tiền tố “this” để gọi thành viên trong một lớp địa phương
Vi phạm quy tắc xảy ra khi mã gọi một thành viên trong lớp địa phương hoặc lớp kế thừa mà không sử dụng tiền tố “this” Tuy nhiên, nếu gọi một thành viên trong lớp cơ sở, thì nên sử dụng tiền tố “base” thay vì “this”.
“this” vào một lời gọi các thành viên của lớp
R1101 Câu lệnh truy vấn không theo ngay sau câu lệnh trước đó
Vi phạm quy tắc này xảy ra khi một câu lệnh trong truy vấn không bắt đầu trên cùng một dòng với câu lệnh trước đó hoặc trên dòng ngay sau Ví dụ, cú pháp không hợp lệ là: object x = select a in b from c;