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

Vor SQL Injection und XSS schützen

Luk.Online

Neues Mitglied
Hi,
der Name des Themas sagt ja schon alles...
Wie schütze ich meine Website vor solchen Angriffen?
Habe mal bei google geschaut und mysql_real_escape_string gefunden...
Wie muss das dann aussehen?
So?
Code:
$user = $_POST["user"];
$user = mysql_real_escape_string($user);

wäre das so in ordnung?
ich werd aus den ganzen tuts nicht so wirklich schlau.

Wer kann mir das mal erklären?

Vielen Dank schonmal!!!


MfG, Luk
 
also bei SQL Injektion geht es darum das ein Angreifer Code in deinen Code einfuegt.
dies passiert eben bei SQL statements z.b.

Code:
$sql = 'SELECT * FROM user WHERE name='.$_POST['user'].'';

wenn der angreifer nun bei der angabe fuer einen Username falsche angaben macht und es ihm gelingt seinen code einzuschleusen, kann es gefaehrlich werden.
daswegen benutzt man die klasse MySQLi und ein paar funktionen:

Code:
          $sql = 'SELECT 
                        Username
                   FROM
                       user
                   WHERE
                        SessionID = ?';
            $mysqli_stmt->prepare($sql);
            $mysqli_stmt->bind_param('s', $SessionID);
            $mysqli_stmt->execute();
bei diesem codebeispiel steht kein php-code im sql statement und damit ist es nicht so leicht fremden code einzuschleusen.
 
hätte das
Code:
$sql = 'SELECT * FROM user WHERE name='.$_POST['user'].'';
den selben effekt wie
Code:
$user = $_POST['user'];
$sql = 'SELECT * FROM user WHERE name='.$user.'';
oder we soll man das verstehen?


EDIT:
oder ganz konkret.
was passt jetzt an meinem statement nicht?
er trägt nichts ein!?!
Code:
mysql_query("INSERT INTO gbook (AUTOR, BETREFF, TEXT, IP, TIMESTAMP, AKTIV) VALUES (.mysql_real_escape_string('$Autor')., mysql_real_escape_string('$Betreff')., mysql_real_escape_string('$Text')., '$IP', '$Time', '1')");
 
Zuletzt bearbeitet:
Hey!
Danke erstmal!

@Asipak4You: ich teste es heute abend mal.
@Mad Dog: super. ich les es mir mal durch :)


bis dann!
 
100% sicher wird es niemals sein.
aber mir ist jetzt nichts aufgefallen, ausser das dir eine sache fehlt.

und zwar was ist wenn jemand auf deine seite ghet, der kein JS aktiviert hat? ich konnt z.b. keinen eintrag schreiben.
 
ja, das ist mir auch erst vor kurzem aufgefallen....
kann man diesen aufklapp effekt auch anders erzielen? ajax vllt?

hab gleich mal noch ne frage. welchen webspace host würdet ihr empfehlen?
habe funpic und kilu ausgecheckt...
-funpic minuspunkt: kein mysqli
-kilu minuspunkt: kein mail()

wo gibts beides? (kostenlos)
 
AJAX ist Javascript oder bzw ohne JavaScript gibts kein AJAX.
AJAX bedeuten asynchron JavaScript and XML :D
anders erzeilen kann man ihn nicht. man kann es mit php machen, keine frage, nur dann wird die seite neugeladen, was bei javascript nicht gemacht wird.

hmmm ich benutzte momentan kilu. benutzte momentan kein mail() von daher habe ich damit keine probleme :D
naja das funpic kein mysqli hat ist sehr aergerlich aber man kanns ja auch ohne machen :D

wo es beides gibt und kostenlos ist keine ahnung
 
Ich glaube es wird nie einen Freehoster geben der mail(); zulässt. Sonnst würde jeder E-Mail Spammer das nutzen für seine blauen und gelben Pillchen.
doch... kilu.de

mal ne andere frage:

PHP:
    $CounterLockSQL = "SELECT * FROM counterip WHERE IP='$IP'";
    // Statement vorbereiten
    $CounterLockQuery = $DB->prepare($CounterLockSQL);
    // an die DB schicken
    $CounterLockQuery->execute();
    // Ergebnis an Variablen binden
    $CounterLockQuery->bind_result($TimeDB, $IPDB);

    while($CounterLockQuery->fetch())
    {

    }

das bind result brauche ich eigentlich garnicht...
ich will noch ->num_rows.
wiembekomme ich das? habe erst mit OOP angefangen... deswegen. beim prozeduralen wüsste ichs.....
 
wenn wir in diesem thema schon von SQL-Injektion reden solltest du noch was aendern:
Code:
[COLOR=#000000][COLOR=#0000bb]$CounterLockSQL [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#dd0000]"SELECT * FROM counterip WHERE IP=?"[/COLOR][COLOR=#007700];[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#0000bb]$CounterLockQuery [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]$DB[/COLOR][COLOR=#007700]->[/COLOR][COLOR=#0000bb]bind_param[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]'i',$IP[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
 
ach ja stimmt. beim prepare fragt man ja nur nach ? :oops:

was bedeuted das i bei bind_param('i',$IP)

habe eine möglichkeit gefunden.

PHP:
      $DSZaehler = 0;
    while($CounterLockQuery->fetch())
    {
      $DSZahler++;
    }
ist das korrekt? funktionieren tuts
 
Wenn du immer alles schön codierst sollte eigentlich nichts mehr passieren :D Natürlich nur dann etw. codieren wenn du z.B. eine $_GET-Variable wieder ausgibst oder in die DB schreibst ...
 
Wenn du immer alles schön codierst sollte eigentlich nichts mehr passieren :D Natürlich nur dann etw. codieren wenn du z.B. eine $_GET-Variable wieder ausgibst oder in die DB schreibst ...

wie meinst du das :D

mal ne andere frage:
brauche ich bei der variante mysqli_real_escape_string bzw dieses magic_quotes_gpc()? was macht das überhaupt?

PHP:
    $CounterLockSQL = "SELECT * FROM counterip WHERE IP='$IP'";
    // Statement vorbereiten
    $CounterLockQuery = $DB->prepare($CounterLockSQL);
    // an die DB schicken
    $CounterLockQuery->execute();
    // Ergebnis an Variablen binden
    $CounterLockQuery->bind_result($TimeDB, $IPDB);

    while($CounterLockQuery->fetch())
    {

    }

Sicherheitsmäßg siehts eigentlich bei mir so aus:

- PHP Formularprüfung vor DB schreiben
-Spamschutz: IP in DB schreiben und nach 30 min löschen, dann gehts wieder
-Floodschutz: max 10 einträge / 30min (auch mit DB)
-INSERT-Vorgang: strip_tags von POST Vars -> INSERT u.A. SQL wie oben OOP mit prepared statements
-auslesen aus DB: htmlentities()
-und ein CAPTCHA kommt noch rein... schaut mal bitte ob der sicher ist ^^
Captcha

Fällt jemand nochwas ein? Soll ich was hinzufügen oder ändern?
 
Zurück
Oben