2012-12-28 11 views
12

Welcher ist die sicherste Möglichkeit, ein Array über POST zu senden?PHP, übergeben Array über POST

foreach ($id as $array) 
{ 
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/> 
} 
<input type="submit" name="submit"/> 

oder implode() mit einer einzelnen Variablen erstellen, übergeben Sie die Variable und dann explode() verwenden, um die Werte in ein neues Array zurück zu bekommen?

+0

Wenn Sie stark strukturierte Daten zwischen dem Client und dem Server hin und her senden, warum sollten Sie ihn nicht zu JSON serialisieren? –

+1

Was ist Ihrer Meinung nach inhärent unsicher, wenn Sie ein Array per POST übergeben? Es sind nur Daten. –

+1

Ich mag normalerweise 'json_encode()' Dinge. Dann 'json_decode()' mit der Option true, um es wieder zu entfernen. – phpisuber01

Antwort

6

Warum senden Sie es über einen Post, wenn Sie es bereits auf der Server (PHP) -Seite haben?

Warum speichern Sie das Array nicht einfach auf s $_SESSION Variable, so dass Sie es verwenden können, wenn das Formular gesendet wird, die es möglicherweise sicherer machen könnte, da der Client die Variablen nicht durch Bearbeiten der Quelle ändern kann.

Es hängt alles davon ab, was Sie wirklich wollen.

+1

Sitzungen und Post-Daten sind zwei sehr unterschiedliche Dinge, die für unterschiedliche Daten verwendet werden sollten. Sprechen * speichern Sie einfach das Array auf die Sitzungsvariable * ignoriert die Unterschiede zwischen ihnen. Vielleicht ist es richtig oder falsch.Von der gestellten Frage können wir einfach nicht sagen ... – ircmaxell

+0

Ich vermute nur. Ill edit meine Antwort auf diese Tatsache – Neal

+0

Ich dachte auch, aber wenn ich vergessen, die $ _SESSION-Variable zu löschen, oder wenn passiert etwas, das verhindert, das wäre ein Problem – user1722791

19

bearbeiten Wenn Sie über die Sicherheit fragen, meinen Nachtrag am unteren bearbeiten siehe

PHP hat eine serialize Funktion für diesen Zweck zur Verfügung gestellt. Übergeben Sie ein Array, und Sie erhalten eine String-Darstellung davon. Wenn Sie es wieder in ein Array konvertieren möchten, verwenden Sie einfach die unserialize-Funktion.

Dies wird oft von Lazy Codern verwendet, um Daten in einer Datenbank zu speichern. Nicht empfohlen, funktioniert aber als schnelle/schmutzige Lösung.

Nachtrag

Ich habe den Eindruck, dass Sie nach einem Weg, wurden zuverlässig die Daten zu senden, nicht „sicher“. Egal, wie Sie die Daten weitergeben, wenn sie das System des Benutzers durchlaufen, können Sie ihnen überhaupt nicht vertrauen. Im Allgemeinen sollten Sie es irgendwo auf dem Server speichern & Verwenden Sie einen Berechtigungsnachweis (Cookie, Sitzung, Passwort, etc), um es nachzuschlagen.

12

Man konnte es in der Sitzung gestellt:

session_start(); 
$_SESSION['array_name'] = $array_name; 

Oder wenn Sie es über ein Formular senden möchten, können Sie serialisiert es:

<input type='hidden' name='input_name' value="<?php echo htmlentities(serialize($array_name)); ?>" /> 

$passed_array = unserialize($_POST['input_name']); 

Beachten Sie, dass mit serialisierten Arrays arbeiten zu können, müssen POST als Übertragungsmethode des Formulars verwenden, da GET eine Größenbeschränkung von etwa 1024 Zeichen hat.

Ich würde Sitzungen verwenden, wo immer es möglich ist.

+2

SESSION ist sicherer als Daten im Eingabetyp zu speichern, daher ist SESSION serverseitig, so dass der Benutzer sie nicht ändern kann. Stimme mit dir @laxonline –

