Công Cụ Làm Rối JavaScript

Làm rối JavaScript đã được kiểm thử cho các bản demo và dự án web, đồng thời hiểu rõ giới hạn của việc gỡ lỗi và bảo mật.

Công cụ này có hữu ích với bạn không?

4/5 từ 39 đánh giá

Khiến JavaScript phía máy khách khó đọc hơn trong khi vẫn giữ được mã nguồn dễ bảo trì cho các dự án web và lớp học được cho phép

Một học sinh phát hành trò chơi trên trình duyệt rồi phát hiện ai cũng mở được công cụ nhà phát triển và đọc luật tính điểm. Em muốn việc sao chép tùy tiện khó hơn, nhưng vẫn phải cập nhật trò chơi về sau và sửa lỗi người chơi báo lại.

Công cụ làm rối mã JavaScript biến mã dễ đọc thành phiên bản khó hiểu hơn với con người. Nó có thể đổi tên biến, mã hóa chuỗi ký tự, sắp xếp lại biểu thức hoặc thêm lớp trung gian, mà vẫn cố giữ nguyên hành vi chương trình.

Làm rối mã có thể khiến người ta ngại xem xét, nhưng không biến được mã trên trình duyệt thành bí mật. Trình duyệt buộc phải tải JavaScript về mới chạy được, nên người quyết tâm vẫn thu lấy, nghiên cứu và sửa được tệp đã gửi xuống.

Quy trình đúng giữ mã nguồn dễ đọc, riêng tư và dễ bảo trì, tạo một bản đã làm rối để phát hành rồi kiểm thử kỹ bản đó. Mật khẩu, khóa riêng, thông tin đăng nhập cơ sở dữ liệu và các quyết định cần tin cậy phải nằm trên máy chủ được bảo vệ, không giấu trong JavaScript phía giao diện.

Làm rối mã JavaScript thay đổi điều gì

Mã dễ đọc có thể trông thế này:

function calculateScore(correctAnswers, totalQuestions) {
  if (totalQuestions === 0) {
    return 0;
  }

  return Math.round(
    (correctAnswers / totalQuestions) * 100
  );
}

Bản đã làm rối có thể thay hết tên có nghĩa và sắp xếp lại chính phần logic đó:

function _0xa12b(_0xc31d,_0xf221){if(_0xf221===0){return 0}return Math.round(_0xc31d/_0xf221*100)}

Bản thứ hai khó đọc hơn, nhưng logic vẫn sẵn đó cho trình duyệt dùng. Làm rối mã chỉ tăng công sức phải bỏ ra để xem xét; nó không tạo ra tính bảo mật.

Kỹ thuật làm rối mã thường gặp

Tùy công cụ và thiết lập, làm rối mã có thể gồm:

  • Đổi tên biến và hàm cục bộ.
  • Mã hóa chuỗi ký tự hoặc cất vào mảng tra cứu.
  • Viết lại biểu thức theo dạng ít lộ hơn.
  • Thay đổi cấu trúc luồng điều khiển.
  • Thêm bước truy cập thuộc tính gián tiếp.
  • Chèn mã gây khó cho việc gỡ lỗi.
  • Bỏ hoặc đổi định dạng thông thường.
  • Kết hợp nhiều phép biến đổi.

Càng nhiều phép biến đổi không có nghĩa kết quả tự khắc tốt hơn. Thiết lập quá mạnh tay có thể làm tệp phình to, giảm hiệu năng, gây rối việc báo lỗi, hoặc phá vỡ mã vốn dựa vào tên hàm và hành vi động.

Làm rối mã làm được gì và không được gì

Mục tiêu Làm rối mã có giúp không? Giới hạn quan trọng
Ngăn bớt sao chép tùy tiện Người dùng quyết tâm vẫn phân tích được mã trên trình duyệt
Giấu luật chơi đơn giản Một phần Luật chơi vẫn quan sát và sửa được lúc đang chạy
Bảo vệ một mật khẩu Không Mật khẩu đã gửi xuống trình duyệt có thể lấy lại
Giấu khóa bí mật API Không Thông tin đăng nhập phía giao diện lộ ra với máy khách
Làm mã nhỏ lại Không hẳn Làm rối mã có thể khiến tệp to ra
Thay thế xác thực Không Phân quyền phải do máy chủ đáng tin cậy thực thi
Ngăn mọi hình thức dịch ngược Không Mã phía máy khách vẫn có sẵn để xem xét
Tạo bản phát hành khó đọc hơn Mã nguồn dễ đọc phải giữ riêng nơi khác
Ví dụ lớp học

