Giới hạn và bảo mật
Giới hạn của script
| Giới hạn | Giá trị | Vượt thì sao |
|---|---|---|
| Chạy liền không chờ | 1 giây | Script bị dừng và báo lỗi. Đặt task.wait() trong vòng lặp dài |
| Mọi script của một server, trong một bước | 1 giây | Các luồng tới lượt chờ bước sau; các hàm xử lý event còn lại của bước đó bị bỏ qua một lần |
| Bộ nhớ mỗi môi trường script | 64 MB | Script dừng và báo lỗi; game và các script khác vẫn chạy |
| Số hàm nối vào một event | 10.000 | connect báo lỗi (thường do connect nằm trong vòng lặp) |
| Một ClientScript hay Module người chơi nhận | 64 KB văn bản | Nó không bao giờ tới người chơi. Tách thành nhiều Module |
Một tin nhắn net | 16 KB | |
Một giá trị data | 16 KB | |
Số yêu cầu data đang chờ | 64 mỗi server | |
| JSON | sâu 100 cấp, 16 MB | Báo lỗi |
Giới hạn của world
| Giới hạn | Giá trị |
|---|---|
| Số part (tính cả Model và Folder) | 10.000 |
| Một world khi go live | 16 MB |
| Kích thước một part | 0,05 tới 2.048 unit mỗi cạnh |
| Vị trí | trong vòng một triệu unit tính từ tâm |
| Model (mesh của MeshPart) | 64 mỗi world, mỗi cái 65.535 điểm |
| Nhóm va chạm riêng của world | 13 |
| Người chơi mỗi server | 1 tới 100 |
| Hình ảnh tải lên | 64 mỗi world, 1.024 px mỗi cạnh |
| Âm thanh tải lên | 32 mỗi world, mỗi cái 20 MB và hai phút, .wav |
| Thành tựu | 100 mỗi game |
Người chơi gửi được gì
App của người chơi chỉ gửi server những gì game yêu cầu, và server giới hạn:
- 120 tin nhắn mỗi giây (
net.send,net.call), 20 cú bấm và 20 thao tác tool. Phần còn lại bị bỏ. - Số phải là số thật:
NaNhay vô cực khiến cả tin nhắn bị từ chối. - Part từ ServerService hay StorageService, hoặc đã mất, tới nơi thành
nil. - Di chuyển là của server: nó di chuyển mọi nhân vật bằng
walkSpeedvàjumpPowercủa chính nó, nên người chơi không chạy nhanh hay bay được bằng cách sửa app. - Prompt, Clickable, các đối tượng gameplay và xây dựng đều được kiểm tra trên server - tầm với, part có đang bật, người chơi còn sống.
Viết game an toàn
Người chơi có thể chạy app đã sửa và gửi bất kỳ đối số nào với bất kỳ tên tin nhắn nào script của bạn đang nghe. Vậy nên:
- Không bao giờ lấy kết quả từ người chơi. Không lấy số lượng, giá, sát thương, mục tiêu, điểm số. Client nói muốn làm gì; server tính chuyện gì xảy ra.
- Kiểm tra họ có được làm việc đó lúc này không: còn sống, đủ gần, hết thời gian hồi, có món đồ, đủ tiền.
- Giữ bí mật trên server. Mọi ClientScript - và mọi Module nó
requiređược - được gửi tới mọi người chơi (đã bỏ chú thích). Mã code, danh sách admin và logic chỉ của server để trong ServerService hoặc StorageService. - Kiểm tra kiểu dữ liệu. Đối số của tin nhắn có thể là bất cứ gì: kiểm tra
typeof(x) == "string"trước khi dùngxnhư chuỗi.
lua
-- Sai: client quyết định giá và phần thưởng
net.on("buy", function(player, item, price)
player.stats.Coins -= price
end)
-- Đúng: server biết giá
local PRICES = {Sword = 50}
net.on("buy", function(player, item)
if typeof(item) ~= "string" then return end
local price = PRICES[item]
if not price or player.stats.Coins < price then return end
player.stats.Coins -= price
shared.Items[item]:clone().parent = player.backpack
end)Số đi vào engine được kiểm tra ngay chỗ vào: vị trí NaN là một lỗi script bắt được bằng pcall, và giá trị khổng lồ bị giữ trong giới hạn của world. Máu dừng ở một tỉ, tốc độ ở 100.000 unit mỗi giây.
Sandbox
Script chạy trong sandbox: không file, không mạng, không tiến trình khác. Yêu cầu web của HttpService báo lỗi - game KHIM không ra ngoài internet. print từ ClientScript hiện trong bảng F3 của người chơi; từ Script, trong console của server (Live > Console của Workshop với game đang live). Lỗi script không bao giờ hiện trong chat của game.