• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Liste aus Mysql via PHP auslesen, anzeigen, sortieren

venom2k6

NGBler

Registriert
15 Juli 2013
Beiträge
107
Hallo zusammen. ich habe eine größere Liste diese hab cih in einer MySQL DB gepackt.

wenn cih mir die liste anzeigen lasse, kein problem. Wie sieht es neuerdings hier mit sortierung aus?
früher habe ich es mit Get Variablen gemacht. finde ich heute allerdings zu unsicher weil mir das nicht ganz koscher war wenn im adresslink z.b.

liste.php?abc=d&sort=desc


wie realisier ich das nach heutigen standard? wird das alles per session übergeben und die seite neugeladen?

wäre da für ein paar kniffs und tipps dankbar :)
 

electric.larry

\''; DROP TABLE user; --
Teammitglied

Registriert
13 Dez. 2014
Beiträge
4.549
Ort
Raum 43
Geht es dir hier um Sicherheit oder eher um die Optik?

Bin kein Security Experte, aber aus meiner Sicht ist egal ob du User Input über $_GET, $_POST oder $_SESSION holst, du musst ihn im verarbeitenden Script sowieso auf ungültige Eingaben prüfen und testen, ob der Benutzer korrekt angemeldet ist.

Bleibt der unschöne Link liste.php?abc=d&sort=desc. Den würde ich persönlich am ehesten mithilfe von Rewrite Rules in der Apache Config oder in deiner .htaccess Datei "kaschieren", z. B. so:

[src=bash]RewriteRule ^/liste/([a-z0-9\-]+)/([a-z0-9\-]+)/?$ /liste.php?abc=$1&sort=$2 [NC,L][/src]

Dann könntest du anstelle von

deinhost.xy/liste.php?abc=d&sort=desc

soetwas wie

deinhost.xy/liste/d/desc

verwenden.
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.823
Ort
Midgard
Was ich in der Testumgebung erstmal weglassen würde, weils offensichtlich einige Sachen einfach versteckt.
 

venom2k6

NGBler

Registriert
15 Juli 2013
Beiträge
107
  • Thread Starter Thread Starter
  • #5
mir geht es hierbei schon um sicherheit und optik

ist es eigentlich möglich eine SQL injection zu bekommen, indem man bei einem MySQL SELECT (nicht UPDATE oder INSERT) die WHERE-Bedingung von abc=d in abc=Injectioncode(); ändert? oder besteht die gefahr nur bei Insert und Update querys?

wenns beim abfragen kein Risiko einer Injection besteht wäre mir der verlängerte Get Link in der adresse recht wumpe. wäre halt nur nice to have wenn es "Unsichtbar" wäre
 

electric.larry

\''; DROP TABLE user; --
Teammitglied

Registriert
13 Dez. 2014
Beiträge
4.549
Ort
Raum 43
Eine Injection lebt oft davon, dass die ursprüngliche Query beendet und hinten eine neue "böse" Query angehängt wird. Dadurch ist es vielfach egal ob ein SELECT oder UPDATE drin steht.

Aber nur weil die Parameter nicht über die URL übergeben (GET) werden, heisst ja nicht, dass die übergebenen Werte nicht manipuliert werden können. Ich kann genau so ungültige Werte als POST oder SESSION übergeben. Es macht für deine Sicherheit also kaum einen Unterschied.
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.823
Ort
Midgard
Man brauch den ursprünglichen nichtmal beenden. Man kann den neuen einfach reinschreiben. Da gibts so viele Möglichkeiten die kann ich hier gar nicht alle auflisten. Daher bleibe ich lieber bei der ursprünglichen Aussage.

Zu Userinput gibts eine einfache Regel:
Du hast keine Kontrolle darüber also musst du ihn nachträglich prüfen.

Jeder der was anderes behauptet lügt entweder bewusst oder hat keine Ahnung.
 

Shodan

runs on biochips

Registriert
14 Juli 2013
Beiträge
661
Ort
Citadel Station
Die Empfehlung Nutzereingaben niemals zu vertrauen ist gut und richtig, lässt viele aber anfangen in die falsche Richtung zu denken.

Escaping ist nicht bedingt, sondern kontextsensitiv. Das bedeutet, wenn du Variablen zum Beispiel in einen SQL Kontext einsetzt, dann nutze Escaping für den SQL Kontext. Dabei ist irrelevant, ob in der Variable nun ein Wert steht, auf den der Benutzer direkt Einfluss hat, oder nicht. Du schreibst Daten aus PHP in den Javascript-Kontext, escape sie für den JavaScript Kontext. Escape Daten nicht für den SQL-Kontext wenn du sie in JavaScript schreibst und escape sie nicht für den HTML-Attribut Kontext, wenn du sie in SQL schreibst. Es ist eigentlich nicht schwer zu verstehen, aber insbesondere Anfänger neigen dazu entweder zu wenig oder viel zu escapen (insbesondere einmal für alle Kontexte, what could possibly go wrong?).
Daten für den richtigen Kontext zu escapen ist nie falsch und zerstört deine Daten nicht. Es sorgt dafür, dass Steuerzeichen wie das ' in O'Mally, die du als Zeichen, aber nicht als Steuerzeichen haben willst, keine Steuerzeichen mehr sind, sondern in dem Kontext als normales Zeichen interpretiert werden. Denk nicht zu viel über "was für ein Query" oder "woher kommen die Daten" nach: du schreibst eine Variable in einen Kontext, escape sie für diesen. Ganz einfach.