Trường hợp sử dụng liên quan

Cách làm rối mã JavaScript an toàn

  1. Hoàn thiện mã nguồn dễ đọc. Đừng làm rối đoạn mã còn đang gỡ lỗi.
  2. Chạy các bài kiểm thử thường lệ. Xác nhận ứng dụng chưa làm rối chạy đúng.
  3. Lưu một bản mã nguồn được bảo vệ. Mã dễ đọc vẫn là bản được bảo trì.
  4. Gỡ hết khóa bí mật. Chuyển khóa riêng, mật khẩu và quyết định cần tin cậy sang phía máy chủ.
  5. Tạo bản dựng để phát hành. Để riêng tệp phát triển và tệp phát hành.
  6. Chỉ gửi đi phần JavaScript đúng dự định. Tránh tải mã bí mật hoặc mã độc quyền lên dịch vụ khi chưa được phép.
  7. Chọn thiết lập vừa phải trước. Chỉ thêm phép biến đổi mạnh khi kiểm thử cho phép.
  8. Tải kết quả đã làm rối về. Lưu bằng tên tệp phát hành rõ ràng.
  9. Kiểm thử lại toàn bộ ứng dụng. Xem lại hành vi, hiệu năng, cách xử lý lỗi và khả năng tiếp cận.
  10. Giữ hồ sơ phát hành. Lưu phiên bản mã nguồn và thiết lập gắn với tệp đã đưa lên.

Quy trình phát hành có trách nhiệm

Giai đoạn phát triển

Học sinh và lập trình viên viết JavaScript rõ ràng, tên gọi có nghĩa, hàm dễ đọc và chú thích đúng chỗ. Công cụ Làm đẹp JavaScript giúp định dạng lại mã tiếp nhận từ người khác hoặc mã đã nén trước khi bảo trì.

Giai đoạn kiểm thử

Mã nguồn dễ đọc được kiểm thử với dữ liệu hợp lệ, không hợp lệ, để trống và ngoài dự kiến. Biểu mẫu, thao tác bàn phím, sự cố mạng và hành vi trên điện thoại đều được rà lại.

Giai đoạn dựng bản

Một bản phát hành được tạo ra. Công cụ Rút gọn JavaScript có thể cắt bớt ký tự thừa trong bản đó, còn làm rối mã thì khiến phần mã được chọn khó hiểu hơn.

Giai đoạn xác minh

Chính kết quả phát hành mới là thứ được kiểm thử. Mã nguồn vượt qua bài kiểm thử không chứng minh bản dựng đã biến đổi cũng chạy y hệt.

Giai đoạn đưa lên

Chỉ tệp phát hành đã kiểm thử mới được đưa lên. Mã nguồn, thiết lập dựng bản và phiên bản đã đưa lên đều được ghi lại để sau này truy được nguồn gốc lỗi.

Tình huống thực tế trong dạy học và lập trình

1. Phát hành trò chơi trình duyệt của học sinh

Một học sinh làm trò chơi từ vựng có cấp độ, tính điểm, gợi ý và đồng hồ đếm giờ. Khi phát triển, mã nguồn dùng tên hàm rõ ràng.

Trước khi phát hành, em chuyển phần kiểm tra điểm cần tin cậy sang máy chủ phù hợp, hoặc chấp nhận điểm trên trình duyệt có thể bị sửa. Phần mã máy khách còn lại được làm rối thành bản phát hành.

Em kiểm thử bàn phím, cách tính điểm, việc chơi lại và điều khiển điện thoại trước khi đưa trò chơi lên.

2. Bảo vệ bài trình diễn lập trình khỏi sao chép tùy tiện

Một giáo viên xây bài trình diễn tương tác cho trang web của trường. Đoạn JavaScript đó là kết quả của nhiều giờ làm việc.

Bản phát hành đã làm rối khiến người khác ngại sao chép nguyên xi. Nhưng ghi chú bản quyền kèm giấy phép nói rõ phạm vi sử dụng hơn hẳn phép biến đổi kỹ thuật đơn thuần.

Giáo viên giữ mã nguồn dễ đọc trong kho lưu trữ riêng đã duyệt.

3. Chuẩn bị bài trắc nghiệm chạy phía máy khách

