Muss ich mich vor SQL-Injection schützen, wenn ich ein Dropdown verwendet habe?

96

Ich verstehe, dass Sie Benutzereingaben aus einem Formular NIEMALS vertrauen sollten, hauptsächlich aufgrund der Möglichkeit einer SQL-Injection.

Gilt dies jedoch auch für ein Formular, bei dem die einzige Eingabe von einem Dropdown (s) stammt (siehe unten)?

Ich speichere das $_POST['size']in einer Sitzung, die dann auf der gesamten Site verwendet wird, um die verschiedenen Datenbanken abzufragen (mit einer mysqliSelect-Abfrage), und jede SQL-Injection würde sie definitiv beschädigen (möglicherweise löschen).

Es gibt keinen Bereich für eingegebene Benutzereingaben zum Abfragen der Datenbanken, nur Dropdown-Listen.

<form action="welcome.php" method="post">
<select name="size">
  <option value="All">Select Size</option> 
  <option value="Large">Large</option>
  <option value="Medium">Medium</option>
  <option value="Small">Small</option>
</select>
<input type="submit">
</form>
Lumpen
quelle
112
Ja. Nichts hindert einen Angreifer daran, die gewünschten Werte für Ihre <select>Eingabe zu übermitteln . In der Tat könnte sogar ein etwas technischer Benutzer zusätzliche Optionen über die Browserkonsole hinzufügen. Wenn Sie eine Array-Whitelist mit verfügbaren Werten führen und die Eingabe damit vergleichen, können Sie dies abschwächen (und Sie sollten dies tun, da dies unerwünschte Werte verhindert)
Michael Berkowski,
13
Sie sollten grundlegende Anforderungs- / Antwortsachen verstehen und wissen, dass es keine Rolle spielt, wie das Front-End über der Anforderung aufgebaut ist, dh in diesem Fall Dropdown
Royal Bg
13
@YourCommonSense Weil es eine gute Frage ist. Nicht jeder weiß, wie manipulierbar ein Kunde ist. Dies wird sehr wertvolle Antworten auf diese Seite provozieren.
Cruncher
8
@ Cruncher sehe ich. Für einen durchschnittlichen Stackoverflowian ist es eine Raketenwissenschaft, von der sie früher gehört haben. Auch trotz der am häufigsten gestellten Frage unter PHP-Tag.
Ihr gesunder Menschenverstand
9
"Ich verstehe, dass Sie NIEMALS Benutzereingaben vertrauen sollten". Keine Ausnahmen.
Prinzhorn

Antworten:

69

Sie können etwas so Einfaches wie das folgende Beispiel tun, um sicherzustellen, dass die angegebene Größe Ihren Erwartungen entspricht.

$possibleOptions = array('All', 'Large', 'Medium', 'Small');

if(in_array($_POST['size'], $possibleOptions)) {
    // Expected
} else {
    // Not Expected
}

Verwenden Sie dann mysqli_ *, wenn Sie eine Version von php> = 5.3.0 verwenden, die Sie sein sollten, um Ihr Ergebnis zu speichern. Bei korrekter Verwendung hilft dies bei der SQL-Injektion.

Oliver Bayes-Shelton
quelle
Ist dies eine Kurzversion einer 'Whitelist' OliverBS?
Tatters
Nicht wirklich nur eine sehr einfache Version von einer, Sie können die Werte zu einer Datenbank hinzufügen, um sie zu überprüfen, um sie einfacher und wiederverwendbarer zu machen. Oder Sie können eine Whitelist-Klasse mit einer bestimmten Methode für jede Whitelist erstellen, gegen die geprüft werden soll. Wenn Sie keine Datenbank verwenden möchten, können sich die Whitelist-Eigenschaften in einer Array-Eigenschaft in Ihrer Whitelist-Klasse befinden.
Oliver Bayes-Shelton
9
Sie müssen jedoch Prepared Statements (empfohlen) oder verwenden mysqli_real_escape_string. Schließen Sie die Werte bei der Ausgabe auch ordnungsgemäß an (z. B. verwenden Sie htmlspecialchars () in einem HTML-Dokument).
ComFreek
4
Ich würde vorschlagen, den dritten Parameter von in_arrayto truefür einen strengen Vergleich festzulegen. Ich bin mir nicht sicher, was schief gehen könnte, aber ein loser Vergleich ist ziemlich eigenartig.
Brilliand
1
@OliverBS $ _POST-Werte können auch Arrays sein. Numerische Zeichenfolgen werden als Zahlen verglichen ('5' == '05'). Ich glaube nicht, dass Sie in Ihrem speziellen Beispiel eine Sicherheitslücke haben, aber die Regeln sind komplex und Lücken können sich aus Gründen öffnen, die ich nicht einmal verstehe. Ein strenger Vergleich ist einfacher zu begründen und daher einfacher sicher zu verwenden.
Brilliand
195

