Horst: (DBI)(CGI) Sql-Injektion vermeiden

Hallo,

dieser Tage hatte ich ein bischen Zeit, ein paar meiner Scripts sicherer zu machen, aus

SELECT ... WHERE feld like '%$unserinput%'

habe ich nun ein

SELECT ... WHERE feld like $like

wobei ich das $like wie folgt zusammenbaue:

my $like = $dbh->quote("%$userinput%");

Reicht das für die Sicherheit?

Viele Grüße,
Horst Haselhuhn

  1. Hi,

    wobei ich das $like wie folgt zusammenbaue:

    my $like = $dbh->quote("%$userinput%");

    Wird dabei nicht auch das '%' gequoted?

    Reicht das für die Sicherheit?

    Ich hatte mal ne ähnliche Frage hier im Forum gestellt.
    Dabei wurden mir Bind Values empfohlen.

    mfG,
    steckl

    1. Hallo,

      wobei ich das $like wie folgt zusammenbaue:

      my $like = $dbh->quote("%$userinput%");

      Wird dabei nicht auch das '%' gequoted?

      Für mich sichtbar macht $dbh->quote() das da:
      $userinput = 'wolle';
      my $like = $dbh->quote("%$userinput%");

      $like sieht so aus: '%wolle%'
      Syntax: SELECT ... like $like ... : tut

      Reicht das für die Sicherheit?

      Noch einmal nachgefragt: Was macht $dbh->quote() sonst noch so in Sachen Sicherheit?

      Ich hatte mal ne ähnliche Frage hier im Forum gestellt.
      Dabei wurden mir Bind Values empfohlen.

      Und hats was gebracht? Bitte mal ein Beispiel posten.

      Viele Grüße,
      Hotte

      1. Reicht das für die Sicherheit?
        Noch einmal nachgefragt: Was macht $dbh->quote() sonst noch so in Sachen Sicherheit?

        was soll es sonst so machen? Es "quotet" alle gefährlichen Zeichen.

        Ich hatte mal ne ähnliche Frage hier im Forum gestellt.
        Dabei wurden mir Bind Values empfohlen.

        Und hats was gebracht? Bitte mal ein Beispiel posten.

        binding ist sicher und schnell. quote nur sicher. Und Beispiele sollten in der Doku stehen.

        Struppi.

        1. Hallo,

          binding ist sicher und schnell. quote nur sicher.

          Ok, danke Struppi!

          Viele Grüße an Alle,
          Hotte

      2. Hi,

        my $like = $dbh->quote("%$userinput%");

        Wird dabei nicht auch das '%' gequoted?

        Für mich sichtbar macht $dbh->quote() das da:
        $userinput = 'wolle';
        my $like = $dbh->quote("%$userinput%");

        $like sieht so aus: '%wolle%'

        Sorry, ich war der Meinung, dass % auch als Sonderzeichen zählt, aber dann habe ich mich wohl getäuscht.

        mfG,
        steckl

  2. Moin Moin!

    prepare() bzw. prepare_cached() mit Platzhaltern (Bind-Variablen), bevorzugt die Variante mit Fragezeichen. Steht lang und breit in der DBI-Doku.

    Wenn die DB Platzhalter kann, beschleunigt das insbesondere prepare_cached() wahnsinnig. Quoting ist dann völlig unnötig, die Parmeter werden getrennt vom SQL-Statement an die DB übermittelt. Wenn die DB keine Platzhalter kann, kümmert sich DBI (genauer: das benutzte DBD-Modul) darum, dass die Platzhalter durch passend gequotete Werte ersetzt werden. Es ist mit dieser Methode also UNMÖGLICH, das Quoten zu vergessen. Mir ist auch keine Schwäche in dieser Richtung in irgendeinem DBD-Modul bekannt.

    Was % und _ in LIKE angeht: Dafür gibt es eine Syntax, um diese Zeichen zu maskieren, damit sie ihre spezielle Funktion verlieren. Das ist aber (ohne jetzt nachzusehen) DB-spezifisch, typischerweise läuft das über ... LIKE '% mit 50% Aufschlag %' ESCAPING '' ... oder so ähnlich -- siehe DB-Handbuch.

    Taint Mode einzuschalten schadet auch nicht (perl -T), und alle, wirklich alle Eingaben vom Benutzer validieren. Dabei erst alles verbieten und dann gezielt erlauben. (Also nicht in "verbotenen Zeichen" denken, sondern in "erlaubten Zeichen"). Typischerweise macht man das mit Regular Expressions, oder z.B. über Data::FormValidator.

    Aufrufe externer Programme nach Möglichkeit vermeiden -- dazu gehört auch und insbesondere sendmail. grep, sed, awk und ähnliche können vollständig durch Perl-Funktionen ersetzt werden.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Data::FormValidator.

      Endgeil! Danke für den Tipp nebenbei, sowas habe ich schon lange gesucht (CPAN, unendliche Weiten).

      Siechfred

      --
      Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
      1. Moin Moin!

        Data::FormValidator.

        Endgeil! Danke für den Tipp nebenbei, sowas habe ich schon lange gesucht (CPAN, unendliche Weiten).

        Dafür gibt's auch noch ein paar nette Wrapper für CGI::Application, Catalyst und Co.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Dafür gibt's auch noch ein paar nette Wrapper für CGI::Application, Catalyst und Co.

          Hehe, ich erkläre hiermit den Donnerstag zum CPAN-Day, denn neben Deinem Hinweis bin in einem anderen Forum beim Mitlesen über das genauso geile SQL::Abstract gestolpert (das wäre auch was für den OP).

          Siechfred

          --
          Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
          1. Moin Moin!

            Hehe, ich erkläre hiermit den Donnerstag zum CPAN-Day, denn neben Deinem Hinweis bin in einem anderen Forum beim Mitlesen über das genauso geile SQL::Abstract gestolpert (das wäre auch was für den OP).

            Mach's wie ich und setz Dir http://search.cpan.org/recent auf die Liste der täglich besuchten Webseiten. Und zu Weihnachten solltest Du im Perl Adventkalender herumstöbern, da gibt es auch immer wieder echte Perlen. Bis es soweit ist, gibt's ein Archiv.

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        2. Hi Alexander

          Dafür gibt's auch noch ein paar nette Wrapper für CGI::Application, Catalyst und Co.

          hast du mal praktische Erfahrung mit Catalyst gesammelt?

          Grüße
           Kurt