美元($)登录密码字符串作为变量处理

nca*_*now 43 php string variables escaping

花了一些时间来解决PHP/MySQL Web应用程序连接到数据库时遇到问题的问题.可以从shell和phpMyAdmin访问数据库,使用完全相同的凭据,这是没有意义的.

原来密码有一个$符号:

$_DB["password"] = "mypas$word";
Run Code Online (Sandbox Code Playgroud)

发送的密码是"mypas",这显然是错误的.

处理这个问题的最佳方法是什么?我用一个\逃过了$

$_DB["password"] = "mypas\$word";
Run Code Online (Sandbox Code Playgroud)

它起作用了.

我通常使用$string = 'test'字符串,这可能是我之前避免遇到的问题.

这是正确的行为吗?如果这个密码存储在数据库中并且PHP将其删除 - 会出现同样的问题吗?我在这里想念的是什么......

Tho*_*ini 94

$_DB['password'] = 'mypas$word';
Run Code Online (Sandbox Code Playgroud)

单引号字符串不会被处理,而是"按原样"处理.除非特别需要$ variable或转义序列(\n,\ r \n等)替换,否则应始终使用单引号字符串.它更快,更不容易出错.


Ben*_*XVI 10

PHP将变量$word插入到字符串中mypas$word,这是用双引号描述的字符串文字的正常行为.因为$word可能是未定义的,所以得到的插值字符串是mypas.

解决方案是使用单引号.单引号字符串文字不进行变量插值.


bri*_*itt 7

另一个回答所有工作,直到密码中嵌入单引号.

失败:

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

备择方案:

如果你没有其他转义字符,你可以逃避$ \$,例如

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

或者逃避单引号可能更简单,例如

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