Skip to content

Giới hạn và bảo mật ​

Giới hạn của script ​

Giới hạnGiá trịVượt thì sao
Chạy liền không chờ1 giâyScript 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ước1 giâyCá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 script64 MBScript 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 event10.000connect 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ận64 KB văn bảnNó không bao giờ tới người chơi. Tách thành nhiều Module
Một tin nhắn net16 KB
Một giá trị data16 KB
Số yêu cầu data đang chờ64 mỗi server
JSONsâu 100 cấp, 16 MBBáo lỗi

Giới hạn của world ​

Giới hạnGiá trị
Số part (tính cả Model và Folder)10.000
Một world khi go live16 MB
Kích thước một part0,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 world13
Người chơi mỗi server1 tới 100
Hình ảnh tải lên64 mỗi world, 1.024 px mỗi cạnh
Âm thanh tải lên32 mỗi world, mỗi cái 20 MB và hai phút, .wav
Thành tựu100 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: NaN hay 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 walkSpeed và jumpPower củ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:

  1. 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.
  2. 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.
  3. 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.
  4. 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ùng x như 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.