Ja, Sie müssen sich davor schützen.

Lassen Sie mich Ihnen anhand der Firefox-Entwicklerkonsole zeigen, warum:

Ich habe einen der Werte in der Dropdown-Liste als Drop-Table-Anweisung bearbeitet

Wenn Sie diese Daten nicht bereinigen, wird Ihre Datenbank zerstört. (Dies ist möglicherweise keine vollständig gültige SQL-Anweisung, aber ich hoffe, ich habe meinen Standpunkt klargestellt.)

Nur weil Sie die verfügbaren Optionen in Ihrer Dropdown-Liste eingeschränkt haben, bedeutet dies nicht, dass Sie die Daten, die ich an Ihren Server senden kann, eingeschränkt haben.

Wenn Sie versucht haben, dies mithilfe des Verhaltens auf Ihrer Seite weiter einzuschränken, können Sie dieses Verhalten deaktivieren oder einfach eine benutzerdefinierte HTTP-Anforderung an Ihren Server schreiben, die diese Formularübermittlung ohnehin nachahmt. Genau dafür wird ein Tool namens curl verwendet, und ich denke, der Befehl zum Senden dieser SQL-Injection würde ungefähr so ​​aussehen:

curl --data "size=%27%29%3B%20DROP%20TABLE%20*%3B%20--"  http://www.example.com/profile/save

(Dies ist möglicherweise kein vollständig gültiger Curl-Befehl, aber ich hoffe, ich habe meinen Standpunkt klar zum Ausdruck gebracht.)

Also werde ich wiederholen:

NIEMALS Benutzereingaben vertrauen. Schützen Sie sich IMMER.

Gehen Sie nicht davon aus, dass Benutzereingaben jemals sicher sind. Es ist möglicherweise unsicher, selbst wenn es auf andere Weise als durch ein Formular ankommt. Nichts davon ist jemals vertrauenswürdig genug, um auf den Schutz vor SQL-Injection zu verzichten.

Doppelgrün
quelle
24
Ganz zu schweigen von der Herstellung einer benutzerdefinierten Nutzlast mit curl. IMMER sanieren Eingangsserverseitige !
recursion.ninja
14
Ein Bild sagt mehr als tausend Worte.
Davidkonrad
4
Dies sollte die Standardantwort sein. Sollte auch etwas über enthalten curl. Die Leute verstehen nicht, dass Sie eine HTTP-Anfrage von überall nach überall in einem beliebigen Format senden und Werte übergeben können. Es ist Sache des Servers, sicherzustellen, dass die Anfrage gültig ist, bevor Sie sie verarbeiten.
Retrohacker
2
Wie süß! Es sind kleine Bobby-Tische!
Aura
45

Da diese Frage mit getaggt wurde Hier ist eine Antwort zu dieser besonderen Art von Angriff:

Wie Sie in den Kommentaren erfahren haben, müssen Sie für jede einzelne Abfrage, die variable Daten enthält, ohne Ausnahmen vorbereitete Anweisungen verwenden .

Unabhängig von HTML-Inhalten!
Es ist wichtig zu verstehen, dass SQL-Abfragen unabhängig von externen Faktoren, sei es HTML-Eingabe oder irgendetwas anderem, richtig formatiert werden müssen .

Obwohl Sie die in anderen Antworten vorgeschlagene White-Listing-Funktion für die Eingabeüberprüfung verwenden können, sollte dies keine Auswirkungen auf SQL-bezogene Aktionen haben - sie müssen gleich bleiben, unabhängig davon, ob Sie die HTML-Eingabe validiert haben oder nicht. Dies bedeutet, dass Sie immer noch vorbereitete Anweisungen verwenden müssen, wenn Sie Variablen zur Abfrage hinzufügen.

Hier finden Sie eine ausführliche Erklärung, warum vorbereitete Anweisungen ein Muss sind und wie sie richtig verwendet werden und wo sie nicht anwendbar sind und was in einem solchen Fall zu tun ist: Per Anhalter durch den SQL Injection-Schutz

