0

使用 phpass 生成哈希,生成以下字符串:

$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi

然后是标准查询:

"INSERT INTO su_auth ( 
                      AuthAlias, AuthUsername, 
                      AuthPass, 
                      AuthSessionID, AuthIP, AuthUserAgent
                    )
                    VALUES ( 
                      'Me', 'Myself',         
                      '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi', 
                       NULL, NULL, NULL
                    )"

当该部分$KHiiru4yzYh141GUh2xIMew被视为空变量并按原样提交(即空值)时,就会出现问题。因此,存储的字符串是:$2a$08//bCc7rxMuY1rtDApwA66/czIiurLi。在作品前放置反斜杠$,但显然不可行。

为什么这会发生在带引号的字符串中?为什么前面$的 ' 不触发相同的反应?我能做些什么来防止它?

4

1 回答 1

1

您看到所见内容的原因是因为您使用双引号字符串进行查询。在 PHP 中,单引号字符串由 PHP 解释。因此,在您的情况下发生的是 PHP 读取查询并看到一个变量$KHiiru4yzYh141GUh2xIMew

这个变量从来没有被明显设置过,因为糟糕会导致通知:

注意:未定义的变量:KHiiru4yzYh141GUh2xIMew in...

并且将导致null(再次因为从未设置变量)。

要了解 PHP 如何读取字符串,请参阅此说明页面

现在回答你的问题,为什么另一个$不被解释为变量。这与 PHP 变量不以数字开头的事实有关。所以 PHP 知道$2永远不可能是一个变量。

PHP 中的有效变量名称如下所示

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

不过,有一种方法可以让变量以 PHP 中的数字开头:${'2a'} = 'foo';

所以你有四种选择来修复你的代码:

使用单引号

'INSERT INTO su_auth ( 
     AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent
 ) VALUES ( 
     \'Me\',
     \'Myself\',                                  
     \'$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi\', 
     NULL, NULL, NULL
 )'

连接

"INSERT INTO su_auth ( 
     AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent
 ) VALUES ( 
     'Me',
     'Myself',                                  
     '". '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi' . "', 
     NULL, NULL, NULL
 )"

冲刺

echo sprintf("INSERT INTO su_auth (AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent) VALUES ('Me', 'Myself', '%s', null, null, null)", '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi');

你为什么在查询中直接使用你的数据???使用带有绑定参数的准备好的语句

$stmt = $connection->prepare('INSERT INTO su_auth (AuthAlias, AuthUsername, AuthPass, AuthSessionID, AuthIP, AuthUserAgent) VALUES (:AuthAlias, :AuthUsername, :AuthPass, :AuthSessionID, :AuthIP, :AuthUserAgent)');
$stmt->execute([
    'AuthAlias'     => 'Me',
    'AuthUsername'  => 'Myself',
    'AuthPass'      => '$2a$08$KHiiru4yzYh141GUh2xIMew//bCc7rxMuY1rtDApwA66/czIiurLi',
    'AuthSessionID' => null,
    'AuthIP'        => null,
    'AuthUserAgent' => null,
]);

选项四将是首选。

于 2014-05-03T13:06:05.737 回答