Quy tắc kiểm tra

Bộ quy tắc phiên bản 1.0.0. Mã quy tắc là ổn định: một khi đã phát hành thì không đổi, nên bạn có thể tham chiếu chúng trong tài liệu nội bộ.

Hạn mức

Tệp zip tải lên200 MB
Tổng sau giải nén600 MB
Tải trọng khởi động30.0 MB
Một tệp đơn lẻ200 MB
Số tệp tối đa6.000
Tỉ lệ nén tối đa120:1
Độ sâu thư mục12 cấp
Lỗi console cho phép0

Ảnh cửa hàng: biểu tượng đúng 512×512 (PNG/WebP), ảnh bìa tối thiểu 1280×720 đúng tỉ lệ 16:9, ảnh chụp màn hình tối thiểu 960×540, từ 1 đến 8 ảnh.

Danh mục quy tắc

59 quy tắc · 45 quy tắc chặn xuất bản
MF-001Lỗi chặnManifest

Thiếu tệp p2game.json ở thư mục gốc

Manifest là hợp đồng kỹ thuật giữa game và nền tảng; không có nó thì nền tảng không biết cách nạp, cấp quyền hay hiển thị game.

Cách sửa: Tạo tệp p2game.json ngay tại gốc bản build (cùng cấp với index.html). Tải khung mẫu ở Developer Portal › Tài liệu › Manifest.

MF-002Lỗi chặnManifest

p2game.json không phải JSON hợp lệ

Manifest hỏng khiến toàn bộ pipeline không chạy được.

Cách sửa: Kiểm tra dấu phẩy thừa, nháy đơn thay vì nháy kép, hoặc chú thích // trong JSON.

MF-003Lỗi chặnManifest

Manifest sai lược đồ

Mỗi trường trong manifest điều khiển một hành vi thật của nền tảng (CSP, khung nhìn, bảng xếp hạng); sai kiểu dữ liệu sẽ dẫn tới hành vi không xác định.

Cách sửa: Đọc chi tiết lỗi theo từng trường ở phần dưới của báo cáo và sửa đúng kiểu dữ liệu.

MF-004Lỗi chặnManifest

manifest.id không khớp slug đã đăng ký

Ngăn một bản build bị đẩy nhầm sang game khác, kể cả khi cùng tài khoản.

Cách sửa: Đặt `id` trong p2game.json bằng đúng slug hiển thị ở trang quản lý game.

MF-005Lỗi chặnManifest

Phiên bản không tăng so với bản đã xuất bản

Người chơi và bộ nhớ đệm CDN dựa vào semver để biết khi nào cần tải lại.

Cách sửa: Tăng `version` trong p2game.json lên cao hơn phiên bản đang xuất bản.

MF-006Cảnh báoManifest

Chưa khai báo shortDescription

Kho game dùng mô tả ngắn cho thẻ game; thiếu thì phải cắt tạm từ mô tả dài và thường bị hụt nghĩa.

Cách sửa: Thêm `shortDescription` dài 10–160 ký tự.

ST-001Lỗi chặnCấu trúc gói

Không tìm thấy tệp khởi động

Không có entry thì không có gì để nạp vào iframe.

Cách sửa: Đảm bảo tệp trỏ bởi `entry` (mặc định index.html) thực sự tồn tại trong gói.

ST-002Lỗi chặnCấu trúc gói

Gói vượt giới hạn dung lượng

Bản build quá lớn khiến người chơi trên mạng yếu không mở nổi và làm tăng chi phí phân phối.

Cách sửa: Nén texture (WebP/AVIF, KTX2/Basis), bật nén Brotli cho wasm/data, loại bỏ tài nguyên không dùng.

ST-003Lỗi chặnCấu trúc gói

Gói vượt giới hạn số tệp

Hàng chục nghìn tệp nhỏ làm chậm giải nén, quét và phân phối.

Cách sửa: Gộp tài nguyên thành atlas/bundle thay vì để rời từng tệp.

ST-004Lỗi chặnCấu trúc gói

Đường dẫn thoát khỏi thư mục gốc (zip slip)

Tệp có đường dẫn `../` hoặc đường dẫn tuyệt đối có thể ghi đè tệp ngoài thư mục giải nén — một kiểu tấn công vào hạ tầng.

