Quote:
Originally Posted by IzeBreakzz
Also hat die Injection auch was mit der Homepage zu tun... Wie kann ich dagegen am besten vorgehen?
|
Überall, wo eine Query mit Variablen ausgeführt wird, die vom User veränderbar sind bzw. der User Einfluss auf die Query hat. Also z.B. bei der Erstellung einer Gilde, erstellen eines Charakters, ...
Wie bereits gesagt: Alle Eingaben Escapen, Prepared Statements.
Ausserdem die Rechte des DB-Users ordentlich einstellen und wenn möglich Stored Procedures etc. nutzen.
EDIT:
Aus einer PN mit @
[Only registered and activated users can see links. Click Here To Register...], vielleicht auch für andere Interessant:
Quote:
|
Originally Posted by Seחsi
Nur die Rechte vergeben, die der User auch benötigt.
Ein Homepage-User braucht normalerweise folgende Rechte:
- Select, Update, Insert auf Account-Tabelle (Registration, Benutzerverwaltung, Itemshop-Coins)
- Select auf Player-Tabelle (Rangliste)
- Select auf Itemshop-Tabelle
und eigentlich braucht der User auch garkeine direkten Berechtigungen auf die Tabellen. Du kannst z.B. für die Erstellung eines Accounts eine Prozedur schreiben und dem User dann nur Rechte für den Zugriff auf diese Prozedur geben anstatt auf einen Insert in die Account-Tabelle.
Beispiel einer solchen Prozedur:
Code:
USE account;
delimiter //
CREATE FUNCTION createAccount(v_Login VARCHAR(16), v_Password VARCHAR(16), v_Email VARCHAR(50), v_Deletecode VARCHAR(7))
RETURNS BOOLEAN
BEGIN
DECLARE loginAlreadyExists BOOLEAN;
IF v_Login IS NULL
OR v_Password IS NULL
OR v_Email IS NULL
OR v_Deletecode IS NULL
THEN
RETURN FALSE;
END IF;
SET loginAlreadyExists = (SELECT count(*) >= 1 FROM account.account WHERE login = v_Login);
IF loginAlreadyExists THEN
RETURN FALSE;
END IF;
INSERT INTO account.account (login, password, email, social_id) VALUES (v_Login, PASSWORD(v_Password), v_Email, v_Deletecode);
RETURN TRUE;
END;//
delimiter ;
In PHP würde das mit einem Prepared Statement dann so aussehen:
Code:
$conn = /* your db connection (mysqli) */
$stmt = $conn->prepare("SELECT account.createAccount(?, ?, ?, ?);");
$stmt->bind_param("ssss", $_POST["username"], $_POST["password"], $_POST["email"], $_POST["deletecode"]);
$stmt->execute();
|