zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden $var = $_POST['stuff'] ist immer leer, var_dump[$_POST] nicht

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 21.08.2013, 17:50
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 21.08.2013
Beiträge: 3
NicknameMk2 befindet sich auf einem aufstrebenden Ast
Standard $var = $_POST['stuff'] ist immer leer, var_dump[$_POST] nicht

Hey, ich hab ein Problem bei der Übergabe von Daten mit POST.

Folgende Gegebenheiten:

Mit var_dump sehe ich die übergebenen Daten. Exakt, wie sie sein sollten.

Wenn ich dann aber die die Variablen aufrufe, in denen die Daten von dem POST Aufruf gespeichert werden sollten, sind diese leer.

Wenn noch Fragen offen sind, beantworte ich die gern.

Bis dahin schonmal danke!
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 21.08.2013, 18:56
?!?
XHTMLforum-Kenner
 
Registriert seit: 20.03.2013
Beiträge: 1.638
explanator sorgt für eine eindrucksvolle Atmosphäreexplanator sorgt für eine eindrucksvolle Atmosphäre
Standard

Kannst mal ein wenig Code zur Verfügung stellen, sonst weiss man ja gar nicht von was du sprichst.
Bitte rücke den Code entsprechend ein und verwende die PHP-Tags aus dem Edtitor zum Code einfügen.
__________________
"Wieso ist der Code schrott, ich dachte hier seien Profis..."
Aus einem Forum.
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 21.08.2013, 20:15
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 21.08.2013
Beiträge: 3
NicknameMk2 befindet sich auf einem aufstrebenden Ast
Standard

Ok! Ich hab's rausgefunden...

Mit $_Post gehts nich,... ABER mit $_POST! Wer hätte das gedacht? Danke trotzdem.



PHP-Code:
<?php
error_reporting
(0);
$uMail $_Post['umail'];
$uPw $_Post['upw'];
//echo "umail ".$_Post['umail'];
//var_dump($_POST);
var_dump($_REQUEST);
$db = new PDO('mysql:host=localhost;dbname=DB;charset=utf8''USER''PASSWORT');
//echo "upw ".$uPw;
$result $db->query("select email, pw from users where email='$uMail' and pw ='$uPw'");
//$result = $db->query("select count(*) from users");
//echo "select email, pw from users where email='$uMail' and pw ='$uPw'";
if($result->fetch(PDO::FETCH_ASSOC)) {
    
//echo "1";
}
else{
     
//echo "0";    
}

//echo "select email, pw from users where email=".$uMail." and pw =".$uPw;
//echo var_dump($uMail);
?>

Das ganze bekommt die 2 Variablen über eine Android app. Wie schon gesagt, seh ich mit var_dump den gesendet Inhalt und der stimmt auch. Nur sind $uMail und $uPW dann leer, wenn ich sie ausgebe oder sonstwas damit tue.