Cách sửa: Đóng gói lại từ bên trong thư mục build, không dùng `zip -r ../out.zip .` với đường dẫn cha.

ST-005Lỗi chặnCấu trúc gói

Gói chứa liên kết tượng trưng (symlink)

Symlink có thể trỏ ra ngoài gói và làm rò rỉ tệp của máy chủ.

Cách sửa: Dùng `zip -r --symlinks=no` hoặc sao chép nội dung thật thay cho symlink.

ST-006Lỗi chặnCấu trúc gói

Gói chứa tệp thực thi hoặc mã máy chủ

Nền tảng chỉ phục vụ nội dung tĩnh; tệp .php/.sh/.exe không bao giờ được chạy và chỉ là dấu hiệu đóng gói sai hoặc cố tình.

Cách sửa: Xoá các tệp bị liệt kê khỏi bản build.

ST-007Lỗi chặnCấu trúc gói

Tỉ lệ nén bất thường (nghi ngờ zip bomb)

Tệp nén nhỏ nhưng giải nén khổng lồ là dấu hiệu tấn công cạn tài nguyên.

Cách sửa: Kiểm tra lại nội dung gói; loại bỏ tệp rỗng khổng lồ hoặc dữ liệu lặp.

ST-008Lỗi chặnCấu trúc gói

Đường dẫn không hợp lệ

Tên tệp có ký tự điều khiển, khoảng trắng đầu/cuối hoặc quá dài gây lỗi khi phục vụ qua HTTP trên một số hệ điều hành.

Cách sửa: Đổi tên tệp chỉ dùng chữ thường, số, dấu gạch ngang, gạch dưới và dấu chấm.

ST-009Cảnh báoCấu trúc gói

Gói chứa mã nguồn hoặc thư mục phát triển

src/, node_modules/, .git/ làm phình bản build và có thể lộ khoá bí mật.

Cách sửa: Chỉ đóng gói thư mục kết quả biên dịch (dist/, build/, public/).

ST-010Lỗi chặnCấu trúc gói

Gói chứa tệp bí mật

Tệp .env, khoá SSH, .npmrc chứa thông tin đăng nhập — đưa lên nền tảng là rò rỉ.

Cách sửa: Xoá tệp và thu hồi (rotate) ngay các khoá đã bị đóng gói.

ST-011Cảnh báoCấu trúc gói

Có tệp không phục vụ được

Phần mở rộng không nằm trong danh sách phục vụ sẽ bị loại khi đóng gói; nếu game cần tệp đó thì sẽ hỏng khi chạy thật.

Cách sửa: Đổi sang định dạng được hỗ trợ, hoặc đổi phần mở rộng sang .bin/.data.

ST-012Lỗi chặnCấu trúc gói

Tệp đơn lẻ vượt giới hạn

Một tệp quá lớn không thể phân phối hiệu quả và thường vượt giới hạn bộ nhớ trình duyệt.

Cách sửa: Tách tệp dữ liệu thành nhiều phần hoặc nén lại.

HT-001Lỗi chặnTệp khởi động

Tệp khởi động không phải HTML hợp lệ

Thiếu thẻ <html> hoặc <body> khiến trình duyệt vào chế độ quirks và bố cục game vỡ.

Cách sửa: Xuất lại entry với cấu trúc HTML đầy đủ, có <!DOCTYPE html>.

HT-002Lỗi chặnTệp khởi động

Thiếu <!DOCTYPE html>

Không có doctype, trình duyệt chạy ở quirks mode và các phép tính kích thước canvas sai lệch.

Cách sửa: Thêm <!DOCTYPE html> ở dòng đầu tiên của entry.

HT-003Lỗi chặnTệp khởi động

Thiếu thẻ meta viewport

Không có viewport thì game không co giãn đúng trên thiết bị di động.

Cách sửa: Thêm <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">.

HT-004Lỗi chặnTệp khởi động

Nạp tài nguyên từ nguồn ngoài không được phép

CSP của nền tảng chặn mọi nguồn ngoài chưa khai báo; tài nguyên đó chắc chắn hỏng khi chạy thật, và nguồn ngoài không kiểm soát được là rủi ro chuỗi cung ứng.

