3 new chapters by gamer777
This commit is contained in:
parent
59ca8e3e89
commit
b66cca5574
126
_de/quality/common_mistakes.md
Normal file
126
_de/quality/common_mistakes.md
Normal file
@ -0,0 +1,126 @@
|
||||
---
|
||||
title: Häufige Fehler
|
||||
layout: default
|
||||
root: ../..
|
||||
idx: 8.1
|
||||
redirect_from: /de/chapters/common_mistakes.html
|
||||
---
|
||||
|
||||
## Einleitung <!-- omit in toc -->
|
||||
|
||||
In diesem Kapitel werden häufige Fehler beschrieben und es wird erklärt, wie man diese vermeiden kann.
|
||||
|
||||
- [Vorsicht beim Speichern von ObjectRefs (z.B.: Spieler oder Entitäten)](#be-careful-when-storing-objectrefs-ie-players-or-entities)
|
||||
- [Vertrauen Sie keinen Formspec-Einsendungen](#dont-trust-formspec-submissions)
|
||||
- [ItemStacks nach dem Ändern einstellen](#set-itemstacks-after-changing-them)
|
||||
|
||||
## Vorsicht beim Speichern von ObjectRefs (z.B.: Spieler oder Entitäten) <a name="be-careful-when-storing-objectrefs-ie-players-or-entities"></a>
|
||||
|
||||
Eine ObjectRef wird ungültig, wenn der Spieler oder die Entität, die sie repräsentiert, das das Spiel verlässt. Dies kann passieren, wenn der Spieler offline geht oder die Entität nicht mehr geladen ist oder entfernt wird.
|
||||
|
||||
Die Methoden von ObjectRefs geben seit Minetest 5.2 immer `nil` zurück, wenn sie ungültig sind. Jeder Aufruf wird grundsätzlich ignoriert.
|
||||
|
||||
Sie sollten das Speichern von ObjectRefs nach Möglichkeit vermeiden. Wenn Sie dennoch eine ObjectRef speichern, sollten Sie dies vor der Verwendung überprüfen, etwa so:
|
||||
|
||||
```lua
|
||||
-- Funktioniert nur in Minetest 5.2+
|
||||
if obj:get_pos() then
|
||||
-- ist gültig!
|
||||
end
|
||||
```
|
||||
|
||||
## Vertrauen Sie keinen Formspec-Einsendungen <a name="dont-trust-formspec-submissions"></a>
|
||||
|
||||
Hacker können Formulare übermitteln, wann immer sie wollen und mit welchem Inhalt auch immer sie wollen.
|
||||
|
||||
Der folgende Code weist zum Beispiel eine Schwachstelle auf, die es Spielern ermöglicht sich selbst Moderatoren-Rechte zu geben:
|
||||
|
||||
```lua
|
||||
local function show_formspec(name)
|
||||
if not minetest.check_player_privs(name, { privs = true }) then
|
||||
return false
|
||||
end
|
||||
|
||||
minetest.show_formspec(name, "modman:modman", [[
|
||||
size[3,2]
|
||||
field[0,0;3,1;target;Name;]
|
||||
button_exit[0,1;3,1;sub;Promote]
|
||||
]])
|
||||
return true
|
||||
})
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player,
|
||||
formname, fields)
|
||||
-- SCHLECHT! Fehlender Privilegiencheck!
|
||||
|
||||
local privs = minetest.get_player_privs(fields.target)
|
||||
privs.kick = true
|
||||
privs.ban = true
|
||||
minetest.set_player_privs(fields.target, privs)
|
||||
return true
|
||||
end)
|
||||
```
|
||||
|
||||
Fügen Sie eine Berechtigungsprüfung hinzu, um dieses Problem zu lösen:
|
||||
|
||||
```lua
|
||||
minetest.register_on_player_receive_fields(function(player,
|
||||
formname, fields)
|
||||
if not minetest.check_player_privs(name, { privs = true }) then
|
||||
return false
|
||||
end
|
||||
|
||||
-- code
|
||||
end)
|
||||
```
|
||||
|
||||
## ItemStacks nach dem Ändern einstellen <a name="set-itemstacks-after-changing-them"></a>
|
||||
|
||||
Haben Sie bemerkt, dass es in der API einfach `ItemStack` genannt wird, nicht `ItemStackRef`, ähnlich wie `InvRef`? Das liegt daran, dass ein `ItemStack` keine Referenz ist - es ist eine Kopie. Stacks arbeiten mit einer Kopie der Daten und nicht mit dem Stapel im Inventar. Das bedeutet, dass das Ändern eines Stacks nicht wirklich den Stack im Inventar verändert.
|
||||
|
||||
Tun Sie zum Beispiel nicht dies:
|
||||
|
||||
```lua
|
||||
local inv = player:get_inventory()
|
||||
local stack = inv:get_stack("main", 1)
|
||||
stack:get_meta():set_string("description", "Teilweise gegessen")
|
||||
-- SCHLECHT! Änderung wird verloren gehen
|
||||
```
|
||||
|
||||
Machen Sie stattdessen Folgendes:
|
||||
|
||||
```lua
|
||||
local inv = player:get_inventory()
|
||||
local stack = inv:get_stack("main", 1)
|
||||
stack:get_meta():set_string("description", "Teilweise gegessen")
|
||||
inv:set_stack("main", 1, stack)
|
||||
-- Richtig! ItemStack ist eingestellt!
|
||||
```
|
||||
|
||||
Das Verhalten von Callbacks ist etwas komplizierter. Das Ändern eines `ItemStack`, der zurückgegeben wird, ändert diesen auch für den Aufrufer und alle nachfolgenden Aufrufe. In jedem Fall wird der ItemStack jedoch nur dann in der Engine gespeichert, wenn der Callback-Aufrufer ihn setzt.
|
||||
|
||||
```lua
|
||||
minetest.register_on_item_eat(function(hp_change, replace_with_item,
|
||||
itemstack, user, pointed_thing)
|
||||
itemstack:get_meta():set_string("description", "Teilweise gegessen")
|
||||
-- Fast richtig! Die Daten gehen verloren, wenn ein anderer
|
||||
-- Callback das Verhalten abbricht
|
||||
end)
|
||||
```
|
||||
|
||||
Wenn keine Rückrufe diesen Vorgang abbrechen, wird der Stack gesetzt und die Beschreibung aktualisiert. Wenn jedoch ein Rückruf dies abbricht, kann die Aktualisierung verloren gehen.
|
||||
|
||||
Es ist besser, dies stattdessen zu tun:
|
||||
|
||||
```lua
|
||||
minetest.register_on_item_eat(function(hp_change, replace_with_item,
|
||||
itemstack, user, pointed_thing)
|
||||
itemstack:get_meta():set_string("description", "Teilweise gegessen")
|
||||
user:get_inventory():set_stack("main", user:get_wield_index(),
|
||||
itemstack)
|
||||
-- Richtig, die Beschreibung wird immer eingestellt!
|
||||
end)
|
||||
```
|
||||
|
||||
Wenn die Callbacks abbrechen oder der Callback-Runner den Stack nicht setzt, dann wird die Aktualisierung trotzdem durchgeführt.
|
||||
Wenn die Rückrufe oder der Rückruf-Läufer den Stack setzen, spielt die Verwendung von set_stack keine Rolle.
|
93
_de/quality/luacheck.md
Normal file
93
_de/quality/luacheck.md
Normal file
@ -0,0 +1,93 @@
|
||||
---
|
||||
title: Automatische Fehlerüberprüfung
|
||||
layout: default
|
||||
root: ../..
|
||||
idx: 8.2
|
||||
description: Verwenden Sie LuaCheck, um Fehler zu finden
|
||||
redirect_from: /de/chapters/luacheck.html
|
||||
---
|
||||
|
||||
## Einleitung <!-- omit in toc -->
|
||||
|
||||
In diesem Kapitel werden Sie lernen, wie Sie das Werkzeug LuaCheck benutzt, um Ihren Mod auf Fehler zu überprüfen. Dieses Werkzeug kann in Kombination mit deinem Editor verwendet werden, um auf Fehler aufmerksam zu machen.
|
||||
|
||||
- [Installation von LuaCheck](#installation-von-luacheck)
|
||||
- [Windows](#windows)
|
||||
- [Linux](#linux)
|
||||
- [LuaCheck ausführen](#run)
|
||||
- [LuaCheck konfigurieren](#luacheck-konfigurieren)
|
||||
- [Fehlerbehebung](#fehlerbehebung)
|
||||
- [Verwendung mit einem Editor](#verwendung-mit-einem-editor)
|
||||
|
||||
## Installation von LuaCheck
|
||||
|
||||
### Windows
|
||||
|
||||
Laden Sie einfach luacheck.exe von [der Github-Releaseseite](https://github.com/mpeterv/luacheck/releases) herunter.
|
||||
|
||||
### Linux
|
||||
|
||||
Zuerst müssen Sie LuaRocks installieren:
|
||||
|
||||
sudo apt install luarocks
|
||||
|
||||
Sie können LuaCheck dann global (also für alle Benutzer) installieren:
|
||||
|
||||
sudo luarocks install luacheck
|
||||
|
||||
Prüfen Sie mit dem folgenden Befehl, ob es installiert ist:
|
||||
|
||||
luacheck -v
|
||||
|
||||
## LuaCheck ausführen <a name="run"></a>
|
||||
|
||||
Wenn Sie LuaCheck zum ersten Mal ausführen, wird es wahrscheinlich eine Menge falscher Fehler erkennen. Das liegt daran, dass es noch konfiguriert werden muss.
|
||||
|
||||
Unter Windows öffnen Sie die Powershell oder Bash im tammverzeichnis Ihres Projekts und führen Sie `path\to\luacheck.exe` aus.
|
||||
|
||||
Unter Linux führen Sie `luacheck ` aus, während Sie sich im Stammordner Ihres Projekts befinden.
|
||||
|
||||
## LuaCheck konfigurieren
|
||||
|
||||
Erstellen Sie eine Datei namens `.luacheckrc` im Stammverzeichnis Ihres Projekts. Dies kann das Stammverzeichnis Ihres Spiels, Modpacks oder Mods sein.
|
||||
|
||||
Fügen Sie den folgenden Inhalt in diese Datei ein:
|
||||
|
||||
```lua
|
||||
unused_args = false
|
||||
allow_defined_top = true
|
||||
|
||||
globals = {
|
||||
"minetest",
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
string = {fields = {"split"}},
|
||||
table = {fields = {"copy", "getn"}},
|
||||
|
||||
-- Eingebaut
|
||||
"vector", "ItemStack",
|
||||
"dump", "DIR_DELIM", "VoxelArea", "Settings",
|
||||
|
||||
-- MTG
|
||||
"default", "sfinv", "creative",
|
||||
}
|
||||
```
|
||||
|
||||
Als nächstes müssen Sie testen, ob es funktioniert, indem Sie LuaCheck ausführen. Diesmal sollten Sie viel weniger Fehler erhalten. Ändern Sie ab dem ersten Fehler, den Sie erhalten, den Code, um um das Problem zu beseitigen oder ändern Sie die Konfiguration, wenn der Code korrekt ist. Siehe die Liste unten.
|
||||
|
||||
### Fehlerbehebung
|
||||
|
||||
* **accessing undefined variable foobar** - Wenn `foobar` eine globale Variable sein soll, fügen Sie diese zu `read_globals` hinzu. Andernfalls fügen Sie alle fehlenden `local` zum Mod hinzu.
|
||||
* **setting non-standard global variable foobar** - Wenn `foobar` eine globale Variable sein soll, fügen Sie diese zu `globals` hinzu. Entfernen Sie diese aus `read_globals`, falls vorhanden.
|
||||
Andernfalls fügen Sie alle fehlenden `local` zum Mod hinzu.
|
||||
* **mutating read-only global variable 'foobar'** - Verschieben Sie `foobar` von `read_globals` nach `globals` oder hören Sie auf, in foobar zu schreiben.
|
||||
|
||||
## Verwendung mit einem Editor
|
||||
|
||||
Es wird dringend empfohlen, dass Sie ein Plugin für den Editor Ihrer Wahl finden und installieren, das Ihnen Fehler anzeigt, ohne dass Sie einen Befehl ausführen müssen. Für die meisten Editoren ist wahrscheinlich ein Plugin verfügbar.
|
||||
|
||||
* **VSCode** - Ctrl+P, dann einfügen: `ext install dwenegar.vscode-luacheck`
|
||||
* **Sublime** - Installieren Sie mit Hilfe von package-control:
|
||||
[SublimeLinter](https://github.com/SublimeLinter/SublimeLinter),
|
||||
[SublimeLinter-luacheck](https://github.com/SublimeLinter/SublimeLinter-luacheck).
|
92
_de/quality/security.md
Normal file
92
_de/quality/security.md
Normal file
@ -0,0 +1,92 @@
|
||||
---
|
||||
title: Sicherheit
|
||||
layout: default
|
||||
root: ../..
|
||||
idx: 8.3
|
||||
---
|
||||
|
||||
## Einleitung <!-- omit in toc -->
|
||||
|
||||
Sicherheit ist sehr wichtig, um sicherzustellen, dass Serverbesitzer durch den Mod keine Daten oder die Kontrolle verlieren.
|
||||
|
||||
- [Zentrale Konzepte](#zentrale-konzepte)
|
||||
- [Formspecs](#formspecs)
|
||||
- [Trauen Sie niemals Einsendungen](#trauen-sie-niemals-einsendungen)
|
||||
- [Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung](#check-use)
|
||||
- [(Unsichere) Umgebungen](#umgebungen)
|
||||
|
||||
## Zentrale Konzepte
|
||||
|
||||
Das wichtigste Sicherheitskonzept lautet: **Niemals dem Benutzer vertrauen**.
|
||||
Alles, was der Benutzer eingibt, sollte als bösartig betrachtet werden. Das bedeutet, dass Sie immer prüfen sollten, ob die eingegebenen Informationen gültig sind, dass der Benutzer über die richtigen Berechtigungen verfügt und dass er ansonsten berechtigt ist, diese Aktion durchzuführen (d.h. im Bereich oder als Eigentümer).
|
||||
|
||||
Eine böswillige Aktion ist nicht unbedingt die Änderung oder Zerstörung von Daten,
|
||||
sondern kann der Zugriff auf sensible Daten sein, z. B. Passwort-Hashes oder
|
||||
private Nachrichten. Dies ist besonders schlimm, wenn der Server Informationen wie E-Mails oder das Alter speichert, was manche zu Überprüfungszwecken tun.
|
||||
|
||||
## Formspecs
|
||||
|
||||
### Trauen Sie niemals Einsendungen
|
||||
|
||||
Jeder Benutzer kann jederzeit fast jeden Formspec mit beliebigen Werten eingeben.
|
||||
|
||||
Hier ist ein echter Code, der in einer Mod gefunden wurde:
|
||||
|
||||
```lua
|
||||
minetest.register_on_player_receive_fields(function(player,
|
||||
formname, fields)
|
||||
for key, field in pairs(fields) do
|
||||
local x,y,z = string.match(key,
|
||||
"goto_([%d-]+)_([%d-]+)_([%d-]+)")
|
||||
if x and y and z then
|
||||
player:set_pos({ x=tonumber(x), y=tonumber(y),
|
||||
z=tonumber(z) })
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
Können Sie das Problem erkennen? Ein böswilliger Benutzer könnte eine Formularvorgabe mit selbst bestimmten Positionswerten übermitteln, die es ihm ermöglichen, sich an jeden beliebigen Ort zu teleportieren.
|
||||
Dies könnte sogar automatisiert werden, indem man Änderungen am Client vornimmt, um im Wesentlichen den Befehl den Befehl `/teleport` zu replizieren, ohne dass ein Privileg erforderlich ist.
|
||||
|
||||
Die Lösung für diese Art von Problem ist die Verwendung einer
|
||||
[Context](../players/formspecs.html#contexts), wie zuvor im Kapitel Formspecs gezeigt.
|
||||
|
||||
### Der Zeitpunkt der Prüfung ist nicht der Zeitpunkt der Nutzung <a name=check-use"></a>
|
||||
|
||||
Jeder Benutzer kann jederzeit einen beliebigen Formspec mit beliebigen Werten übermitteln, außer wenn die Engine dies verbietet:
|
||||
|
||||
* Die Eingabe eines Knoten-formspec-Einsendungen wird blockiert, wenn der Benutzer zu weit entfernt ist.
|
||||
* Ab 5.0 werden benannte formspecs blockiert, wenn sie noch nicht angezeigt wurden.
|
||||
|
||||
Das bedeutet, dass Sie im Handler prüfen sollten, ob der Benutzer die Bedingungen erfüllt, um die Formspec überhaupt anzuzeigen, sowie alle entsprechenden Aktionen.
|
||||
|
||||
Die Schwachstelle, die dadurch entsteht, dass die Berechtigungen in der show formspec geprüft werden, aber nicht in der handle formspec verursacht wird, wird Time Of Check is not Time Of Use (TOCTOU) genannt.
|
||||
|
||||
|
||||
## (Unsichere) Umgebungen <a name="umgebungen"></a>
|
||||
|
||||
Minetest erlaubt es Mods, eine unsandboxed Umgebung anzufordern, die ihnen Zugang auf die gesamte Lua-API gibt.
|
||||
|
||||
Können Sie die Schwachstelle im Folgenden erkennen?
|
||||
|
||||
```lua
|
||||
local ie = minetest.request_insecure_environment()
|
||||
ie.os.execute(("path/to/prog %d"):format(3))
|
||||
```
|
||||
|
||||
`string.format` ist eine Funktion in der globalen gemeinsamen Tabelle `string`. Ein bösartiger Mod könnte diese Funktion überschreiben und Material an os.execute übergeben:
|
||||
|
||||
```lua
|
||||
string.format = function()
|
||||
return "xdg-open 'http://example.com'"
|
||||
end
|
||||
```
|
||||
|
||||
Der Mod könnte etwas viel Bösartigeres als das Öffnen einer Website weitergeben, wie z. B. einem entfernten Benutzer die Kontrolle über den Rechner zu geben.
|
||||
|
||||
Einige Regeln für die Verwendung einer unsicheren Umgebung:
|
||||
|
||||
* Speichern Sie sie immer in einem lokalen Verzeichnis und geben Sie sie nie in eine Funktion ein.
|
||||
* Stellen Sie sicher, dass Sie jeder Eingabe in eine unsichere Funktion vertrauen können, um das oben genannte Problem zu vermeiden. Dies bedeutet, dass global umdefinierbare Funktionen vermieden werden sollten.
|
@ -32,8 +32,9 @@ Folder = Verzeichnis
|
||||
form = Form
|
||||
forms = Forms
|
||||
formspec = formspec
|
||||
formspec slot = formspec-Slot
|
||||
formspec language version = formspec-Sprachversion
|
||||
formspec slot = formspec-Slot
|
||||
formspec submission = formspec-Einsendung
|
||||
games = Spiele
|
||||
getter = Getter
|
||||
glasslike = Glasartig
|
||||
@ -115,5 +116,6 @@ tile = Kachel
|
||||
tiles = Kacheln
|
||||
timer = timer
|
||||
true = wahr
|
||||
unsandboxed = unsandboxed
|
||||
wear = Abnutzung
|
||||
Your turn = Sie sind dran
|
||||
|
Loading…
x
Reference in New Issue
Block a user