VBA Nâng cao: các lỗi viết mã và cách tránh lỗi ứng dụng bị xem là có virus

Liên hệ QC

HeSanbi

Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
Tham gia
24/2/13
Bài viết
2,580
Được thích
3,938
Giới tính
Nam
Hôm nay tôi chia sẻ cho các bạn chủ đề liên quan đến các lỗi viết mã cơ bản trong lập trình VBA và cách tránh lỗi viết mã bị xem là nguy hiểm bị xem là ứng dụng có virus, nếu các bạn thiếu kinh nghiệm trong lập trình sẽ tạo ra nhiều lỗi, mà sau này phải bỏ nhiều thời gian để sửa lỗi cho các dự án. Chính vì vậy mà tôi chia sẻ bài viết này với những gì tôi đã tích lũy được trong quá trình lập trình ứng dụng của mình. Các bạn hãy đọc qua bài viết để biết thêm chi tiết.

Các lỗi viết mã cơ bản
Khi lập trình với VBA thì các bạn cần nắm vững điều này để không bao giờ mắc phải lỗi cơ bản, để phát triển ứng dụng
1. Lỗi trong khai báo:​
Lỗi khai báo nhiều biến trên cùng một khai báo.​
là khai báo không hợp lý phải khai báo đầy đủ như sau:
Dim r1 As Range, r2 As Range, r3 As Range
Lỗi khai báo Define, khi bạn khai báo DefLng A-Z, DefBool B, K, ...v.v.
Thì cần khai báo rõ ràng kiểu biến cho các khai báo trong mã
2. Lỗi không để cho chương trình chạy qua 'End With' sau khi gọi 'With [object]'.
Không nên để điều này xảy ra, vì sẽ gây ra lỗi không giải phóng được đối tượng đã gọi với 'With' cho dù đã thoát khỏi phương thức.​
Không nên gọi lệnh Goto hoặc Exit để nhảy ra khỏi khối With nhanh chóng.​
3. Lỗi xử lý chuỗi và chuỗi Unicode
Trong VBA nếu bạn muốn lưu trữ mã Base64 hoặc một dạng mã hóa nào khác cần ngắt dòng hợp lý và tách ra nhiều hàm để lưu.​
Ví dụ như cách lưu đoạn Base64 dưới đây:​
JavaScript:
s = s & "s18SbXSnq61roHyt2IMMOPk2hnBYbNll3vPCxNYnfLk/cy6LU4cAtFpn8hIZkc"
s = s & "lptslyqITx2VN/QwxEJMxWlF5gOI8EDApbrY0JmpMwYomVQKHBFHKDCgN"
s = s & "Vbn4GQKdGGmvBwAms5YkxEqMwmjsLl5TlUey3uNSCsnCKSFv0ZhGB02Q"
s = s & "UuAtBMMTPfUixwBBEkHKQJQcFbJqls4YsQdI+8qoHk04vYNTIG8pNOTNjW"
Các bạn cần lưu ý khi lập trình với chuỗi Unicode, chuỗi Unicode có trong nhiều kiểu dữ liệu như chuỗi, chuỗi tải về từ mạng, trong đường dẫn, vì VBA là ngôn ngữ lập trình lỗi thời nên đa số các hàm cơ bản chỉ hỗ trợ Ascii như Dir, MkDir, ... Chính vì vậy cần sử dụng các phương thức thay thế cho hợp lý. Nếu không dự án của bạn khi đến tay người dùng sẽ gặp lỗi.​
Có các hàm API cũng cần khai báo các hàm hỗ trợ Unicode. Mã hóa và giải mã chuỗi Unicode hay Utf8, ... sang unicode là rất cần thiết.​
4. Hạn chế tạo tên biến, tên Enum và Type có chứa các từ khóa cú pháp.
Không đặt tên biến trùng các hàm như Format là hàm Format, ... hãy thêm một hoặc hai ký tự như vFormat​
Không đặt Enum và Type như sau dễ gây ra lỗi thông dịch:​
5. Hạn chế khởi tạo đối tượng toàn cục trong lớp (Class module).
Do tiêu chuẩn trong lập trình phụ thuộc trình biên dịch và đóng gói của ứng dụng VBA, nên mục này là rất cần thiết. Cách viết mã có thể tạo cơ hội cho các cuộc tấn công từ bên ngoài.​
Khai báo như sau là nên hạn chế, cách khai báo sau thường do tính "lười biếng" gây ra:​
Public cls As New Collection​
Hãy khai báo Private trước sau đó Set New:​
Private cls As Collection: Set cls = New Collection​
Private cls As New Collection​
Trong VBA có các lỗi nghiêm trọng tiêu biểu như truy cập bộ nhớ Enumrates của Collection, chính vì đó mà khai báo hợp lý sẽ giúp các bạn không chỉ vững kinh nghiệm trong VBA mà còn với các nền tảng phát triển khác. Các lỗi viết mã cũng là điều kiện gây cho dự án phải bỏ nhiều công sức sửa lỗi, và cũng cho Hacker cơ hội xâm nhập.​