Một lập trình viên mới vào nghề làm bài trắc nghiệm tự chấm. Nếu mọi đáp án đều nằm trong JavaScript, học sinh mở tệp là tìm thấy hết.

Làm rối mã có thể khiến việc dòm ngó khó hơn, nhưng không mang lại cách chấm bài an toàn. Với bài kiểm tra quan trọng, đối chiếu đáp án phải nằm trên máy chủ đáng tin cậy.

Với bài luyện tập không lấy điểm, lập trình viên có thể chấp nhận giới hạn đó và chỉ dùng làm rối mã như rào cản nhỏ.

4. Đưa hiệu ứng tương tác của hồ sơ năng lực lên mạng

Hồ sơ năng lực của một học sinh có thư viện ảnh và hiệu ứng chuyển động em tự viết. Em muốn người xem dùng được tính năng mà không đọc ngay ra chi tiết bên trong.

Em giữ mã nguồn, tạo bản phát hành đã làm rối, rồi kiểm tra nhịp chuyển động và các nút hỗ trợ tiếp cận còn chạy đúng không.

Hồ sơ đó không chứa thông tin đăng nhập API riêng tư hay dữ liệu cá nhân bị giấu.

5. Dạy về giới hạn của bảo mật phía máy khách

Một giáo viên tin học đưa học sinh hai bản của cùng một máy tính bỏ túi vô hại: một bản dễ đọc, một bản đã làm rối. Học sinh dùng công cụ trình duyệt để thấy cả hai tệp đều tải về máy.

Cả lớp bàn vì sao làm rối mã tăng công sức nhưng không tạo ra sự tin cậy. Các em chỉ ra những quyết định nào buộc phải kiểm tra trên máy chủ.

Bài học này giúp học sinh không nhầm mã trông như được giấu với mã thực sự được bảo vệ.

6. Phân phát bản thử nghiệm

Một lập trình viên chia sẻ bản thử nghiệm trên trình duyệt với nhóm nhỏ để lấy nhận xét. Phần logic phía máy khách còn ở giai đoạn đầu, chưa sẵn sàng công bố rộng rãi.

Làm rối mã chỉ là một rào cản thực tế; phần bảo vệ chính đến từ kiểm soát truy cập, thỏa thuận văn bản và phạm vi phân phát hạn chế.

Lập trình viên vẫn giả định ai có quyền truy cập đều lấy được mã.

7. Giảm bớt chi tiết cấu hình quá lộ

Một tập lệnh phát hành chứa tên cấu hình không bí mật nhưng để lộ nhãn nội bộ của các tính năng. Làm rối mã khiến những nhãn đó bớt lộ liễu với người chỉ liếc qua.

Khóa bí mật thật vẫn nằm trên máy chủ. Địa chỉ API công khai và mã định danh máy khách được xử lý theo đúng đặc tính bảo mật thật, không giấu sau lớp mã đã làm rối.

8. Thử tính tương thích với hệ thống dựng bản

Ứng dụng do học sinh viết dùng mô-đun hiện đại, lớp, trường riêng tư và hàm xử lý sự kiện. Nhóm muốn biết làm rối mã có chạy được với bản dựng này không.

Trước hết họ biến đổi một tệp nhỏ đại diện. Các bài kiểm thử tự động và thủ công chạy trước khi áp dụng quy trình cho cả dự án.

Nhờ vậy, cú pháp không hỗ trợ hoặc lỗi lúc chạy sẽ lộ ra mà không hỏng mã nguồn đang bảo trì.

Đoạn mã có thể cần kiểm thử thêm

Một số kiểu viết rất nhạy với đổi tên hoặc sắp xếp lại:

  • Mã phụ thuộc tên hàm hoặc tên lớp.
  • Phản chiếu và truy cập thuộc tính động.
  • Framework dựa vào quy ước đặt tên.
  • Dữ liệu tuần tự hóa gắn với tên thuộc tính.
  • Tham chiếu sự kiện hoặc hàm qua chuỗi ký tự.
  • Nhập mô-đun động.
  • Mã dùng eval() hoặc hàm sinh ra lúc chạy.
  • Biểu thức chính quy và chuỗi có ký tự thoát.
  • Giao diện lập trình của tiện ích mở rộng hoặc userscript.
  • Tệp source map và dịch vụ báo lỗi.