Cách sửa: Tải tài nguyên về và đóng gói cùng game, hoặc dùng một trong các CDN nằm trong danh sách cho phép.

HT-005Lỗi chặnTệp khởi động

Tham chiếu tới tệp không tồn tại trong gói

Liên kết gãy trong entry nghĩa là game sẽ lỗi ngay khi mở.

Cách sửa: Kiểm tra lại đường dẫn tương đối; chú ý phân biệt hoa/thường vì máy chủ phân biệt chữ hoa chữ thường.

HT-006Lỗi chặnTệp khởi động

Dùng đường dẫn tuyệt đối bắt đầu bằng /

Game được phục vụ dưới một tiền tố đường dẫn riêng; đường dẫn tuyệt đối sẽ trỏ ra ngoài phạm vi game.

Cách sửa: Đổi mọi đường dẫn sang dạng tương đối (./assets/... thay vì /assets/...).

HT-007Lỗi chặnTệp khởi động

Thẻ <base> trỏ ra ngoài gói

Thẻ base ngoài phạm vi làm mọi đường dẫn tương đối thoát khỏi vùng cách ly của game.

Cách sửa: Bỏ thẻ <base> hoặc đặt href="./".

HT-008Cảnh báoTệp khởi động

Thiếu thẻ <title>

Tiêu đề được dùng khi người chơi mở game ở cửa sổ riêng.

Cách sửa: Thêm <title> trùng với tên game.

HT-009Cảnh báoTệp khởi động

Không tìm thấy phần tử <canvas>

Game khai báo engine đồ hoạ nhưng entry không có canvas nào — thường là do đóng gói nhầm thư mục.

Cách sửa: Kiểm tra lại entry, hoặc đổi `engine` sang `dom` nếu game thực sự dựng bằng DOM.

SE-001Lỗi chặnBảo mật

Cố thoát khỏi iframe hoặc điều khiển khung cha

Truy cập window.top / window.parent.location là hành vi chiếm quyền điều khiển trang chủ nền tảng.

Cách sửa: Bỏ mọi tham chiếu tới window.top, window.parent, top.location. Cần toàn màn hình thì dùng p2.ui.requestFullscreen() của SDK.

SE-002Lỗi chặnBảo mật

Đăng ký Service Worker

Service Worker sống lâu hơn phiên chơi và có thể chặn yêu cầu mạng của các game khác trên cùng origin.

Cách sửa: Bỏ navigator.serviceWorker.register(). Cần lưu dữ liệu ngoại tuyến thì dùng Cache Storage hoặc p2.storage.

SE-003Lỗi chặnBảo mật

Gọi tới miền ngoài chưa khai báo

Mọi kết nối ra ngoài phải minh bạch với người chơi và kiểm duyệt viên; CSP sẽ chặn nếu không khai báo.

Cách sửa: Thêm miền vào `networkAllowlist` kèm quyền `external-network`, hoặc bỏ lệnh gọi.

SE-004Lỗi chặnBảo mật

Dùng API nhạy cảm chưa xin quyền

Camera, micro, clipboard, định vị chỉ được mở khi game khai báo trước và kiểm duyệt viên chấp thuận.

Cách sửa: Khai báo quyền tương ứng trong `permissions` của manifest, hoặc bỏ lệnh gọi.

SE-005Cảnh báoBảo mật

Dùng eval hoặc new Function

CSP của nền tảng chặn eval; mã chạy qua eval cũng không kiểm duyệt tĩnh được.

Cách sửa: Thay bằng mã tường minh. Nếu engine (Unity/Godot) sinh ra, xuất bản với tuỳ chọn không dùng eval.

SE-006Lỗi chặnBảo mật

Phát hiện mã đào tiền mã hoá

Đào tiền bằng máy người chơi là hành vi bị cấm tuyệt đối.

Cách sửa: Gỡ toàn bộ mã liên quan. Vi phạm lặp lại sẽ bị khoá tài khoản nhà phát triển.

SE-007Lỗi chặnBảo mật

Nhúng mã theo dõi của bên thứ ba

Nền tảng không cho phép gửi dữ liệu người chơi ra dịch vụ phân tích ngoài.

