צ'יטים מאפשרים לקליינטים זדוניים להפעיל אירועים בכל הקשר. למדו כיצד לאבטח את התקשורת בין הקליינט לשרת, ליישם אימות בצד השרת ולהגדיר משתני אבטחה של FXServer.
צוות האנטי-צ'יט תמיד מנסה לשפר את האנטי-צ'יט, אבל לפעמים דברים חומקים.
במדריך זה ננסה לעזור לכסות כמה דברים נפוצים שתוכלו לעשות כדי להפוך את השרת שלכם למאובטח יותר על ידי נעילה נכונה של האירועים שלכם.
צ'יטים יכולים לאפשר לקליינט להפעיל אירועים בכל הקשר.
כשאנו אומרים הקשר (context) אנו מתכוונים שהם יכולים לבצע קליינט->שרת (באמצעות TriggerServerEvent) או משאב קליינט->משאב קליינט (באמצעות TriggerEvent).
בעבודה עם אירועים ב-Lua, חיוני לרשום אותם בצורה נכונה בהתבסס על השאלה האם הם נקראים על ידי הקליינט או השרת.
טעות נפוצה היא רישום אירועי שרת שאינם אמורים להיקרא על ידי הקליינט, או להיפך, מה שעלול להוביל לפרצות אבטחה חמורות.
השתמשו ב-AddEventHandler כאשר האירוע מיועד להפעלה באותו הקשר, קליינט-קליינט או שרת-שרת. זה מבטיח שהאירועים אינם מרושתים ולא ניתן לקרוא להם מהצד השני.
AddEventHandler("eventName", function(eventParam1, eventParam2)
-- הקוד כאן יבוצע ברגע שהאירוע יופעל באותו הקשר.
end)השתמשו ב-RegisterNetEvent כאשר האירוע צריך להיות מופעל בהקשרים שונים, כגון מקליינט לשרת או משרת לקליינט.
RegisterNetEvent("eventName", function(eventParam1, eventParam2)
-- הקוד כאן יבוצע ברגע שהאירוע יופעל בהקשרים שונים.
end)דוגמה זו מיועדת לקליינט, וכמו כל דבר בקליינט, היא אינה חסינת כדורים וניתנת למניפולציה על ידי קליינטים שמשתמשים בצ'יטים.
אם ברצונכם לחסום ביצוע מאותו הקשר (כמו מניעת הפעלת אירוע רשת שרת-לשרת על ידי הקליינט), עליכם לרשום את האירוע שלכם ולאמת את מקור השולח:
RegisterNetEvent("eventName", function(eventParam1, eventParam2)
-- השרת ישלח מזהה רשת `65535` עבור אירועים מהשרת
if source ~= 65535 then return end
end)גם אם תבנו אנטי-צ'יט חזק, הוספת בדיקות לאירועי שרת הופכת אותם למאובטחים משמעותית יותר. זוהי פרקטיקה מומלצת ביותר, אם כי היא אינה מונעת הכל. להלן אנו משתפים כמה טיפים טובים.
זה מבטיח את שלמות ואבטחת סביבת המשחק שלכם.
כל הדוגמאות להלן מניחות שימוש במסגרת עבודה כלשהי (כמו ESX, QB-Core וכו').
זה נועד להראות לכם דרכים רעות לביצוע אירועים, לעולם אל תעשו זאת. הוספת פריטים ישירות למשתמש מהקלט שלו היא תמיד פרקטיקה גרועה: עליכם תמיד לאמת את קלט המשתמש.
RegisterNetEvent("job:givePlayerItem", function(item, count)
local ply = FX.GetPlayerFromSource(source)
-- הוספת פריטים ישירות למשתמש מהקלט שלו אינה בטוחה!
ply.addItem(item, count)
end)הנה דפוס אבטחה חזק. השרת עוקב אחר מצב השחקן והקואורדינטות שלו, ומאמת פעולות באמצעות טיקים בצד השרת במקום להסתמך אך ורק על טריגרים של הקליינט.
-- קואורדינטה אקראית
local VALID_JOB_COORD = vector3(125.0, 111.1, 35.83)
local MAX_ITEM_COUNT = 10
-- קואורדינטה אקראית
local VALID_TURNIN_COORD = vector3(1888.0, 1254.1, 48.0)
local ITEM_NAME = 'log'
-- רשימת שחקנים עם עבודות פעילות
local activeJobs = {}
AddEventHandler("playerDropped", function ()
if not activeJobs[source] then return end
activeJobs[source] = nil
end)
function isPedWithinRange(ped, tgtCoords)
return #(GetEntityCoords(ped) - tgtCoords) < 15.0
end
-- טיפול בהגדלת כמות הפריטים שחקן יקבל בצד השרת
CreateThread(function()
while true do
for src, data in pairs(activeJobs) do
local ped = GetPlayerPed(src)
-- אם הם לא בטווח, אנחנו לא רוצים לתת להם את הפריט
if isPedWithinRange(ped, VALID_JOB_COORD) then
-- תן להם את הפריט, אך הגבל אותו ל-MAX_ITEM_COUNT
data.itemCount = math.min(data.itemCount + 1, MAX_ITEM_COUNT)
end
end
-- עבד טיק עבודה פעם בשנייה
Wait(1000)
end
end)
RegisterNetEvent("job:startJob", function()
local ped = GetPlayerPed(source)
-- אם הם בטווח של 15 יחידות, הם עושים את העבודה
if isPedWithinRange(ped, VALID_JOB_COORD) then
activeJobs[source] = {
itemCount = 0,
}
end
end)
RegisterNetEvent("job:givePlayerItem", function()
local ply = FX.GetPlayerFromSource(source)
-- אם אין להם עבודה פעילה, הם לא אמורים להגיע לזה!
local jobData = activeJobs[source]
if not jobData then return end
local ped = GetPlayerPed(source)
-- הם לא בטווח של קואורדינטות המסירה, דחה את השינויים שלהם
if not isPedWithinRange(ped, VALID_TURNIN_COORD) then return end
-- אפס את נתוני הפריט כדי שלא יוכלו להפעיל אותו מספר פעמים
activeJobs[source] = nil
-- הוסף פריטים למשתמש לאחר אימות בצד השרת
ply.addItem(ITEM_NAME, jobData.itemCount)
end)שימו לב שלא מומלץ לשנות את ההגדרות הבאות אלא אם כן אתם יודעים בדיוק מה אתם עושים. צוות Cfx.re / Adhesive תמיד עובד קשה כדי למנוע צ'יטרים. רוב התכונות הללו יהיו פעילות כברירת מחדל עם גרסת FXServer 8450 ומעלה.
הפעלת משתני קונסול אלו כנראה תגרום לבעיטת השחקן עם הסיבה הבאה: Connection to CNL timed out.
בעיטה מהשרת אינה אומרת שהשחקן מקבל באן גלובלי (Global Ban) באופן אוטומטי. עם זאת, היא מספקת אינדיקציה חזקה לאמינות השחקן, מה שמועיל ביותר להערכת מידת האמינות שלו.
הקודים המסופקים אינם אמורים לעבוד בשיטה של העתק-הדבק. אלו רק כמה טיפים למניעת פעולות מסוימות שעלולות להתרחש בשרת. הדבר דורש ידע מסוים בתכנות. אתם תמיד מוזמנים להצטרף לדיסקורד שלנו כדי לקבל עזרה נוספת.