wake-up-neo.com

Dollar ($) Anmelden Kennwortstring als Variable behandelt

Wir haben einige Zeit damit verbracht, ein Problem zu beheben, bei dem eine PHP/MySQL-Webanwendung Probleme beim Herstellen der Verbindung zur Datenbank hatte. Auf die Datenbank konnte von der Shell und von phpMyAdmin mit genau denselben Anmeldeinformationen zugegriffen werden, was keinen Sinn machte.

Es stellte sich heraus, dass das Passwort ein $ -Zeichen enthielt:

$_DB["password"] = "mypas$Word";

Das gesendete Passwort war "mypas", was offensichtlich falsch ist.

Wie gehe ich am besten mit diesem Problem um? Ich bin dem $ mit einem\entkommen

$_DB["password"] = "mypas\$Word";

und es hat funktioniert.

Im Allgemeinen verwende ich $string = 'test' für Zeichenfolgen. Dies ist wahrscheinlich der Weg, auf den ich zuvor verzichtet habe. 

Ist das korrektes Verhalten? Was wäre, wenn dieses Passwort in einer Datenbank gespeichert wäre und PHP es herausgezogen hätte - würde dasselbe Problem auftreten? Was fehlt mir hier ...

40
ncatnow
$_DB['password'] = 'mypas$Word';

Einfache Anführungszeichenfolgen werden nicht verarbeitet und "wie besehen" übernommen. Verwenden Sie immer einfache Anführungszeichenfolgen, es sei denn, Sie benötigen ausdrücklich die Ersetzung von $ -Variablen oder Escape-Sequenzen (\ n,\r usw.). Es ist schneller und weniger fehleranfällig.

85
Andreas Bonini

PHP interpoliert die Variable $Word in den String mypas$Word, wie es für String-Literale normal ist, die mit doppelten Anführungszeichen gekennzeichnet sind. Da $Word vermutlich undefiniert ist, ist die resultierende interpolierte Zeichenfolge mypas.

Die Lösung besteht in der Verwendung von einfachen Anführungszeichen. String-Literale in einfachen Anführungszeichen werden nicht variabel interpoliert.

10
Benji XVI

Die anderen Antworten funktionieren alle, bis einzelne Anführungszeichen in das Passwort eingefügt sind.

Scheitern:

$_DB['password'] = 'my'pas$Word';

Alternativen:

Wenn Sie keine anderen Escape-Zeichen haben, können Sie das $ mit \$, z. 

$_DB['password'] = "my'pas\$Word";

Oder es kann einfacher sein, das einfache Anführungszeichen zu umgehen, z.

$_DB['password'] = 'my\'pas$Word';

6
brianlmerritt

Fügen Sie es einfach in einen String mit einfachen Anführungszeichen ein:

$_DB['password'] = 'mypas$Word';

Die doppelte Anführungszeichenfolge interpoliert Variablen, bei einfachen Anführungszeichen jedoch nicht. Das löst also dein Problem.

3
Ray Hidayat

verwenden Sie einfache Anführungszeichen

$_DB["password"] = 'mypas$Word';
3
ghostdog74

Verwenden Sie einfach einfache Anführungszeichen anstelle von "und es wird nicht versucht, $ Word als Variable zu behandeln.

$_DB['password'] = 'mypas$Word';
2
Jeff Beck

Anführungszeichen in doppelte Anführungszeichen werden für Variablen interpretiert. Einzelne Anführungszeichen werden wörtlich interpretiert.

$a = "one";
$b = "$a";
echo $b . "\n";
$b = '$a';
echo $b . "\n";

Dies sollte ergeben:

one
$a
2
Brian Riehman

Ich bin gerade auf dieses Problem gestoßen und habe es behoben, bevor ich diesen Thread gefunden habe. Ich bin sicher, dass alle Lösungen mit einfachen Anführungszeichen perfekt funktionieren. Ich entschied mich dafür, nur den Pass zu verketten, was auch gut funktioniert, da mir die Lösung für ein einziges Zitat nicht bekannt war ... IE 

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
1
blink