Frage

In einem Kommentar zu einer früheren Frage, sagte jemand, dass die folgende SQL-Anweisung mir öffnet sich zu SQL-Injection-up:

select
    ss.*,
    se.name as engine,
    ss.last_run_at + interval ss.refresh_frequency day as next_run_at,
    se.logo_name    
from 
    searches ss join search_engines se on ss.engine_id = se.id
where
    ss.user_id='.$user_id.'
group by ss.id
order by ss.project_id, ss.domain, ss.keywords

Unter der Annahme, dass die $userid Variable richtig übersetzt wird, wie dies mich verletzlich macht, und was kann ich tun, um es zu beheben?

War es hilfreich?

Lösung

Unter der Annahme, es richtig übersetzt wird, ist es nicht Sie verletzlich machen. Die Sache ist, dass richtig zu entkommen schwieriger ist, als es auf den ersten Blick aussieht, und Sie verurteilen sich richtig Sie tun, um eine Abfrage wie die jedes Mal zu entkommen. Wenn möglich, vermeiden Sie alle diese Probleme und verwenden vorbereitete Anweisungen (oder binded Parameter oder parametrisierte Abfragen). Die Idee ist, die Datenzugriffsbibliothek zu ermöglichen, Werte richtig zu entkommen.

Zum Beispiel in PHP, mit Mysqli :

$db_connection = new mysqli("localhost", "user", "pass", "db");
$statement = $db_connection->prepare("SELECT thing FROM stuff WHERE id = ?");
$statement->bind_param("i", $user_id); //$user_id is an integer which goes 
                                       //in place of ?
$statement->execute();

Andere Tipps

Jede SQL-Schnittstelle Bibliothek lohnt sich der Einsatz hat irgendeine Art von Unterstützung für die Bindung Parameter. Versuchen Sie nicht, klug zu sein, nur um es zu verwenden.

Sie wirklich kann, wirklich denken / hoffen, dass Sie Sachen richtig übersetzt habe, aber es ist einfach nicht wert, die Zeit nicht.

Auch unterstützt mehrere Datenbanken vorbereitete Anweisung Caching, so dass es richtig tun können Sie auch Effizienzgewinne bringen.

Einfacher, sicherer, schneller.

Wenn es richtig übersetzt und validiert wird, dann haben Sie kein Problem.

Das Problem entsteht, wenn es nicht richtig übersetzt oder validiert. Dies wird durch schlampig Codierung oder ein Versehen auftreten könnte.

Das Problem ist nicht mit bestimmten Fällen aber mit dem Muster. Dieses Muster macht SQL-Injection möglich, während das andere Muster nicht zulässt.

Wenn $ user_id entkommen ist, dann sollten Sie nicht zu SQL Injection verwundbar sein.

In diesem Fall würde ich auch dafür sorgen, dass der $ user_id numerisch ist oder eine ganze Zahl (abhängig von der genauen Art erforderlich). Sie sollten die Daten zu den restriktivsten Typ immer beschränken Sie können.

Ich denke, ‚richtig übersetzt‘ ist hier das Stichwort. In Ihrer letzte Frage , mache ich die Annahme, dass der Code Kopie von Ihrer Produktion eingefügt wird Code, und da Sie Fragen zu drei Tabellen verbinden gefragt, ich mache auch die Annahme, dass Sie nicht die richtige Entkommen zu tun haben, daher meine Bemerkung über SQL-Injection-Attacke.

Um Ihre Frage zu beantworten, wie so viele Menschen hier beschrieben, IF die Variable ‚richtig übersetzt‘ wurde, dann haben Sie kein Problem. Aber warum Mühe, sich durch das zu tun? Da einige Leute haben darauf hingewiesen, manchmal richtig ist Escaping keine einfache Sache zu tun. Es gibt Muster und Bibliothek in PHP, die SQL-Injection unmöglich macht, warum wir nicht nur das? (Ich mache auch bewusst Annahme, dass Ihr Code in der Tat PHP ist). Vinko Vrsalovic beantworten können Sie Ideen geben auf wie dieses Problem zu nähern.

Diese Aussage als solche ist nicht wirklich ein Problem, seine „sicher“, aber ich weiß nicht, wie Sie diese (eine Ebene auf der API-Stack) tun. Wenn $ user_id in die Anweisung eingefügt zu werden String-Operationen mit (wie als ob Sie Php einlassen automatisch die Anweisung ausfüllen) dann sein gefährlich.

Wenn sein bei der Verwendung einer Bindung API immer gefüllt, dann bereit zu gehen.

Alle Antworten sind gut und recht, aber ich glaube, ich muß hinzufügen, dass das prepare / execute Paradigma ist nicht die nur Lösung, auch nicht. Sie sollte eine Datenbank-Abstraktionsschicht, anstatt direkt die Bibliotheksfunktionen und eine solche Schicht ist ein guter Ort, um explizit String-Parameter zu entkommen, ob Sie lassen prepare es tun, oder Sie es selbst tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top