6. Thời gian trong PC của bạn khi gọi hàm Now, Date, Time, Timer là không khớp với thời gian chuẩn Quốc tế
Hãy lưu ý là thời gian trong PC không khớp với thời gian chuẩn Quốc tế, chính vì vậy việc lập trình về thời gian cũng cần chú ý.​
hập.​
Hãy luôn luôn xử lý đặt định dạng chuẩn ngày tháng năm theo thứ tự định dạng sau: YYYY/MM/DD HH:MM:SS, dù cho bạn chuyển đổi hay ghi ra ra mảng.​

7. Viết mã trong Module quá nhiều
Hãy viết mã trong Class Module, sau khi gọi và giải phóng hợp lý. Hạn chế viết mã trong Module. Viết mã trong module, trình thông dịch sẽ đọc lưu vào bộ nhớ trước khi ứng dụng chạy, sẽ gây tốn kém và hao phí tài nguyên, nếu nhiều mã trong Module ít sử dụng đến.​

8. Lỗi không giải phóng bộ nhớ đối tượng
Lỗi này có thể gây ra tràn bộ nhớ.​

Cách tránh viết mã bị xem là mã nguy hiểm và virus

1. Không gõ từ khóa VBA trước các hàm VBA
Nhiều bạn hay nhập VBA.String, VBA.TRIM, ... Không nên nhập như vậy, các bạn có thể sử dụng từ khóa thứ hai sau từ khóa VBA, nhập nên là Strings.TRIM, Interaction.CreateObject, ....​
2. Nhập đường dẫn URL, để gọi trong các thư viện HTTP:
Cách ghi url như sau là nên tránh:
Cách ghi url như sau tránh được trình quét nhưng bất tiện:
Const url = "htt" & "ps://ww" & "w.youtube." & "com/watch?v=lOYMPAjZSos"​
Tốt nhất là tạo hàm mã hóa và giải mã:
Dim url: url = DecodeText("47>83>97>110>98>105>86>78>47>84>97>120>67>111>100>101>86>78>47>114>101>108>101>97>115>101>115>47>116>97>103>47>11")​
3. Tránh sử dụng các hàm API tương tác SYSTEM trực tiếp và trách một số API tải tệp URL:
Trong VBA có 2 cách gọi các hàm API: gọi trực tiếp vào trong mã VBA, gọi các API trong DLL với bộ nhớ của các hàm API với các API hỗ trợ cách gọi này sẽ giúp tránh trình quét phát hiện các mã bị xem là mã nguy hiểm. API tải tệp bị xem là hàm nguy hiểm, hãy thay thế với thư viện WinHTTP để tải và ADODB Stream để lưu.​
4. Tránh sử dụng các Hàm VBA như Shell, Kill trong VBA:
Ví dụ bạn gọi cửa sổ dòng lệnh trong Shell như sau. Là cách gọi sai cách:
Hãy thay thế lệnh Shell với các hàm API bổ trợ.​
Hãy mã hóa hoặc thêm & ngăn các từ thành nhiều lần như đã nói ở trên nếu bạn cần gọi lệnh Shell:
Shell "cm" & "d.e" & "xe" Hoặc Shell DecodeText("xxxxxxxxxxxxxxxxx")​
Hãy thay thế lệnh Kill với thư viện FileSystem: với lệnh delete hoặc FileSystem.FileDelete hoặc FileSystem.FolderDelete
Các bạn có thể tận dụng hai hàm này, nếu các bạn biết về API, gọi hàm trực tiếp từ bộ nhớ.​
5. Hạn chế viết mã trong Module mà hãy viết mã vào Class Module:
Vừa tiết kiệm bộ nhớ trong nhiều trường hợp và vừa tránh bị xem là mã nguy hiểm trong một vài trường hợp gọi các hàm thực thi hay sử dụng các thư viện HTTP để gửi yêu cầu qua mạng.​
6. Có nhiều thư viện bị trình quét xem là nguy hiểm nếu khởi tạo trong mã
Các thư viện như ScriptControl, HtmlFile, ... hãy tìm cách khác thay thế nếu có. Hoặc khởi tạo chúng với cách mã hóa như ở trên. Sử dụng phương thức CallByName nếu cần thiết để gọi một số phương thức bị xem là hàm nguy hiểm. Nếu các bạn biết về API hãy tận dụng API để gọi các thư viện thông qua bộ nhớ, cách này cũng có thể tránh trình quét.​
(Bài viết sẽ còn tiếp tục cập nhật thêm)
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom