Hilfe bei beheben von SQL Injection

  • Guten Tag,


    Hier vorab der Code um den es sich handelt: https://pastebin.com/5i958sTm

    Ich habe ein sehr großes Problem bei diesem Code mit den Sicherheitslücken.


    Wie komme ich darauf?


    Ich habe mein Code vorsichtshalber mal mit einem Online Tool prüfen lassen, dabei kam heraus, dass ein hohes Risiko für SQL Injections besteht. Kann mir jemand helfen bei meinem Problem?

    Ich danke im vorraus:)

  • Mal nee andere Frage, ist der Code so in der benutzung ?

    Du ballerst da paar mal die gleiche abfragen rein , mischt alles mit prepare statements und mal wieder ohne.

    Wenn ich das richtig sehe kann man da bestimmt die hälte rauswerfen.


    Das benutzt du 2 mal

    Code
    1. if (isset($_GET['id'])) {

    da reicht auch 1 mal.

    Was soll das

    Ich verstehe nicht was das soll ? Ich sehe auch nicht weiter unten im Code das du die Variabeln $statement ,$statement2 benutzt.

    Variable $row schon aber die werden durch deinen erneuten Abfragen ja wieder überschrieben.


    Aber vieleicht habe ich was übersehen.Warten wir mal ab was die anderen noch so sagen

  • Sehe das wie Basti1012


    Nutz konsequent PDO und parametisiere diese!

    Benutzt du

    PHP
    1. setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


    Dadurch wird sichergestellt, dass die Anweisung und die Werte nicht von PHP analysiert werden, bevor sie an den MySQL-Server gesendet werden (sodass ein möglicher Angreifer keine Chance hat, schädliches SQL einzuschleusen).


    Muss es unbedingt $_GET['id'] sein?

    ich könnte z.B. eine Seite mit folgendem Code aufrufen


    PHP
    1. seite.php?id=-1 UNION SELECT email, vorname, passwort AS nachname FROM user

    Daraus wird dann (wenn du es nicht entsprechend vorher abfängst).

    SQL
    1. SELECT * FROM con WHERE id =-1 UNION SELECT email, vorname, passwort AS nachname FROM user

    NAtürlich könnte ich einfach ein paar IDs ausprobieren, bis ich z.B. die ID eines Admins habe.


    Das sind nur die Sachen, die ich auf die schnelle sehe.

  • Hallo,


    Natürlich ist das nicht der ganze Code aber ich kann dir diesen ja mal schicken.

  • Das kannst du machen, aber wenn der genau so ist wie der da oben hat das kein sinn.

    Versuche erstmal die Fehler zu beheben die hier gesagt wurden und dann sehen wir weiter.


    Wie lang ist der Code ?

    Wenn er nicht zu lang ist kannst du ihn hier posten.

    Notfalls schick ihn mir dann kann man mal kucken ob es überhaupt ein sinn macht den zu reparieren oder gleich neu zu schreiben.

    Ich glaube ehr das Punkt 2 in Frage kommt.

  • Endrick93 du hättest mindestens was dazu schreiben sollen oder schon mal anfangen können den Code zu bearbeiten.
    Ich hatte ihn auch gesagt das man da einiges reduzieren kann.
    Außerdem hatte ich gesagt das er sich für ein entscheiden soll und nicht alles durcheinander coden soll.

    Zum Schluss hatte ich ihn gesagt er soll den Code hier posten, weil ich zum Thema Sicherheit nix mehr sagen möchte, weil die letzten Diskussion ob man mysqli_real_escape_string nutzen soll oder nicht mich verunsichert hat (Ich nutze es aber weiter)

  • Wenn du diesen Quellcode mal aufräumst und den teilweise sinnlosen Quellcode entfernst und dann noch ordentlich einrückst, dann sieht sich das vielleicht auch mal jemand an.

    So ich habe den Code nochmals bereinigt ich hoffe, dass man ihn so besser lesen kann. Außerdem habe ich noch dazugeschrieben was für welche funktion zuständig ist. Ich weiß da ist noch luft nach oben aber ich versuche mir immer mehr erfahrung beizubringen.

    Hier der neue Code: https://pastebin.com/VkwyFCc9

  • Es wäre toll, wenn du deine alten Beiträge nicht änderst bzw. löscht.
    Hätte gerne nochmal den vorliegen Code mit den neuen verglichen.
    Der kommt mir immer noch zu voll vor.
    Die Hinweiße die im #2, und #3 gegeben wurde hast du auch noch nicht geändert.
    Erkläre mal bitte das.

    Code
    1. require('connection/db1.php');
    2. include 'connection/sql1.php';
    3. include("connection.php");
    4. include("connection.php");
    5. include("connection.php");

    5 mal connect zur Datenbank eingebunden von 3 verschiedene Dateien ?

    Ich kein Profi, aber irgendwie kann das nicht okay sein.bin

  • Was erhoffst du dir von

    Code
    1. $statement = $bdd->prepare("SELECT * FROM con WHERE id = :id");
    2. $statement->execute(array(":id" => $_GET["id"]));
    3. while($row = $statement->fetch()) {
    4. }
    5. // Wird benötigt um Teilnehmer in der Liste anzuzeigen (funktioniert jedoch noch nicht ganz)
    6. $statement2 = $bdd->prepare("SELECT * FROM convoy_part WHERE user_convoy = :convoy");
    7. $statement2->execute(array(":convoy" => $_GET["id"]));
    8. while($row = $statement2->fetch()) {
    9. }
  • Es wäre toll, wenn du deine alten Beiträge nicht änderst bzw. löscht.
    Hätte gerne nochmal den vorliegen Code mit den neuen verglichen.
    Der kommt mir immer noch zu voll vor.
    Die Hinweiße die im #2, und #3 gegeben wurde hast du auch noch nicht geändert.
    Erkläre mal bitte das.

    Code
    1. require('connection/db1.php');
    2. include 'connection/sql1.php';
    3. include("connection.php");
    4. include("connection.php");
    5. include("connection.php");

    5 mal connect zur Datenbank eingebunden von 3 verschiedene Dateien ?

    Ich kein Profi, aber irgendwie kann das nicht okay sein.bin

    https://hastebin.com/roxukadoye.xml


    Was erhoffst du dir von

    Code
    1. $statement = $bdd->prepare("SELECT * FROM con WHERE id = :id");
    2. $statement->execute(array(":id" => $_GET["id"]));
    3. while($row = $statement->fetch()) {
    4. }
    5. // Wird benötigt um Teilnehmer in der Liste anzuzeigen (funktioniert jedoch noch nicht ganz)
    6. $statement2 = $bdd->prepare("SELECT * FROM convoy_part WHERE user_convoy = :convoy");
    7. $statement2->execute(array(":convoy" => $_GET["id"]));
    8. while($row = $statement2->fetch()) {
    9. }

    Was meinst du genau?

    Falls du diesen Code meinst:

    Code
    1. $statement = $bdd->prepare("SELECT * FROM con WHERE id = :id");
    2. $statement->execute(array(":id" => $_GET["id"])); while($row = $statement->fetch()) { }

    Diesen habe ich gerade entfernt

  • Diesen habe ich gerade entfernt

    Und wieso sehe ich das immer noch:

  • Code
    1. $statement = $bdd->prepare("SELECT * FROM con WHERE id = :id");
    2. $statement->execute(array(":id" => $_GET["id"]));
    3. while($row = $statement->fetch()) {
    4. }

    Das habe ich bereits entfernt. Das ist nur im hastebin nicht geändert

    Code
    1. $statement2 = $bdd->prepare("SELECT * FROM convoy_part WHERE user_convoy = :convoy");
    2. $statement2->execute(array(":convoy" => $_GET["id"]));
    3. while($row2 = $statement2->fetch()) {
    4. }

    Das möchte ich für die Teilnehmerliste nutzen, jedoch funktioniert das ganze noch nicht ganz

  • *Zu der Liste.


    Ich habe noch eine alte version mit der die Liste funktioniert, dennoch habe ich die befüchtung das darin auch ein SQL Injection Fehler ist