Geändert von NicknameMk2 (21.08.2013 um 20:41 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 21.08.2013, 20:48
?!?
XHTMLforum-Kenner
 
Registriert seit: 20.03.2013
Beiträge: 1.638
explanator sorgt für eine eindrucksvolle Atmosphäreexplanator sorgt für eine eindrucksvolle Atmosphäre
Standard

1. Es heistt $_POST und nicht $_Post
2. Du brauchst die Variablen nicht umzukopieren. du kannst das $_POST Array auch in der SQL-Abfrage verwenden.
3. In SQL Abfragen Schlüsselwörter gross schreiben, wegen der Übersichtlichkeit und auf mehrere Zeilen verteilen.
4. Gewöhne dir an lesbaren Code zu schreiben.
5. Parameter sollten man nicht ungeprüft übernehmen. Dein Code ist anfällig für SQL-Injections.
6. Dein Error-Reporting (E_ALL) solltest du einschalten, während der Entwicklungsphase
7. Aufgrund des Kontextwechsels kannst du PHP-Variablen nicht direkt in SQL-Abfragen nutzen:
Das hier:
PHP-Code:
 where email='$uMail' 
funktioniert nicht, weil nach dem String $uMail gesucht wird und nicht nach der Variablen.
Du musst die Stringverkettung anwenden.

sauberer Code sieht so aus:
PHP-Code:
 
$result 
$db->query("
SELECT email, pw 
FROM users 
WHERE email = ' . 
$uMail . ' AND pw = ' . $uPw . '
"
); 
__________________
"Wieso ist der Code schrott, ich dachte hier seien Profis..."
Aus einem Forum.
Mit Zitat antworten
  #5 (permalink)  
Alt 21.08.2013, 20:53
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 21.08.2013
Beiträge: 3
NicknameMk2 befindet sich auf einem aufstrebenden Ast
Standard

Ok, ich werds noch etwas umschreiben. Danke vielmals. Bin erst seit n paar Tagen in dem Thema drin. Ist alles noch ein wenig verwirrend
Mit Zitat antworten
  #6 (permalink)  
Alt 22.08.2013, 02:52
Benutzerbild von Pr0g
(^.^)
XHTMLforum-Mitglied
 
Registriert seit: 23.08.2005
Ort: Düsseldorf
Beiträge: 535
Pr0g wird schon bald berühmt werden
Standard

Zitat:
Zitat von explanator Beitrag anzeigen
sauberer Code sieht so aus:
PHP-Code:
 
$result 
$db->query("
SELECT email, pw 
FROM users 
WHERE email = ' . 
$uMail . ' AND pw = ' . $uPw . '
"
); 
Hier mischt du die Anführungszeichen etwas. Entweder die Punkte um die Variablen noch entfernen oder
PHP-Code:
 
$result 
$db->query('
SELECT email, pw 
FROM users 
WHERE email = "' 
$uMail '" AND pw = "' $uPw '"
'
); 
... speichert hier jemand Klartextpasswörter :P
__________________
Mit Zitat antworten
  #7 (permalink)  
Alt 27.08.2013, 14:23
Benutzerbild von lottikarotti
Ein ♥ für's Web
XHTMLforum-Mitglied
 
Registriert seit: 18.04.2012
Ort: Karlsruhe
Beiträge: 396
lottikarotti wird schon bald berühmt werden
Standard

Hallo,

Zitat:
Zitat von explanator Beitrag anzeigen
2. Du brauchst die Variablen nicht umzukopieren. du kannst das $_POST Array auch in der SQL-Abfrage verwenden.
Dies verschlechtert allerdings nicht nur die Lesbarkeit des Codes, sondern stellt auch noch ein Sicherheitsrisiko dar. Ich persönlich bevorzuge bei der Verarbeitung von Benutzereingaben eine klare Struktur:

- Parameter aus $_POST/ $_GET extrahieren
- Parameter auf Existenz prüfen
- Parameter validieren
- Parameter verarbeiten

Zitat:
Zitat von explanator Beitrag anzeigen
3. In SQL Abfragen Schlüsselwörter gross schreiben, wegen der Übersichtlichkeit und auf mehrere Zeilen verteilen.
Ich denke das ist Geschmackssache. Gerade bei einem so "kurzen" Statement, kann man die Abfrage ruhig in einer Zeile stehen lassen.

Zitat:
Zitat von explanator Beitrag anzeigen
5. Parameter sollten man nicht ungeprüft übernehmen. Dein Code ist anfällig für SQL-Injections.
Nicht nur das. Es ist empfehlenswert hier auf Prepared-Statements zu setzen um die Sicherheitsrisiken zu verringern.

Zitat:
Zitat von explanator Beitrag anzeigen
7. Aufgrund des Kontextwechsels kannst du PHP-Variablen nicht direkt in SQL-Abfragen nutzen:
Das hier:
PHP-Code:
 where email='$uMail' 
funktioniert nicht, weil nach dem String $uMail gesucht wird und nicht nach der Variablen.
Du musst die Stringverkettung anwenden.
Das stimmt so nicht ganz. Wenn eine Zeichenkette in Anführungszeichen umschlossen ist, werden alle sich darin befindlichen Variablen vom PHP-Interpreter aufgelöst. Nur wenn eine Zeichenketten in einfache Anführungszeichen umschlossen wird, muss der Vereinigungs-Operator verwendet werden. Ein Beispiel:

PHP-Code:
// Eine beliebige Variable
$username 'lottikarotti' ;

// Anführungszeichen -> funktioniert!
echo "Herzlich willkommen, $username! -- " ;
echo 
"Herzlich willkommen, \"$username\"! -- " ;
echo 
"Herzlich willkommen, '$username'! -- " ;

// Einfache Anführungszeichen kombiniert mit
// dem Vereinigungs-Operator -> funktioniert!
echo 'Herzlich willkommen, ' $username '! -- ' ;

// Einfache Anführungszeichen ohne
// den Vereinigungs-Operator -> funktioniert nicht!
echo 'Herzlich willkommen, $username! -- ' 
Man achte insbesondere darauf, welche Anführungszeichen verwendet werden. Insofern hat NicknameMk2 zumindest das richtig gemacht.

Zitat:
Zitat von explanator Beitrag anzeigen
sauberer Code sieht so aus:
PHP-Code:
$result $db->query("
SELECT email, pw 
FROM users 
WHERE email = ' . 
$uMail . ' AND pw = ' . $uPw . '
"
); 
Dieser Code ist fehlerhaft, da die Zeichenkette in Anführungszeichen umschlossen wurde. Das führt dazu, dass die einfachen Anführungszeichen und der Vereinigungs-Operator (welche du innerhalb der Zeichenkette platziert hast) Teil der Zeichenkette sind.

In meinen Augen sollte eine saubere und funktionsfähige Umsetzung der gesamten Problemstellung in etwa so aussehen:

PHP-Code:
/** Konfiguration */
define'SQL_DATASOURCE''' ) ;
define'SQL_USERNAME''' ) ;
define'SQL_PASSWORD''' ) ;