Hãy dùng bộ kiểm thử đại diện và tránh thiết lập mạnh tay nhất cho tới khi ứng dụng được xác minh.

Làm rối mã và hiệu năng

Làm rối mã có thể khiến tệp to ra và máy xử lý nhiều hơn. Bảng chuỗi, thay đổi luồng điều khiển và phép biến đổi phòng thủ thường thêm mã chứ không bớt.

Hãy đo:

  • Dung lượng tệp phát hành.
  • Dung lượng truyền sau khi nén.
  • Thời gian trang bắt đầu chạy.
  • Độ nhạy khi thao tác.
  • Mức dùng bộ nhớ ở trang mở lâu.
  • Hiệu năng trên máy yếu của trường.

Một phép biến đổi trông mạnh hơn cũng vô ích nếu nó khiến ứng dụng dùng trên lớp chạy chậm hoặc chập chờn.

Làm rối mã và gỡ lỗi

Lỗi sau khi phát hành khó lần ra hơn khi vết gọi hàm chỉ toàn tên và vị trí đã biến đổi. Hãy giữ liên hệ giữa từng tệp đã đưa lên và phiên bản mã nguồn của nó.

Tệp source map có thể nối lỗi phát hành về lại mã dễ đọc, nhưng một tệp source map ai cũng tải được sẽ lộ đúng phần mã nguồn mà việc làm rối định che. Hãy cân nhắc kỹ có lưu những tệp này không và lưu ở đâu.

Khi có lỗi:

  1. Ghi lại phiên bản đã đưa lên.
  2. Tái hiện sự cố trong môi trường có kiểm soát.
  3. Dùng đúng mã nguồn dễ đọc và thiết lập dựng bản tương ứng.
  4. Sửa ở mã nguồn, không sửa kết quả đã làm rối.
  5. Tạo bản dựng phát hành mới rồi kiểm thử.

Làm rối mã không phải kiểm soát truy cập

Nút bấm bị ẩn, điểm cuối, đáp án hay thao tác quản trị nằm trong JavaScript đã làm rối vẫn được gửi xuống trình duyệt như thường.

Quyết định về bảo mật phải do hệ thống đáng tin cậy thực thi. Máy chủ nên tự kiểm tra:

  • Danh tính người dùng.
  • Quyền hạn.
  • Điểm số được gửi lên.
  • Tình trạng mua hàng hoặc đăng ký.
  • Quyền truy cập tệp.
  • Quyền sở hữu dữ liệu.
  • Giới hạn số lượt gọi.
  • Tính hợp lệ của dữ liệu nhập.

Phía giao diện có thể làm trải nghiệm dễ chịu hơn, nhưng không thể tin nó áp đặt luật lệ lên người đang nắm quyền điều khiển trình duyệt.

Những vấn đề công cụ này giải quyết

  • Một học sinh muốn hạn chế sao chép tùy tiện dự án trên trình duyệt.
  • Một giáo viên phát hành bài trình diễn tương tác tự làm.
  • Bản thử nghiệm cần bản phân phát khó đọc hơn.
  • Trò chơi phía máy khách để lộ quá rõ chi tiết cài đặt.
  • Buổi học lập trình so sánh mã dễ đọc, mã rút gọn và mã đã làm rối.
  • Một nhóm cần thử mã đã biến đổi có qua được quy trình dựng bản không.
  • Hồ sơ năng lực có hiệu ứng giao diện tự viết.
  • Một quy trình phát hành cũ đòi tệp JavaScript đã làm rối.

Lỗi thường gặp khi làm rối mã

Xóa mất mã nguồn dễ đọc

Tệp đã làm rối là bản lưu rất tệ cho việc bảo trì. Hãy giữ dự án gốc và cấu hình dựng bản.

Đặt khóa bí mật vào mã phía giao diện

Làm rối mã không bảo vệ được khóa API, mật khẩu, mã thông báo hay điểm cuối riêng tư. Hãy chuyển thao tác nhạy cảm sang máy chủ.

Làm rối mã trước khi kiểm thử

Phép biến đổi khiến lỗi sẵn có càng khó chẩn đoán. Hãy có bản dựng từ mã nguồn chạy được trước.

Dùng ngay thiết lập mạnh nhất

Phép biến đổi mạnh tay có thể phá mã động hoặc làm hiệu năng đi xuống. Hãy bắt đầu với mẫu đại diện và thiết lập vừa phải.

Sửa trực tiếp kết quả đã làm rối