Cách sửa: Bỏ các đoạn nhúng như Google Analytics, Facebook Pixel. Dùng p2.analytics.event() để đo lường trong phạm vi nền tảng.

SE-008Lỗi chặnBảo mật

Ghi đè hoặc giả mạo cầu nối SDK

Sửa window.parent.postMessage hay đối tượng p2game là mưu toan giả mạo điểm số hoặc danh tính người chơi.

Cách sửa: Chỉ dùng SDK chính thức qua gói @p2game/sdk và không can thiệp vào đối tượng toàn cục của nó.

SE-009Cảnh báoBảo mật

Mã bị làm rối ở mức cao

Mã cố tình làm rối gây khó kiểm duyệt; nền tảng sẽ soi kỹ hơn và thời gian duyệt kéo dài.

Cách sửa: Nộp bản dựng chỉ minified thông thường, kèm source map nếu có.

SE-010Lỗi chặnBảo mật

Cố mở cửa sổ hoặc chuyển hướng ra ngoài

Điều hướng người chơi ra ngoài nền tảng giữa phiên chơi là mẫu hành vi lừa đảo phổ biến.

Cách sửa: Bỏ window.open / location.assign tới miền ngoài. Cần liên kết ngoài thì đặt trong mô tả game.

SD-001Lỗi chặnSDK

Khai báo bảng xếp hạng nhưng không nhúng SDK

Không có SDK thì không có đường nào để điểm số đi từ game về nền tảng.

Cách sửa: Nhúng <script src="/sdk/p2game-sdk.v1.js"></script> trước mã game, hoặc cài gói @p2game/sdk.

SD-002Lỗi chặnSDK

Phiên bản SDK không còn được hỗ trợ

Phiên bản cũ thiếu các kiểm tra chống gian lận hiện hành.

Cách sửa: Nâng lên phiên bản SDK đang được hỗ trợ và khai lại `sdk.version` trong manifest.

SD-003Lỗi chặnSDK

Gửi điểm tới bảng chưa khai báo trong manifest

Bảng xếp hạng phải được khai trước để nền tảng biết trần điểm và cách sắp xếp.

Cách sửa: Thêm bảng vào mảng `leaderboards` trong manifest, hoặc sửa lại id trong lệnh gọi.

SD-004Cảnh báoSDK

Không gọi p2.ready()

Không có tín hiệu sẵn sàng, nền tảng phải hiển thị màn hình chờ cho tới khi hết thời gian.

Cách sửa: Gọi p2.ready() ngay khi game vẽ được khung hình đầu tiên.

AS-001Lỗi chặnẢnh cửa hàng

Thiếu tệp ảnh khai báo trong manifest

Kho game không hiển thị được nếu thiếu biểu tượng hoặc ảnh bìa.

Cách sửa: Kiểm tra đường dẫn trong `assets` của manifest có khớp tệp thật trong gói không.

AS-002Lỗi chặnẢnh cửa hàng

Biểu tượng sai kích thước

Biểu tượng được dùng ở nhiều mật độ điểm ảnh; kích thước sai gây méo hình.

Cách sửa: Xuất biểu tượng đúng 512×512 px, định dạng PNG hoặc WebP.

AS-003Lỗi chặnẢnh cửa hàng

Ảnh bìa sai tỉ lệ hoặc quá nhỏ

Ảnh bìa hiển thị ở khối anh hùng và thẻ game; sai tỉ lệ sẽ bị cắt mất nội dung.

Cách sửa: Xuất ảnh bìa tối thiểu 1280×720 px, đúng tỉ lệ 16:9.

AS-004Lỗi chặnẢnh cửa hàng

Ảnh chụp màn hình không đạt yêu cầu

Ảnh chụp là căn cứ để kiểm duyệt viên đối chiếu với game thật.

Cách sửa: Cung cấp 1–8 ảnh, tối thiểu 960×540 px, chụp từ chính game.

AS-005Lỗi chặnẢnh cửa hàng

Tệp ảnh hỏng hoặc sai định dạng

Phần mở rộng không khớp nội dung thật của tệp.

Cách sửa: Xuất lại ảnh bằng công cụ chuẩn và giữ đúng phần mở rộng.

PF-001Lỗi chặnHiệu năng