/** Logik */
try {

    
/** Variablen ermitteln */
    
$method $_GET ;
    
$username = isset( $method'username' ] ) ? $method'username' ] : null ;
    
$password = isset( $method'password' ] ) ? $method'password' ] : null ;

    
/** Prüfen ob die Variablen gesetzt wurden */
    
if( $username === null || $password === null ) {
        throw new 
Exception'Benutzername und Kennwort müssen übergeben werden.' ) ;
    }

    
/** Werte der Variablen validieren */
    
if( ! ctype_alnum$username ) || ! ctype_alnum$password ) ) {
        throw new 
Exception'Benutzername und Kennwort müssen alphanumerisch sein.' ) ;
    }

    
/** Datenbankverbindung herstellen */
    
$pdo = new PDOSQL_DATASOURCESQL_USERNAMESQL_PASSWORD ) ;
    
$pdo->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION ) ;

    
/** SQL-Statement vorbereiten */
    
$sql 'SELECT username, password FROM users WHERE username = ? LIMIT 1' ;
    
$stm $pdo->prepare$sql ) ;

    
/** SQL-Statement ausführen */
    
$stm->execute( [ $username ] ) ;
    
$res $stm->fetchPDO::FETCH_ASSOC ) ;

    
/** Authentifizierung prüfen */
    