Thay đổi thủ công trên tệp phát hành không thể tạo lại chắc chắn. Hãy sửa mã nguồn rồi dựng lại.

Tưởng mã không thể khôi phục được

Công cụ như Gỡ rối mã JavaScript và công cụ nhà phát triển của trình duyệt đều hỗ trợ phân tích. Làm rối mã chỉ là rào cản, không phải lớp bảo vệ tuyệt đối.

Bỏ qua giấy phép

Làm rối đoạn mã sao chép không biến nó thành của mình, cũng không xóa được yêu cầu của giấy phép.

Bỏ qua kiểm thử bản phát hành

Mã nguồn dễ đọc có thể chạy tốt trong khi bản đã biến đổi lại hỏng. Hãy kiểm thử đúng tệp sắp đưa lên.

Quyền riêng tư và cách dùng có trách nhiệm

JavaScript gửi xuống trình duyệt nên coi là công khai. Đừng nhúng hồ sơ học sinh, thông tin đăng nhập giáo viên, ghi chú riêng tư, mật khẩu cơ sở dữ liệu hay tài liệu mật vào tập lệnh phía máy khách.

Trước khi gửi mã lên công cụ làm rối trực tuyến, hãy gỡ hết khóa bí mật và xác nhận dự án được phép xử lý qua dịch vụ bên ngoài.

Học sinh chỉ nên làm rối phần việc của mình hoặc đoạn mã mình được phép biến đổi. Ghi chú bản quyền và chú thích giấy phép bắt buộc phải giữ nguyên ở nơi còn hiệu lực.

Danh sách kiểm tra trước phát hành

  • Mã nguồn dễ đọc đã lưu và sao lưu dự phòng.
  • Ứng dụng chưa làm rối vượt qua các bài kiểm thử.
  • Mã máy khách không có mật khẩu, khóa riêng hay dữ liệu học sinh.
  • Đã kiểm thử tập lệnh đại diện với thiết lập đã chọn.
  • Kết quả đã làm rối nạp lên không báo lỗi cú pháp.
  • Biểu mẫu, nút bấm, menu và bàn phím vẫn chạy bình thường.
  • Yêu cầu mạng đi tới đúng địa chỉ đã duyệt.
  • Hiệu năng vẫn chấp nhận được trên thiết bị mục tiêu.
  • Báo cáo lỗi nối được về đúng phiên bản mã nguồn.
  • Yêu cầu về giấy phép đều được giữ nguyên.
  • Bản dựng phát hành có thể tạo lại.
  • Phiên bản đã đưa lên được ghi lại chính xác.

Công cụ liên quan

Hãy dùng Làm đẹp JavaScript để mã lúc phát triển luôn dễ đọc. Công cụ Rút gọn JavaScript tạo bản phát hành gọn nhẹ khi mục tiêu chính là cắt bớt ký tự thừa.

Công cụ Gỡ rối mã JavaScript cho thấy vì sao không nên coi làm rối là cách giữ kín lâu dài. Nó giúp lập trình viên được phép xem xét mã đã biến đổi, dù không khôi phục được từng chi tiết gốc.

Hãy dùng Làm đẹp HTMLLàm đẹp CSS khi phần đánh dấu hoặc kiểu dáng đi kèm cần dọn dẹp lúc phát triển.

Đôi lời khép lại

Công cụ làm rối mã JavaScript có thể khiến mã trên trình duyệt khó hiểu hơn với người đọc lướt. Nó hữu ích cho trò chơi học sinh, bản thử nghiệm, bài trình diễn tương tác, hồ sơ năng lực và một số tập lệnh phát hành.

Nhưng nó không tạo ra sự kín đáo, cũng không thay thế việc phân quyền ở máy chủ. Mọi thứ gửi xuống trình duyệt đều có thể bị thu lại và phân tích, nên thông tin đăng nhập và quyết định cần tin cậy phải nằm trên hệ thống được bảo vệ.

Hãy giữ mã nguồn dễ đọc, dùng thiết lập vừa phải và kiểm thử đúng kết quả sắp đưa lên. Làm rối mã phát huy tốt nhất khi chỉ là một kỹ thuật phát hành có giới hạn, nằm trong quy trình rộng hơn gồm quản lý phiên bản, giấy phép, kiểm soát truy cập và thiết kế ứng dụng an toàn.

Dành cho giáo viênDành cho học sinh