+0

Ich habe eine Frage hier. Wenn es Tausende von Eingaben im Formular gibt, wird das gleiche funktionieren? – anujeet

5

Es gibt zwei Dinge zu beachten: Benutzer können Formulare ändern, und Sie müssen gegen Cross Site Scripting (XSS) sichern.

XSS

XSS ist, wenn ein Benutzer HTML in ihre Eingabe eingibt. Was ist beispielsweise, wenn ein Benutzer diesen Wert gesendet hat?:

" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=" 

Dies würde wie so in das Formular geschrieben werden:

<input type="hidden" name="prova[]" value="" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=""/> 

Der beste Weg, sich dagegen zu schützen, ist htmlspecialchars() zu benutzen, um Ihre Eingabe zu sichern. Dies codiert Zeichen wie < in &lt;. Zum Beispiel:

<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/> 

Sie können mehr über XSS hier lesen: https://www.owasp.org/index.php/XSS

Formular Änderung

Wenn ich auf Ihrer Website waren, konnte ich Chrome-Entwicklertools oder Firebug verwenden, um die HTML zu ändern von deiner Seite. Abhängig davon, was Ihr Formular tut, könnte dies böswillig verwendet werden.

Ich könnte zum Beispiel zusätzliche Werte zu Ihrem Array hinzufügen, oder Werte, die nicht in das Array gehören. Wenn dies ein Dateisystemmanager wäre, könnte ich Dateien hinzufügen, die nicht existieren oder Dateien, die vertrauliche Informationen enthalten (z. B. myfile.jpg durch ../index.php oder ../db-connect.php ersetzen).

Kurz gesagt, Sie müssen Ihre Eingaben später überprüfen, um sicherzustellen, dass sie sinnvoll sind, und nur sichere Eingaben in Formularen verwenden. Eine Datei-ID (eine Nummer) ist sicher, da Sie überprüfen können, ob die Nummer vorhanden ist, und dann den Dateinamen aus einer Datenbank extrahieren (dies setzt voraus, dass Ihre Datenbank gültige Eingaben enthält). Eine Datei Name ist aus den oben beschriebenen Gründen nicht sicher. Sie müssen entweder den Dateinamen erneut validieren, oder ich könnte ihn zu irgendetwas ändern.

+0

Funktioniert das nur auf Formularen? – user1722791

+0

'htmlspecialchars()' sollte auf alle Benutzereingaben angewendet werden. StackOverflow tut wahrscheinlich etwas Ähnliches wie Ihr Benutzername: Es wird überall geschrieben, also darf es nicht böswilliges HTML sein. Benutzer können jedes HTML ändern, das sie gerade betrachten. Ich habe dies getan, um einen Highscore bei einem der Google Olympics-Spiele zu fälschen: https://sphotos-b.xx.fbcdn.net/hphotos-ash4/418275_485985401412972_1427008375_n.jpg Formulare sind besonders, weil sie Eingaben enthalten, an die Benutzer zurücksenden der Server. Sie müssen jede Eingabe überprüfen, die Sie an Sie senden, um sicherzustellen, dass es sinnvoll ist, oder Leute werden Ihre Website hacken. – Chris

+0

Danke, ich werde versuchen, dies immer im Hinterkopf zu behalten. – user1722791

6

http://php.net/manual/en/reserved.variables.post.php

Die ersten Kommentar antwortet diese.

<form ....> 
<input name="person[0][first_name]" value="john" /> 
<input name="person[0][last_name]" value="smith" /> 
... 
<input name="person[1][first_name]" value="jane" /> 
<input name="person[1][last_name]" value="jones" /> 
</form> 

<?php 
var_dump($_POST['person']); 

array (
0 => array('first_name'=>'john','last_name'=>'smith'), 
1 => array('first_name'=>'jane','last_name'=>'jones'), 
) 
?> 

Das Namensschild kann als Array arbeiten.