$auth $res && hash'sha256'$password ) === $res'password' ] ;
    if( 
$auth ) {
        echo 
'Willkommen ' $username ;
    } else {
        echo 
'Anmeldung für ' $username ' fehlgeschlagen.' ;
    }

} catch( 
Exception $e ) {
    echo 
'Fehler: ' $e->getMessage( ) ;

Viele Grüße,
lotti
__________________
Empfehlenswerte Links:
jsFiddle | JavaScript Patterns | RedBeanPHP | Mozilla Developer Network -/- W3C Validator | JSLint
Mit Zitat antworten
  #8 (permalink)  
Alt 28.08.2013, 02:20
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 17.08.2013
Beiträge: 242
mymaksimus befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von lottikarotti Beitrag anzeigen
Hallo,
Dies verschlechtert allerdings nicht nur die Lesbarkeit des Codes, sondern stellt auch noch ein Sicherheitsrisiko dar.
In diesem fall wird die lesbarkeit eher nicht beintraechtigt, das ist an der stelle eher geschmackssache. Ich finde zum beispiel das man bei der direkten benutzung der post variable sofort erkennen kann worum es sich handelt, und das so lesbarer ist. Und das ganze erhoeht definitv nicht das sucherheits risiko, denn wenn man die variablen vorher prueft kommt es aufs selbe hinaus.
Mit Zitat antworten
  #9 (permalink)  
Alt 28.08.2013, 10:58
Benutzerbild von lottikarotti
Ein ♥ für's Web
XHTMLforum-Mitglied
 
Registriert seit: 18.04.2012
Ort: Karlsruhe
Beiträge: 396
lottikarotti wird schon bald berühmt werden
Standard

Morgen,

Zitat:
Zitat von mymaksimus Beitrag anzeigen
In diesem fall wird die lesbarkeit eher nicht beintraechtigt, das ist an der stelle eher geschmackssache. Ich finde zum beispiel das man bei der direkten benutzung der post variable sofort erkennen kann worum es sich handelt, und das so lesbarer ist.
Das mag in diesem Fall so sein, da es sich nur um eine Variable handelt - nämlich dem Benutzername. Wenn man es sich aber angewöhnt, $_POST oder $_GET Variablen immer direkt zu verwenden, wird das bei komplexeren Problemstellungen schnell unübersichtlich. Gerade im Hinblick auf die Validierung geht da in der Eile schnell mal etwas unter. Das verursacht nicht nur minderwertigen Code, sondern fördert auch Sicherheitsrisiken.

Zitat:
Zitat von mymaksimus Beitrag anzeigen
Und das ganze erhoeht definitv nicht das sucherheits risiko, denn wenn man die variablen vorher prueft kommt es aufs selbe hinaus.
Sicherheitsrisiken gibt es natürlich nicht, wenn der Entwickler keine Fehler macht. Davon sollte man aber nicht pauschal ausgehen. Schnell ist ein SQL-Statement mal um einen Parameter erweitert und in der Eile hat man die Validierung komplett vergessen - mögliche SQL-Injections sind die Folge. Deshalb sollte man bei Daten die von extern kommen immer einen festen Ablauf einhalten:

- Variablen auf Existenz/ prüfen und extrahieren
- Variablen validieren

Wenn man diesen Ablauf befolgt kann man sich später relativ sicher sein, dass die Variable "$username" sauber ist. Bei einem $_POST['username'] im Code muss ich - wenn ich zwei Wochen später in den Code schaue - mir erstmal die Frage stellen: habe ich die auch validiert?

Wie ein Entwickler die Dinge letztlich löst bleibt allerdings seine eigene Entscheidung. Wer vorsichtig ist, der kriegt's auch anders hin. Ich bevorzuge klare Strukturen im Code, da sich weitere Team-Mitglieder dann besser und schneller in meinem Code zurechtfinden.

Viele Grüße,
lotti
__________________
Empfehlenswerte Links:
jsFiddle | JavaScript Patterns | RedBeanPHP | Mozilla Developer Network -/- W3C Validator | JSLint

Geändert von lottikarotti (28.08.2013 um 11:00 Uhr)
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 28.08.2013, 12:32
?!?
XHTMLforum-Kenner
 
Registriert seit: 20.03.2013
Beiträge: 1.638
explanator sorgt für eine eindrucksvolle Atmosphäreexplanator sorgt für eine eindrucksvolle Atmosphäre
Standard

Um SQL-Injections zu verhindern sollte der Contextwechsel beachtet werden und mysql_real_escape_string() angewendet werden.

Weiteres dazu findet sich im Handbuch :>PHP: SQL Injection - Manual

Das Umkopieren der übergebenen Variablen wird zwar oft gesehen, ist aber eigentlich nicht notwendig. Eine Variable bleibt eine Variable auch wenn sie durch umkopieren anders benannt wird.

Es bleibt dem Programmierer überlassen ob er das macht oder nicht, es ging hier lediglich um die Notwendigkeit und die ist nicht gegeben.

Das man SQL-Abfragen, auch wenn sie kurz sind, nicht in einer Zeile stehen lässt hat nichts mit der Übersichtlichkeit zu tun, sondern vielmehr damit, dass bei einem Fehler einem dann die Zeile angezeigt wird in der der Fehler auftrat.
Je weniger man splittet, desto mehr muss man selber suchen.

Prepared Statesment sind nicht der Weisheit letzter Schluss, sie können um einiges langsamer sein und vermeiden SQL-Injections nicht.
In diesem gezeigten Fall, Abfrage der Useremail in Verbindung mit Passwort sind sie sogar kontraproduktiv, das sie das Caching des Abfragestrings auf Datenbankseite verhindern.
Siehe dazu das Mysql-Handbuch.unter MySQL :: MySQL 5.1 Referenzhandbuch :: 5.14 MySQL-Anfragen-Cache
__________________
"Wieso ist der Code schrott, ich dachte hier seien Profis..."
Aus einem Forum.
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nach 'Zurück'-Ereignis ist Formular leer Kaimane (X)HTML 1 18.01.2008 09:29


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:48 Uhr.