Tải trọng khởi động vượt ngưỡng

Tài nguyên chặn hiển thị quá nặng khiến người chơi bỏ đi trước khi game mở.

Cách sửa: Chia nhỏ tài nguyên, nạp trễ (lazy load) phần không cần cho màn hình đầu, bật nén Brotli.

PF-002Cảnh báoHiệu năng

Không bật nén cho tệp lớn

Tệp wasm/data chưa nén tốn băng thông gấp nhiều lần mức cần thiết.

Cách sửa: Xuất kèm bản .br hoặc .gz; nền tảng sẽ tự phục vụ bản đã nén.

PF-003Cảnh báoHiệu năng

Ảnh chưa được tối ưu

Ảnh PNG lớn chưa nén là nguyên nhân phổ biến nhất khiến bản build phình.

Cách sửa: Chuyển sang WebP/AVIF hoặc nén lossless bằng oxipng/pngquant.

RT-001Lỗi chặnChạy thử

Game không tải xong trong thời gian cho phép

Nếu bản chạy thử không mở nổi thì người chơi cũng vậy.

Cách sửa: Kiểm tra log chạy thử trong báo cáo; thường do tài nguyên gãy đường dẫn hoặc vòng lặp khởi tạo.

RT-002Lỗi chặnChạy thử

Có lỗi JavaScript chưa bắt khi khởi động

Lỗi chưa bắt ở giai đoạn khởi động gần như luôn dẫn tới màn hình trắng.

Cách sửa: Mở phần log chạy thử để xem thông báo lỗi và ngăn xếp gọi.

RT-003Lỗi chặnChạy thử

Không dựng được ngữ cảnh đồ hoạ đã khai báo

Game khai engine webgl/webgpu nhưng không lấy được ngữ cảnh — người dùng sẽ thấy khung trống.

Cách sửa: Thêm bước dự phòng khi getContext trả về null, hoặc đổi `engine` cho đúng thực tế.

RT-004Lỗi chặnChạy thử

Màn hình đầu tiên trống

Sau khi tải xong mà khung hình vẫn trắng/đen hoàn toàn nghĩa là game không chạy.

Cách sửa: Đảm bảo vòng lặp dựng hình bắt đầu ngay sau khi tài nguyên sẵn sàng.

RT-005Cảnh báoChạy thử

Yêu cầu mạng bị CSP chặn khi chạy thử

Các yêu cầu này cũng sẽ bị chặn khi người chơi thật vào game.

Cách sửa: Đóng gói tài nguyên vào bản build hoặc khai báo miền trong `networkAllowlist`.

RT-006Cảnh báoChạy thử

Không nhận được tín hiệu SDK sẵn sàng

Không có handshake thì nền tảng không cấp được phiên chơi cho bảng xếp hạng.

Cách sửa: Gọi p2.init() sớm và p2.ready() khi game vào được màn hình chơi.

RT-007Cảnh báoChạy thử

Dùng bộ nhớ vượt ngưỡng khuyến nghị

Bộ nhớ cao làm máy cấu hình thấp và thiết bị di động bị đóng thẻ.

Cách sửa: Giải phóng texture không dùng, giảm độ phân giải texture, dùng object pool.

CP-001Lỗi chặnTuân thủ

Chưa xác nhận quyền sở hữu nội dung

Nền tảng chỉ xuất bản nội dung mà nhà phát triển có quyền phát hành.

Cách sửa: Đặt `attestation.ownsRights` = true trong manifest sau khi đã chắc chắn về quyền.

CP-002Cảnh báoTuân thủ

Mô tả chứa từ ngữ cần kiểm duyệt kỹ

Một số từ khoá đòi hỏi đối chiếu với phân loại độ tuổi đã khai.

Cách sửa: Xem lại mô tả và phân loại độ tuổi; kiểm duyệt viên sẽ kiểm tra thủ công.

CP-003Lỗi chặnTuân thủ

Phân loại độ tuổi không phù hợp nội dung khai báo

Khai báo quảng cáo, mua trong ứng dụng hoặc nội dung người lớn buộc phải đi kèm phân loại tương ứng.

Cách sửa: Nâng `ageRating` cho đúng, hoặc gỡ nội dung tương ứng khỏi game.