This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Безпека застосунків — це широка тема, яка охоплює все: від безпечних практик розробки до захисту вмісту гри після її випуску. Цей посібник розглядає низку тем у контексті безпеки застосунків під час використання рушія, інструментів і сервісів Defold:
Більшість розробників турбує питання, як захистити свої творіння від крадіжки. З правового погляду авторське право, патенти й торговельні марки можуть захищати різні аспекти інтелектуальної власності відеоігор. Авторське право надає його власнику виключне право на розповсюдження творчого доробку, патенти захищають винаходи, а торговельні марки — назви, символи й логотипи.
Також може бути доцільно вжити технічних заходів для захисту творчого доробку гри. Однак важливо пам’ятати: щойно гра потрапляє до рук гравця, з’являється можливість знайти способи видобути її ресурси. Цього можна досягти шляхом зворотного проєктування застосунку гри та її файлів, а також за допомогою інструментів, які видобувають текстури й моделі під час їх передавання до GPU або інші ресурси під час завантаження в пам’ять.
Тому наша загальна позиція така: якщо користувачі твердо вирішили видобути ресурси гри, вони зможуть це зробити.
Розробники можуть додати власний захист, щоб ускладнити, але не унеможливити, видобування ресурсів. Зазвичай це різноманітні засоби шифрування й обфускації для захисту та приховування ресурсів гри.
Обфускація вихідного коду — це автоматизований процес, під час якого вихідний код навмисно ускладнюють для розуміння людиною, не впливаючи на результат роботи програми. Зазвичай її мета — захист від крадіжки, а також ускладнення читерства.
У Defold обфускацію вихідного коду можна виконувати як попередній крок перед збиранням або як складову процесу збирання Defold. У першому випадку вихідний код обфускують відповідним інструментом до початку процесу збирання Defold.
Обфускацію під час збирання, зі свого боку, інтегрують у процес збирання за допомогою плагіна збирача Lua. Плагін збирача Lua отримує необроблений вихідний код і повертає його обфусковану версію. Один із прикладів обфускації під час збирання наведено в розширенні Prometheus, яке ґрунтується на обфускаторі Lua Prometheus, доступному на GitHub. Нижче наведено приклад використання Prometheus для інтенсивної обфускації фрагмента коду (зауважте, що така сильна обфускація впливатиме на швидкодію коду Lua під час виконання):
Приклад:
function init(self)
print("hello")
test.greet("Bob")
end
Обфускований результат:
local v={"+qdW","ZK0tEKf=";"XP/IX3+="}for o,J in ipairs({{1;3};{1,1},{2,3}})do while J[1]<J[2]do v[J[1]],v[J[2]],J[1],J[2]=v[J[2]],v[J[1]],J[1]+1,J[2]-1 end end local function J(o)return v[o+45816]end do local o={["/"]=9;["8"]=48;["9"]=1;q=38,o=62;V=33;y=43,d=61,B=50,L=54;v=2;["0"]=21,n=31;p=63;R=5;N=3;i=10;e=35;C=7;l=56;a=47,J=58;m=59;["2"]=36;z=11;M=12;Z=26;O=18;["5"]=20;s=8,["4"]=30,P=55;w=4;U=29;Q=28;r=24,h=41;G=45;c=19;W=34,k=57;T=14,t=44,S=0;f=60;F=42,E=27;u=40;X=25,j=17;["3"]=23,b=13;["1"]=53;Y=32,A=22,K=6,["+"]=16,["6"]=46;["7"]=51;I=37;D=52;H=15,x=49,g=39}local J=type local x=string.sub local d=v local l=string.len local W=string.char local L=table.insert local w=table.concat local h=math.floor for v=1,#d,1 do local X=d[v]if J(X)=="string"then local J=l(X)local H={}local S=1 local k=0 local K=0 while S<=J do local v=x(X,S,S)local d=o[v]if d then k=k+d*64^(3-K)K=K+1 if K==4 then K=0 local o=h(k/65536)local v=h((k%65536)/256)local J=k%256 L(H,W(o,v,J))k=0 end elseif v=="="then L(H,W(h(k/65536)))if S>=J or x(X,S+1,S+1)~="="then L(H,W(h((k%65536)/256)))end break end S=S+1 end d[v]=w(H)end end end local function o(o)test[J(-45815)](o)end function init(v)print(J(-45813))o(J(-45814))end
Під час збирання в Defold ресурси гри обробляються й перетворюються на формати, придатні для використання рушієм Defold під час виконання. Текстури компілюються у формат Basis Universal, колекції (collection), ігрові об’єкти (game object) та компоненти (component) перетворюються зі зрозумілого людині текстового представлення на двійкові відповідники, а вихідний код Lua обробляється й компілюється в байткод. Інші ресурси, як-от звукові файли, використовуються без змін.
Після завершення цього процесу ресурси один за одним додаються до архіву гри. Архів гри — це великий двійковий файл, а розташування кожного ресурсу в ньому зберігається у файлі індексу архіву. Формат задокументовано тут.
Перед додаванням до архіву файли вихідного коду Lua також можуть шифруватися. Стандартне шифрування в Defold використовує простий блоковий шифр, який не дає одразу побачити рядки з коду під час перегляду архіву гри інструментом для перегляду двійкових файлів. Його не слід вважати криптографічно стійким, оскільки вихідний код Defold доступний на GitHub, а ключ шифру можна побачити у вихідному коді.
Ви можете додати власне шифрування файлів вихідного коду Lua, реалізувавши плагін шифрування ресурсів. Такий плагін складається з частини, що шифрує ресурси під час збирання, і частини середовища виконання, що розшифровує ресурси під час їх читання з архіву гри. Базовий плагін шифрування ресурсів, який можна взяти за основу власного шифрування, доступний на GitHub.
Файл game.project буде включено до пакета вашого застосунку без змін. Іноді вам може знадобитися зберігати публічні ключі доступу до API або подібні значення, які є чутливими, хоча, можливо, й не приватними. Щоб посилити захист таких значень, їх можна включити до двійкового файлу застосунку замість зберігання в game.project, зберігши доступ до них через функції API Defold, як-от sys.get_config_string() та подібні. Для цього додайте нативне розширення у ваш game.project і скористайтеся макросом DM_DECLARE_CONFIGFILE_EXTENSION, щоб перевизначити спосіб отримання значень конфігурації через функції API Defold. Приклад проєкту, який можна взяти за основу, доступний на GitHub.
Читерство у відеоіграх існує стільки ж, скільки й сама ігрова індустрія. Колись чит-коди поширювали в популярних журналах про відеоігри, а для перших домашніх комп’ютерів продавали спеціальні картриджі для читерства. Разом із розвитком індустрії та ігор розвивалися й читери та їхні методи. Ось деякі з найпоширеніших механізмів читерства в іграх:
Захист від читерів — складне завдання, що межує з неможливим. Навіть хмарні ігри, які виконуються на віддалених серверах і транслюються безпосередньо на пристрій користувача, не повністю захищені від читерів.
Defold не надає рішень для протидії читерству в рушії чи інструментах і натомість залишає цю роботу одній із багатьох компаній, що спеціалізуються на таких рішеннях для ігор.
Обмін даними через сокети й HTTP у Defold підтримує захищені з’єднання через сокети. Для будь-якого обміну даними із сервером рекомендується використовувати захищені з’єднання, щоб автентифікувати сервер і захистити конфіденційність та цілісність даних під час їх передавання від клієнта до сервера й навпаки. Defold використовує популярну й широко вживану реалізацію протоколів TLS та SSL з відкритим вихідним кодом Mbed TLS. Mbed TLS розробляють ARM та її технологічні партнери.
Щоб запобігти атакам посередника на ваш мережевий обмін даними, під час узгодження з’єднання із сервером можна перевіряти ланцюжок сертифікатів у межах рукостискання SSL. Для цього надайте мережевому клієнту Defold список відкритих ключів. Докладніше про захист мережевого обміну даними читайте в розділі про перевірку SSL у посібнику з мережевої взаємодії.
Хоча для створення гри не обов’язково використовувати сторонні бібліотеки чи нативні розширення, розробники дуже часто використовують ресурси з офіційного порталу ресурсів, щоб пришвидшити розробку. Портал ресурсів містить великий вибір ресурсів: від інтеграцій зі сторонніми SDK до менеджерів екранів, бібліотек інтерфейсу користувача, камер і багато чого іншого.
Жоден ресурс на порталі ресурсів не проходив перевірку Defold Foundation, і ми не несемо відповідальності за пошкодження вашої комп’ютерної системи чи іншого пристрою або втрату даних унаслідок використання будь-якого ресурсу, отриманого через портал ресурсів. Юридичні подробиці можна прочитати в наших Умовах використання.
Рекомендуємо перевіряти кожен ресурс перед використанням, а після того, як ви переконаєтеся в його придатності для вашого проєкту, створити його форк або копію, щоб він не змінився без вашого відома.
Хмарні сервери збирання Defold (також відомі як сервери extender) створено, щоб допомогти розробникам додавати нові можливості до рушія Defold без потреби перезбирати сам рушій. Під час першого збирання проєкту Defold, який містить нативний код, цей код і всі пов’язані ресурси надсилаються на хмарні сервери збирання, де створюється спеціальна версія рушія Defold, яка потім надсилається розробнику. Цей самий процес застосовується, коли проєкт збирають із власним маніфестом застосунку для вилучення невикористовуваних компонентів із рушія.
Хмарні сервери збирання розміщені в AWS і створені відповідно до найкращих практик безпеки. Однак Defold Foundation не гарантує, що хмарні сервери збирання відповідатимуть вашим вимогам, не матимуть дефектів, вірусів або помилок, будуть безпечними, чи що ваше користування серверами буде безперервним або безпечним. Юридичні подробиці можна прочитати в наших Умовах використання.
Якщо вас непокоять безпека й доступність серверів збирання, рекомендуємо налаштувати власні приватні сервери збирання. Інструкції з налаштування власного сервера можна знайти в головному файлі readme репозиторію extender на GitHub.
Система Live Update у Defold дає розробникам змогу виключати вміст з основного пакета гри для завантаження й використання згодом. Типовий приклад — завантаження додаткових рівнів, карт або світів у міру проходження гри гравцем.
Коли виключений вміст завантажено й підготовлено до використання в грі, рушій перевіряє його перед використанням. Перевірка складається з кількох пунктів:
Докладніше про цей процес читайте в посібнику з Live Update.