WinFuture-Forum.de: SQL Injection - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

SQL Injection Wie löst ihr das?


#1 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 27. September 2011 - 07:25

Huhu Com,

ich wollt mich mal bei euch erkundigen, wie ihr das altbekannte SQL Injection-Problem löst.
Ich persönlich bevorzuge PDO (Seit php 5.? automatisch aktiviert).

$user = "Dein Username";
$pass = "Dein Passwort";

$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);

if(!$pdo)
    die("Keine Verbindung!");

$db = $pdo->prepare("SELECT * FROM users WHERE loginname = :name;");
$db->bindValue(':name',"irgendwas");
$db->execute();
$fetch = $db->fetch(); // mysql_fetch_array : $fetch[‘var’];



Die If kannst du natürlich auch durch ein Try - Catch ersetzen und dann eine PDOException werfen.

Wie löst ihr denn das Problem? Regex? Explizit auf Zahlen prüfen? ";" im String suchen und entfernen?

Dieser Beitrag wurde von CryztaN bearbeitet: 27. September 2011 - 07:30

MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
1

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 27. September 2011 - 07:59

Du machst es schon vollkommen richtig, Prepared Statements sind die Lösung gegen SQL Injections. Mehr musst du auch nicht machen.
0

#3 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 27. September 2011 - 08:02

Das ich es mit PDO erfolgreich verhindern kann, weiß ich auch :).
Wollte eigentlich euch fragen, wie ihr SQL-Injection vermeidet - Jeder machts anders.
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 27. September 2011 - 09:10

Nicht PDO. Stichpunkt sind wie gesagt, Prepared Statements! PDO ist lediglich eine Abstraktionsebene für einen Datenbankzugriff. Prepared Statements muss im Endeffekt das DBMS, wie MySQL unterstützen.

Und bei Prepared Statements musst du auch nichts mehr vorher filtern, das Konzept dahinter übernimmt das quasi alles für dich. Daher ist die Aussage "Jeder machts anders" so nicht korrekt, da sie nun mal _das Mittel_ gegen SQL Injections sind. Du darfst es allerdings nicht mit XSS verwechseln, bei XSS musst du tatsächlich Eingaben selbst filtern.
1

#5 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 27. September 2011 - 09:13

Ja, genau! Ich benutze z.B. die Prepared Statements mit mysqli.

Prepared Statements haben übrigens noch einen Vorteil: Man kann das selbe Query relativ schnell mehrfach mit unterschiedlichen Werte ausführen.

MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#6 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 27. September 2011 - 09:17

Ich hab zwar verstanden, was du mit deinem letzterem Satz andeuten willst, aber könntest du mir fix ein Beispiel posten?

$db = $pdo->prepare("SELECT * FROM users WHERE loginname = :name;");
$db->bindValue(':name',"irgendwas");
$db->execute();

$db->bindValue(':name',"irgendwas anderes");
$db->execute();



So?
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#7 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 27. September 2011 - 09:26

Ich kenne mich zwar nicht genau mit PDO aus, aber ich denke, das sieht gut aus.

MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#8 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 27. September 2011 - 09:30

Ich danke euch.
intval() und mysql_real_escape_string() somit überflüssig ja?
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#9 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 27. September 2011 - 09:47

Solange du beim Preparen keine Variablen für die Tabellennamen, etc. verwendest (was du sowieso nicht tun solltest), sollte das im Prinzip überflüssig sein, ja.
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#10 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 27. September 2011 - 09:51

Ich danke euch ;)
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#11 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 28. September 2011 - 20:31

Gibts da irgendwo eine Erklärung für, also wo man einen direkten Vergleich hat, mit ner Abfrage von früher und wo man da dieses prepare reinschreiben muß mit diesem komischen Pfeil?
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#12 Mitglied ist offline   FenKeN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 220
  • Beigetreten: 22. September 11
  • Reputation: 8
  • Geschlecht:Männlich
  • Wohnort:Erding
  • Interessen:Php, C#, Programmierung

geschrieben 29. September 2011 - 07:09

Alt würde das wie folgt aussehen:
$con = mysql_connection("localhost",$user,$pass);
if(!$con)
   die("Keine Verbindung");

mysql_select_db("test");

$name=$_GET['name'];
$query = "SELECT * FROM users WHERE loginname=$name";
$sql = mysql_query($query);
$fetch = mysql_fetch_array($sql);


Wobei hier eben SQL Injection null verhindert wird. Da du für $name in der URL auch folgendes eingeben könntest:
'; DROP DATABASE test; --

mit '; <-- Machst du die erste Abfrage zu. Anschließend führst du DROP DATABASE test; aus und mit -- kommentierst du alles darauffolgende aus.
Somit wäre deine Datenbank futsch und der SQL Injector freut sich nen Ast.

Ich hoffe ich konnte dir helfen :)

Mit
$user = "Dein Username";
$pass = "Dein Passwort";

$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);

if(!$pdo)
    die("Keine Verbindung!");

$db = $pdo->prepare("SELECT * FROM users WHERE loginname = :name;");  //:name wird darunter deklrariert;
$db->bindValue(':name',"irgendwas"); //:name mit "irgendwas" füllen
$db->execute(); // Ausführen -> mysql_query($query);
$fetch = $db->fetch(); // mysql_fetch_array --> $fetch[‘var’];



Mit Prepared Statements verhindest du die oben gezeigte SQL Injection.

lg
MVC Tutorial
<?php
	echo "Liebe Grüße FenKeN";
?>
0

#13 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 29. September 2011 - 13:03

Und sonst lassen sich mit mysqli Prepared-Statements durchführen: http://php.net/manua...qli.prepare.php
Oder sogar direkt in SQL: http://dev.mysql.com...statements.html
0

#14 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

geschrieben 01. Oktober 2011 - 13:25

Aber so richtig funktioniert das mit den Platzhaltern auch nicht. Ich wollte jetzt in



UPDATE tabelle SET $variable = :zeit




$variable durch einen Platzhalter ersetzen, aber das geht irgendwie nicht.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#15 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 01. Oktober 2011 - 13:54

:zeit ist das Platzhalter. :) Der Platzhalter ist der Wert für eine zu setzende Variable.
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0