Don't trust input: validate it.
Dein Benutzer sendet dir einen Parameter "sort". Prüfe, ob dieser entweder "ASC" oder "DESC" ist. Irgend etwas anderes -> Fehler.

In deiner Variable steht nun also sicher DESC oder ASC drin und die enthalten ja offensichtlich keine Steuerzeichen, also ist Escaping nicht notwendig? -> Wrong! Schreibst du die Variable in den SQL Kontext, escape sie für diesen. Nicht bedingt, kontextsensitiv! Code kann sich ändern oder Fehler enthalten.

"Wenn ich alles Escape, brauche ich doch nicht validieren" -> Doch. Du willst das dein Code beim Entgegennehmen der Parameter abbricht und eine Meldung ausgibt, die erklärt, dass der Parameter falsch ist. Es ist Quatsch darauf zu warten, dass die Datenbank sich über einen fehlerhaften Query beschwert und dann nach der Ursache zu suchen. Fail as early as possible!

Es ist Irrglaube zu denken man könne da clever etwas "weg optimieren", das Ergebnis ist nie clever. Die Zeit, die man damit verbringt sich Gründe zu überlegen, warum man etwas nicht tun muss, was man immer tun sollte, ist besser damit genutzt es zu tun ;-)

Mantra: Validate on Input, Escape on Output.

wie realisier ich das nach heutigen standard?
Mir ist nicht so ganz klar, wieso GET Parameter heute als hässlich gelten. Ja, es gibt Dinge, die in der URL nichts verloren haben, zum Beispiel Authorisationsinformationen. Der DAU ist per Definition ahnungslos, postet das als Link in ein Forum und bekommt seinen Account geklaut.
Wenn du & ? und = hässlich findest -> electric.larry hat dafür ja schon eine Lösung genannt.
Grundsätzlich erlauben Parameter in der URL ein Lesezeichen darauf zu setzen. Das kann ein erwünschtes Features sein. Auch lassen sich GET Requests cachen. Das kann ein gigantischer Performancevorteil sein, aber du musst dich mit Cache-Invalidierung beschäftigen. Vielleicht macht es Sinn Caching abzuschalten (z.B. wenn die Performance nicht so relevant ist, dass sie die Kosten für die Entwicklerzeit zum Umsetzen ordentlicher Invalidierung rechtfertigen, oder weil die Entwickler es schlicht nicht hinbekommen, oder weil die Daten sich so häufig ändern, dass es schlicht sinnfrei ist (Trivialbeispiel: Ausgabe der Uhrzeit)). Bei GET musst du das explizit machen, bei POST ist Caching implizit abgeschaltet. Nutzt du Post-Redirect-Get (unterbindet die störende "möchten sie die Daten noch einmal senden" Meldung und verhindert unbeabsichtigte Mehrfacheingaben.), dann gilt das aber natürlich nicht für den GET und du musst dich mit Caching beschäftigen. Das ist einer der Fälle in denen Caching dann gerne ganz abgeschaltet wird, da die Ausgabe auch von der Session abhängt und nicht nur von der URL und den Daten.

Das Cachingverhalten ist im übrigen ein Indiz für die Idee der unterschiedlichen HTTP Methoden: Ein POST ist dafür gedacht, dass der Benutzer die Webressource ändert und man daher mit dem gecachten Ergebnis von vor der Änderung nichts anfangen kann. Ändert eine Listenausgabe die Daten? Nein, also ist GET hier angemessen.
Mit Sicherheit haben HTTP Methoden im übrigen nichts zu tun. Ein Angreifer manipuliert immer die ganze Anfrage an den Server, dem ist es egal, ob die Parameter in den Headern oder im Content stehen.

Willst du deine Addresszeile "sauber" halten (und damit Lesezeichen unterbinden), würde ich eher darüber nachdenken den Aufruf innerhalb der Seite über AJAX zu machen. Hat auch den optischen Vorteil, dass das Layout nicht neu geladen wird. Im Grunde ist das der Ansatz, denn ich als "heutigen Standard" sehe. Mit der Entwicklung guter JavaScript Frameworks in den letzten Jahren wandert die View vollständig in den Client, der Server stellt nur noch eine API zur Verfügung. Statt einer Anwendung, deren Ausgabe die HTML-View ist, hat man defacto zwei Anwendungen: Eine in JS und eine serverseitige. Neben der UX hat das auch Vorteile für die Entwicklung: Es forciert eine Trennung der Responsibilities, die gerade in der Webentwicklung viel zu gerne missachtet wird, obwohl sie eine Best Practice ist. Das Aussehen der Seite kann stark verändert werden, ohne die serverseitige Logik anfassen zu müssen, diese wird nur noch angepasst um neue Features zu implementieren oder Bugs zu fixen. Auch kann man die serverseitge Anwendung komplett ersetzen (zum Beispiel von PHP zu Java), ohne den Client ändern zu müssen. Das hat auch für die Qualitätssicherung Vorteile, weil man beide Anwendungen unabhängig testen kann. So kann ich zum Beispiel testen, ob der Client auf einen 500er korrekt reagiert, ohne einen Serverfehler provozieren zu müssen: Ich mocke einfach den Server und kann die Ausgabe beliebig festlegen.


So ist eine dicke Wall of Text geworden :D Dieser Beitrag ist möglicherweise länger wie der Quellcode um den es geht, aber vielleicht konnte ich deine Fragen beantworten, oder dir zumindest Hinweise geben, was du als nächstes Fragen solltest.
 
Oben