• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Wie sicher ist es?

SimoNxD

Mitglied
Hallo Leute,

da ich zwar mit PHP arbeiten kann, allerdings oftmals bedenken habe wie sicher manche Sachen bzw. wie unsicher manche Sachen sind hier mal ein paar Fragen:

$_SESSION:

Ich speicher beim loggin viel mit $_SESSION['blabla'];
z.B. die Email des Nutzers, und evtl. auch ob er admin ist oder nicht.

Wenn er natürlich Admin ist, hat er Zugriff auf das Adminpanel und könnte somit alles an der Seite umstellen.

Wie sicher ist $_SESSION? Kann ein User diese "Faken" bzw. in die Session andere Sachen speichern?
Wenn ja, wie schafft er dies? Bzw. wie kann ich mich davor sichern?


$_POST:

Da ich gerade bei <form methode="post"> damit arbeite und damit auch die Sachen in die Datenbank speicher, ist dies auch eine Lücke.
Was ist wenn ein User mysql abfragen in die <input> Felder schreibt? Bzw. was könnte er in diese schreiben, die meine Seite, meinen Server oder meiner Datenbank schaden?


$_GET:

Bei $_GET bin ich mir eig. am unsichersten.
Da ich meist bei einem Link damit arbeite und der Nutzer somit daten aus der Datenbank lesen könnte (sofern er den Link ändert) die er garnicht lesen sollte? Oder sehe ich das Falsch.

Auch hier die Frage: Was können Benutzer mit $_GET anstellen was mir schadet?

Hoffe auf Hilfreiche antworten :).

MfG
 
Grundsätzlich sind sowohl $_SESSION, $_POST als auch $_GET absolut sicher. Die Frage ist nur was dein Script damit anstellst.
Als Faustregel gilt: Traue keinen Nutzereingaben.

Wenn du Nutzereingaben direkt als SQL-Query weiterverarbeitest ist es natürlich einfach Schadcode einzuschleusen. Benutzereingaben müssen daher vor der Verwendung in einer MySQL-Query "maskiert" werden. Dies kann zB so gemacht werden: http://de.wikipedia.org/wiki/Prepared_Statement

Damit ist technisch schon alles abgesichert. Sonstige, logische Lücken in deinem Script können wir natürlich nicht erahnen.

Wer sich halbwegs auskennt, kann die $_POST Daten genau gleich mitlesen/ändern wie die $_GET Daten auch. Dies macht also keinen Unterschied bezüglich Sicherheit.
 
$_POST und $_GET immer zusammen mit nem int cast
PHP:
$iId = (int)$_GET['id'];
oder htmlspecialchars
PHP:
$sText = htmlspecialchars($_POST['text'], ENT_QUOTES);
verwenden, es sei denn du weißt es in speziellen fällen besser.

Sachen die in $_SESSION stehen kann man größtenteils vertrauen, da du selber darauf achtest, dass du nichts unsicheres da rein schreibst.

Und allgemein gillt das bei $_GET, $_POST, $_COOKIE, $_SESSION und so weiter immer vorher mit isset prüfst ob es die variablen auch gibt.
PHP:
if (!isset($_GET['id'])) {
    return false; // oder etwas ähnliches das dem User sagt das etwas schiefgelaufen ist, und so weiter...
}

Wenn du PHP 5 benutzt solltest du dir auch dieses hier einmal angucken.
http://de3.php.net/filter
http://de3.php.net/manual/de/function.filter-input.php

lg
 
Also ich hab jetzt mal eine "SQL Injektion" versucht.
Ohne Erfolg, was an sich ja ein gutes Zeichen ist.

Hier mal mein Script und was ich versucht habe:

HTML:
<form action="?s=rund_write" method="post">
            <tr>
                <td><input class="input_none" name="gm_name" value="<?=$_SESSION['user_char']?>"></td>
                <td class="input_none"><?=$datum_jetzt;?> </td>
                <td><textarea style="width:100%; " name="mail_text"></textarea></td>
            </tr>
            <tr>
                <td colspan="3" align="center"><input type="submit" class="submit_panel" name="submit_mail_new" value="Rundmail Posten"/></td>
            </tr>
            </form>

Der sqlCmd

PHP:
if(isset($_POST['submit_mail_new'])) {
         $text = $_POST['mail_text'];
         $namegm = $_POST['gm_name'];
                $mailcmd = "INSERT INTO tools.mail (name_gm,text) VALUES ('".$namegm."', '".$text."')";
                $mailqry = mysqli_query($db_tool, $mailcmd);
            echo $mailcmd;
        }

$sqlCmd echo OHNE Sql Injektion:

