Dollar ($) sign in password string treated as vari

2019-01-03 06:46发布

Spent some time troubleshooting a problem whereby a PHP/MySQL web application was having problems connecting to the database. The database could be accessed from the shell and phpMyAdmin with the exact same credentials and it didn't make sense.

Turns out the password had a $ sign in it:

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

The password being sent was "mypas" which is obviously wrong.

What's the best way to handle this problem? I escaped the $ with a \

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

and it worked.

I generally use $string = 'test' for strings which is probably how I avoided running into this before.

Is this correct behavior? What if this password was stored in a database and PHP pulled it out - would this same problem occur? What am I missing here...

8条回答
SAY GOODBYE
2楼-- · 2019-01-03 07:05

Strings quotes with the double quotation are interpreted for variables. Single quoted strings are interpreted literally.

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

This should yield:

one
$a
查看更多
爷的心禁止访问
3楼-- · 2019-01-03 07:08

PHP is interpolating the variable $word into the string mypas$word, as is normal behaviour for string literals delineated with double quotes. Since $word is presumably undefined, the resulting interpolated string is mypas.

The solution is to use single quotes. Single-quoted string literals do not undergo variable interpolation.

查看更多
再贱就再见
4楼-- · 2019-01-03 07:10

The other answers all work until there are single quotes embedded in the passsword.

Fail:

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

Alternatives:

If you don't have other escaped characters, you can escape the $ with \$, e.g.

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

Or it may be simpler to escape the single quote e.g.

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

查看更多
对你真心纯属浪费
5楼-- · 2019-01-03 07:12
$_DB['password'] = 'mypas$word';

Single quote strings are not processed and are taken "as-is". You should always use single quote strings unless you specifically need the $variable or escape sequences (\n, \r, etc) substitutions. It's faster and less error prone.

查看更多
兄弟一词,经得起流年.
6楼-- · 2019-01-03 07:25

Just put it in a single-quoted string:

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

The double-quoted string will interpolate variables, but single-quoted strings won't. So that will solve your problem.

查看更多
Animai°情兽
7楼-- · 2019-01-03 07:26

Just use single quotes ' instead of " and it will not try and treat $word as a variable.

$_DB['password'] = 'mypas$word';
查看更多
登录 后发表回答