Auch diese Frage wurde mit getaggt . Meistens aus Versehen, nehme ich an, aber trotzdem muss ich Sie warnen, dass rohes mysqli kein adäquater Ersatz für die alten mysq_ * -Funktionen ist . Einfach, weil es, wenn es im alten Stil verwendet wird, überhaupt keine Sicherheit bietet. Die Unterstützung für die vorbereiteten Anweisungen ist zwar schmerzhaft und mühsam, aber der durchschnittliche PHP-Benutzer kann sie überhaupt nicht mehr ausführen. Wenn also kein ORM oder eine Art Abstraktionsbibliothek verfügbar ist, ist PDO Ihre einzige Wahl.

Ihr gesunder Menschenverstand
quelle
5
i = zufällig (0, 15); // eine Abfrage mit i. Muss ich hier noch eine Erklärung vorbereiten?
Cruncher
2
Was ist die Implementierung von random?
Slicedpan
9
@YourCommonSense eng gesehen? Für mich ist "Immer X machen, und ich werde keine Begründung dafür liefern" eng gefasst.
Cruncher
5
@ Cruncher Ich kann mir keinen Grund vorstellen, nicht immer vorbereitete Anweisungen zu verwenden, jedes Mal für alles, immer. Kannst du mir eins sagen?
Wesley Murch
3
@ Cruncher Dem stimme ich zu, es scheint nur, als würdest du Devil's Advocate spielen. Die Bestimmung in der Antwort lautet auch "mit variablen Daten" . Es gibt einige Fälle wie PHP Int Casting, aber es scheint besser, nur vorbereitete Anweisungen zu verwenden. (Unerfahrenen) Leuten zu sagen, dass ein kleiner Leistungsschub wichtiger ist als Sicherheit, ist weit entfernt. Die Antwort ist "unvollständig", sendet aber eine starke Nachricht, die die anderen ignorieren. Ich werde meinen Fall ausruhen.
Wesley Murch
12

Ja.

Jeder kann alles für die Werte fälschen, die tatsächlich gesendet werden -

Um Validierungsmenüs zu validieren, können Sie einfach überprüfen, ob der Wert, mit dem Sie arbeiten, in der Dropdown-Liste enthalten ist. So etwas wäre der beste (am meisten paranoide) Weg:

if(in_array($_POST['ddMenu'], $dropDownValues){

    $valueYouUseLaterInPDO = $dropDownValues[array_search("two", $arr)];

} else {

    die("effin h4x0rs! Keep off my LAMP!!"); 

}
rm-vanda
quelle
5
Diese Antwort ist unvollständig, außerdem sollten Sie vorbereitete Anweisungen verwenden, damit eine Injektion nicht möglich ist, unabhängig davon, auf welchen Wert der Wert eingestellt ist
Slicedpan
7
@ Slicedpan Wirklich? Das hört sich so an, als würden Sie auf den Zug springen, ohne zu wissen warum ... Wenn ich eine Handvoll möglicher Eingaben in eine Abfrage habe, damit ich überprüfen kann, ob sie alle in Ordnung sind (was ich weiß, weil ich sie gemacht habe), Dann erhalten Sie keine zusätzlichen Sicherheitsvorteile durch die Verwendung einer vorbereiteten Erklärung
Cruncher
3
Abgesehen davon, dass die Durchsetzung der Verwendung vorbereiteter Anweisungen als Konvention Sie davor schützt, in Zukunft SQL-Injection-Schwachstellen einzuführen.
Slicedpan
1
@Cruncher Ein Versprechen zu machen "Alle Werte in der Dropdown-Liste sind immer sicher" ist ein sehr unsicheres Versprechen. Werte werden geändert, Code wird nicht unbedingt aktualisiert. Derjenige, der die Werte aktualisiert, weiß möglicherweise nicht einmal, was ein unsicherer Wert ist! Gerade im Bereich der Webprogrammierung, die mit allen Arten von Sicherheitsbedenken behaftet ist, ist es einfach unverantwortlich (und andere weniger nette Worte), auf so etwas zu verzichten.
Hyde
1
@Cruncher Wenn Sie mit Ihren SQL-Aufgaben richtig umgehen, können Sie jede Eingabe akzeptieren, ohne die ordnungsgemäße Funktion von SQL zu beeinträchtigen. Der SQL-Teil sollte vorbereitet und bereit sein, alles zu akzeptieren, egal woher es kommt. Alles andere ist fehleranfällig.
glglgl
8

Eine Möglichkeit, sich vor Benutzern zu schützen, die Ihre Dropdowns mithilfe der Konsole ändern, besteht darin, nur ganzzahlige Werte zu verwenden. Anschließend können Sie überprüfen, ob der POST-Wert eine Ganzzahl enthält, und diese bei Bedarf mithilfe eines Arrays in Text konvertieren. Z.B:

<?php
// No, you don't need to specify the numbers in the array but as we're using them I always find having them visually there helpful.
$sizes = array(0 => 'All', 1 => 'Large', 2 => 'Medium', 3 => 'Small');
$size = filter_input(INPUT_POST, "size", FILTER_VALIDATE_INT);

echo '<select name="size">';
foreach($sizes as $i => $s) {
    echo '<option value="' . $i . '"' . ($i == $size ? ' selected' : '') . '>' . $s . '</option>';
}
echo '</select>';

Dann können Sie $sizeIhre Abfrage mit dem Wissen verwenden, dass sie immer nur FALSEeine Ganzzahl enthält.

Styphon
quelle
2
@OliverBS Was ist, filter_inputwenn nicht eine Überprüfung auf der Serverseite? Niemand kann etwas anderes als eine ganze Zahl posten.
Styphon
Danke Styphon, also ersetzt dies das Formular im OP? Und wäre dies auf größere Formulare mit mehreren Dropdowns anwendbar? Wenn ich ein weiteres Dropdown hinzugefügt habe, um "Farbe" zu sagen?
Tatters
@SamuelTattersfield Ja und ja. Sie können dies für so viele Dropdowns verwenden, wie Sie möchten, mit so vielen Optionen, wie Sie möchten. Sie erstellen einfach ein neues Array für jedes Dropdown-Menü und geben alle Optionen für das Dropdown-Menü in das Array ein.
Styphon
Nett! Ich mag das. Ich werde es versuchen und sehen, was ich beim Testen bekomme.
Tatters
@SamuelTattersfield Großartig, stellen Sie sicher, dass Sie das filter_inputTeil auch für die Validierung verwenden, da es sonst aus Sicherheitsgründen genauso nützlich ist wie eine Schokoladenteekanne.
Styphon
7

Die anderen Antworten decken bereits das ab, was Sie wissen müssen. Aber vielleicht hilft es, noch etwas zu klären:

Es gibt ZWEI DINGE, die Sie tun müssen:

1. Überprüfen Sie die Formulardaten.

Wie die Antwort von Jonathan Hobbs sehr deutlich zeigt, führt die Auswahl des HTML-Elements für die Formulareingabe zu keiner zuverlässigen Filterung für Sie.

Die Validierung erfolgt normalerweise so, dass die Daten nicht geändert werden, das Formular jedoch erneut angezeigt wird. Die Felder sind mit "Bitte korrigieren" gekennzeichnet.

Die meisten Frameworks und CMS verfügen über Formularersteller, die Sie bei dieser Aufgabe unterstützen. Und nicht nur das, sie helfen auch gegen CSRF (oder "XSRF"), eine andere Form des Angriffs.

2. Bereinigen / Escape-Variablen in SQL-Anweisungen.

.. oder lassen Sie vorbereitete Aussagen die Arbeit für Sie erledigen.

Wenn Sie eine (My) SQL-Anweisung mit vom Benutzer bereitgestellten oder nicht vom Benutzer bereitgestellten Variablen erstellen, müssen Sie diese Variablen maskieren und in Anführungszeichen setzen.

Im Allgemeinen sollte jede solche Variable, die Sie in eine MySQL-Anweisung einfügen, entweder eine Zeichenfolge sein oder etwas, das PHP zuverlässig in eine Zeichenfolge umwandeln kann, die MySQL verarbeiten kann. Wie Zahlen.

Für Zeichenfolgen müssen Sie dann eine von mehreren Methoden auswählen, um die Zeichenfolge zu umgehen. Das heißt, Sie müssen alle Zeichen ersetzen, die in MySQL Nebenwirkungen haben würden.

  • In MySQL + PHP der alten Schule erledigt mysql_real_escape_string () den Job. Das Problem ist, dass es viel zu leicht zu vergessen ist, daher sollten Sie unbedingt vorbereitete Anweisungen oder Abfrage-Builder verwenden.
  • In MySQLi können Sie vorbereitete Anweisungen verwenden.
  • Die meisten Frameworks und CMS bieten Abfrage-Builder, die Sie bei dieser Aufgabe unterstützen.

Wenn Sie es mit einer Zahl zu tun haben, können Sie das Escapezeichen und die Anführungszeichen weglassen (aus diesem Grund können Sie in den vorbereiteten Anweisungen einen Typ angeben).

Es ist wichtig darauf hinzuweisen, dass Sie die Variablen für die SQL-Anweisung und NICHT für die Datenbank selbst maskieren . Die Datenbank speichert die ursprüngliche Zeichenfolge, die Anweisung benötigt jedoch eine maskierte Version.

Was passiert, wenn Sie eines davon weglassen?

Wenn Sie keine Formularvalidierung verwenden , aber Ihre SQL-Eingabe bereinigen, werden möglicherweise alle Arten von schlechten Dingen auftreten, aber Sie werden keine SQL-Injection sehen! (*)

Erstens kann Ihre Bewerbung in einen Zustand versetzt werden, den Sie nicht geplant haben. Wenn Sie beispielsweise das Durchschnittsalter aller Benutzer berechnen möchten, aber ein Benutzer "aljkdfaqer" für das Alter angegeben hat, schlägt Ihre Berechnung fehl.

Zweitens kann es alle Arten von anderen Injektionsangriffen geben, die Sie berücksichtigen müssen: Beispielsweise könnte die Benutzereingabe Javascript oder anderes Material enthalten.

Es kann immer noch Probleme mit der Datenbank geben: ZB wenn ein Feld (Datenbanktabellenspalte) auf 255 Zeichen begrenzt ist und die Zeichenfolge länger ist. Oder wenn das Feld nur Zahlen akzeptiert und Sie versuchen, stattdessen eine nicht numerische Zeichenfolge zu speichern. Dies ist jedoch keine "Injektion", sondern nur ein "Absturz der Anwendung".

Aber selbst wenn Sie ein Freitextfeld haben, in dem Sie Eingaben ohne Validierung zulassen, können Sie diese einfach so in der Datenbank speichern, wenn Sie sie beim Aufrufen einer Datenbankanweisung ordnungsgemäß umgehen. Das Problem tritt auf, wenn Sie diese Zeichenfolge irgendwo verwenden möchten.

(*) oder das wäre etwas wirklich Exotisches.

Wenn Sie Variablen für SQL-Anweisungen nicht entkommen , aber die Formulareingabe validiert haben, können Sie immer noch sehen, dass schlechte Dinge passieren.

Erstens besteht das Risiko, dass beim Speichern und erneuten Laden von Daten in die Datenbank nicht mehr dieselben Daten "verloren gehen".

Zweitens kann dies zu ungültigen SQL-Anweisungen führen und somit Ihre Anwendung zum Absturz bringen. Wenn beispielsweise eine Variable ein Anführungszeichen oder ein doppeltes Anführungszeichen enthält, erhalten Sie je nach verwendetem Anführungszeichentyp eine ungültige MySQL-Anweisung.

Drittens kann es immer noch zu einer SQL-Injection kommen.

Wenn Ihre Benutzereingaben aus Formularen bereits gefiltert / validiert sind, kann eine absichtliche SQl-Injektion weniger wahrscheinlich werden, wenn Ihre Eingabe auf eine fest codierte Liste von Optionen reduziert wird oder wenn sie auf Zahlen beschränkt ist. Jede freie Texteingabe kann jedoch für die SQL-Injection verwendet werden, wenn Sie die Variablen in SQL-Anweisungen nicht ordnungsgemäß umgehen.

Und selbst wenn Sie überhaupt keine Formulareingabe haben, können Sie dennoch Zeichenfolgen aus allen Arten von Quellen haben: Aus dem Dateisystem lesen, aus dem Internet kratzen usw. Niemand kann garantieren, dass diese Zeichenfolgen sicher sind.

Donquijote
quelle
Weder zu lange Daten noch eine Zeichenfolge in ein numerisches Feld werden irgendetwas zum Absturz bringen
Your Common Sense
hmm, habe es gerade versucht, und tatsächlich zeigt es eine Warnung anstelle eines Fehlers. Ich denke, es ist PDO, das dies in einen Fehler verwandelt. Ich bin sicher, ich habe in einem Dutzend Ausgaben auf drupal.org darüber gesprochen, wo eine Zeichenfolge für einen Varchar zu lang ist.
Donquijote
6

Ihr Webbrowser "weiß" nicht, dass er eine Seite von PHP empfängt. Alles, was er sieht, ist HTML. Und die http-Schicht weiß noch weniger. Sie müssen in der Lage sein, nahezu jede Art von Eingabe zu verarbeiten, die die http-Ebene überschreiten kann (zum Glück wird bei den meisten Eingabe-PHP bereits ein Fehler ausgegeben). Wenn Sie versuchen zu verhindern, dass böswillige Anfragen Ihre Datenbank durcheinander bringen, müssen Sie davon ausgehen, dass der Typ am anderen Ende weiß, was er tut, und dass er nicht auf das beschränkt ist, was Sie unter normalen Umständen in Ihrem Browser sehen können ( ganz zu schweigen davon, was Sie mit den Entwicklertools eines Browsers spielen können. Ja, Sie müssen alle Eingaben aus Ihrem Dropdown-Menü berücksichtigen, aber für die meisten Eingaben können Sie einen Fehler angeben.

Namenloser
quelle
6

Die Tatsache, dass Sie den Benutzer darauf beschränkt haben, nur Werte aus einer bestimmten Dropdown-Liste zu verwenden, ist irrelevant. Ein technischer Benutzer kann die an Ihren Server gesendete http-Anfrage erfassen, bevor er sein Netzwerk verlässt, sie mit einem Tool wie einem lokalen Proxyserver ändern und dann auf seinem Weg fortsetzen. Mithilfe der geänderten Anforderung können sie Parameterwerte senden, die nicht in der Dropdown-Liste angegeben sind. Entwickler müssen die Einstellung haben, dass Client-Einschränkungen oft bedeutungslos sind, da alles auf einem Client geändert werden kann. Die Serverüberprüfung ist an jedem einzelnen Punkt erforderlich, an dem Clientdaten eingegeben werden. Angreifer verlassen sich in diesem einzigen Aspekt auf die Naivität der Entwickler.

Jason Higgins
quelle
5

Verwenden Sie am besten eine parametrisierte Abfrage, um eine SQL-Injection zu vermeiden. In diesem Fall sieht die Abfrage folgendermaßen aus:

SELECT * FROM table WHERE size = ?

Wenn Sie eine Abfrage wie die oben genannte mit Text versehen, dessen Integrität nicht überprüft wurde (die Eingabe wird auf dem Server nicht überprüft) und der SQL-Injection-Code enthält, wird sie korrekt behandelt. Mit anderen Worten, die Anforderung führt dazu, dass in der Datenbankebene Folgendes passiert:

SELECT * FROM table WHERE size = 'DROP table;'

Dadurch werden bei der Rückgabe einfach 0 Ergebnisse ausgewählt, wodurch die Abfrage unwirksam wird und der Datenbank tatsächlich Schaden zufügt, ohne dass eine Whitelist, eine Überprüfungsprüfung oder andere Techniken erforderlich sind. Bitte beachten Sie, dass ein verantwortlicher Programmierer die Sicherheit in Schichten übernimmt und häufig zusätzlich zur Parametrisierung von Abfragen validiert. Es gibt jedoch kaum einen Grund, Ihre Abfragen aus Sicht der Leistung nicht zu parametrisieren, und die durch diese Vorgehensweise hinzugefügte Sicherheit ist ein guter Grund, sich mit parametrisierten Abfragen vertraut zu machen.

Dan Smith
quelle
4

Was auch immer von Ihrem Formular gesendet wird, wird als Text über die Kabel an Ihren Server gesendet. Nichts hindert jemanden daran, einen Bot zu erstellen, der den Client nachahmt oder ihn von einem Terminal aus eingibt, wenn er möchte. Gehen Sie niemals davon aus, dass sich der Client, weil Sie ihn programmiert haben, so verhält, wie Sie es sich vorstellen. Das ist wirklich leicht zu fälschen.

Beispiel dafür, was passieren kann und wird, wenn Sie dem Kunden vertrauen.

GenericJam
quelle
4

Ein Hacker kann den Browser einschließlich der Überprüfung von Javascript-Formularen vollständig umgehen, indem er eine Anfrage über Telnet sendet. Natürlich wird er sich den Code Ihrer HTML-Seite ansehen, um die Feldnamen zu erhalten, die er verwenden muss, aber von da an ist alles für ihn erledigt. Sie müssen also alle auf dem Server übermittelten Werte überprüfen, als ob sie nicht von Ihrer HTML-Seite stammen.

user1452686
quelle