PHP:
INSERT INTO tools.mail (name_gm,text) VALUES ('Name', 'Nachricht')

$sqlCmd echo SQL injektion:

PHP:
INSERT INTO tools.mail (name_gm,text) VALUES ('Name', 'Nachricht');INSERT into account.account (login,password,web_admin) values('userHack','daspasswort','9');--')

Allerdings wird mit der SQL injektion nichts in die Datenbank geschrieben.

Führe ich nun aber den Befehl in einer Normalen Query über das Datenbankprogramm aus, so fügt er die sachen ein, das beunruhigt mich ein wenig.

Hab ich die SQL injection jetzt falsch gemacht oder ist mein Script jetzt sicher?
 
name_gm ist ein hidden/readonly field? Das wäre dann unsicher, denn die Postwerte kann man (vor dem abschicken) ziemlich einfach verändern unds so unter fremdem Namen posten.
 
Also ich hab jetzt mal eine "SQL Injektion" versucht.
Ohne Erfolg, was an sich ja ein gutes Zeichen ist.

Hier mal mein Script und was ich versucht habe:

HTML:
<form action="?s=rund_write" method="post">
            <tr>
                <td><input class="input_none" name="gm_name" value="<?=$_SESSION['user_char']?>"></td>
                <td class="input_none"><?=$datum_jetzt;?> </td>
                <td><textarea style="width:100%; " name="mail_text"></textarea></td>
            </tr>
            <tr>
                <td colspan="3" align="center"><input type="submit" class="submit_panel" name="submit_mail_new" value="Rundmail Posten"/></td>
            </tr>
            </form>

Der sqlCmd

PHP:
if(isset($_POST['submit_mail_new'])) {
         $text = $_POST['mail_text'];
         $namegm = $_POST['gm_name'];
                $mailcmd = "INSERT INTO tools.mail (name_gm,text) VALUES ('".$namegm."', '".$text."')";
                $mailqry = mysqli_query($db_tool, $mailcmd);
            echo $mailcmd;
        }

$sqlCmd echo OHNE Sql Injektion:

PHP:
INSERT INTO tools.mail (name_gm,text) VALUES ('Name', 'Nachricht')

$sqlCmd echo SQL injektion:

PHP:
INSERT INTO tools.mail (name_gm,text) VALUES ('Name', 'Nachricht');INSERT into account.account (login,password,web_admin) values('userHack','daspasswort','9');--')

Allerdings wird mit der SQL injektion nichts in die Datenbank geschrieben.

Führe ich nun aber den Befehl in einer Normalen Query über das Datenbankprogramm aus, so fügt er die sachen ein, das beunruhigt mich ein wenig.

Hab ich die SQL injection jetzt falsch gemacht oder ist mein Script jetzt sicher?

mysqli_query unterstützt nur 1 query, daher wird auch nur die erste ausgeführt.
Bis auf die von @thecain erwähnte Schwachstelle sehe ich hier aktuell kein Problem.

Die SQL-Injection ist eher in SELECTs und UPDATEs gefährlich:
Passwortabfrage umgehen: SELECT id FROM user WHERE username = 'Benutzername' AND password = 'passwort' OR 1=1 OR username = '' LIMIT 1
Benutzer zum Admin machen: UPDATE user SET username = 'Benutzername', email = 'email', admin = 1, email = 'email' WHERE id = 1 LIMIT 1

Bei Verwendung von mysqli_multi_query ist natürlich auch deine Injection gefährlich.
 
Zuletzt bearbeitet:
Passwortabfrage umgehen: SELECT id FROM user WHERE username = 'Benutzername' AND password = 'passwort' OR 1=1 OR username = '' LIMIT 1

Urghh...
Kann man mein Passwort auch umgehen?
Soweit ich weiß nicht:

PHP:
  $sqlCmd = "SELECT id,login,coins,web_admin,email
                              FROM account.account
                              WHERE login
                              LIKE '".mysqli_real_escape_string($db_tool, $_POST['userid'])."'
                              AND password=PASSWORD('".mysqli_real_escape_string($db_tool, $_POST['userpass'])."')
                              LIMIT 1";
 
Nein, du nimmst ja mysqli_real_escape_string. Dadurch wird aus:
Passwortabfrage umgehen: SELECT id FROM user WHERE username = 'Benutzername' AND password = 'passwort' OR 1=1 OR username = '' LIMIT 1
folgendes:
Passwortabfrage umgehen: SELECT id FROM user WHERE username = 'Benutzername' AND password = 'passwort\' OR 1=1 OR username = \'' LIMIT 1
 
Zurück
Oben