PHP安全sha2:&$salt=null?

PHP安全sha2:&$salt=null?,php,security,function,sha2,Php,Security,Function,Sha2,我现在在网上搜索并寻求帮助后创建了一个sha2登录表单,我发现下面这个链接中的示例代码非常有用和实用(我希望我是对的!?),我唯一不了解的是这个程序员编写函数的方式以及从函数中获取salt值的方式 当然这个函数会失败,在$salt之前加一个“&”是为了什么?有必要像这样使用null吗&$salt=null?如果我放“&$salt”怎么办 然后,为了得到salt值,您可以直接得到它并将其放入sql查询中,如下所示 $username = cleanMe($_POST('username'));

我现在在网上搜索并寻求帮助后创建了一个sha2登录表单,我发现下面这个链接中的示例代码非常有用和实用(我希望我是对的!?),我唯一不了解的是这个程序员编写函数的方式以及从函数中获取salt值的方式

当然这个函数会失败,在$salt之前加一个“&”是为了什么?有必要像这样使用null吗&$salt=null?如果我放“&$salt”怎么办

然后,为了得到salt值,您可以直接得到它并将其放入sql查询中,如下所示

$username = cleanMe($_POST('username'));
$password = cleanMe($_POST('password'));
$salt = '';
$hashed_password = HashMe($password, $salt);
$sqlquery = 'INSERT INTO  `usertable` ("username", "password", "salt") VALUES  ("'.$username.'", "'.$hashed_password .'", "'.$salt.'") WHERE 1';
..
在准备sql查询之前,如何从下面这样的函数中获取salt值

$salt = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";
那么

我不喜欢/不想在我的sql查询中使用-“'”的原因是我有时使用null值,比如$firstname='null';如果firstname为空/null,我希望行将空字段“勾选”为null

此外,在我的sql查询中有“'”,这让我在出错时感到头晕目眩,难以调试

对不起,我在这个帖子里有很多问题


谢谢。

让我们看看我能否一次回答一个问题

首先,您询问为什么
函数HashMe($phrase,$salt)
失败,而
函数HashMe($phrase,&$salt=null)
没有失败。在解释了第二部分和第三部分之后,这一点将变得清晰

其次,您询问了为什么在函数声明中需要&before
$salt
。&的意思是通过引用传递值。通常,当您将值传递给函数时,会创建该值的副本,然后处理该副本。例如:

function addOne($number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;
$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"
此代码将输出
3
,而不是
4
。这是因为函数不更改$myNumber,而是创建一个副本并更改该副本。当您通过引用传递时,您告诉它使用原始编号,而不是创建副本。因此,如果我们做出这一微小的改变:

function addOne(&$number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;
现在我们的代码输出
4
。函数通过引用传递$salt,因为它更改了$salt的值。因此,在函数运行后,您现在拥有$salt的新值

至于您为什么需要
&$salt=null
,如果您不自己声明变量,那么这就是自动声明变量。因此,如果您只想生成一个随机散列(由于您不知道使用了什么salt,因此无法重新创建它),您可以使用
HashMe(“消息到散列”)调用该函数
=null
表示如果没有第二个参数,则自动将第二个参数设置为“null”。但是,在代码的后面,它表示如果第二个参数为“null”,则生成一个随机salt:

if ($salt == '')
{
    $salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}
因此,如果以这种方式调用函数,将创建一个可能永远无法复制的哈希

对于第四个问题,您希望获得用于SQL查询的$salt值。这就是通过引用传递的美妙之处。由于变量$salt是通过引用传递的,因此在函数运行后,您可以再次使用$salt,它将具有新值。需要注意的一件重要事情是,更改$salt的所有函数都是确保其长度为15个字符。任何较长的都将被截断,但任何较短的都将保持不变。因此,如果您存储函数返回的(15个字符)salt,您可以在将来使用它,并且它不会再次更改salt。因此,您的SQL查询应该可以完美地工作

$sqlquery = "INSERT INTO  `usertable` ('username', 'password', 'salt') VALUES  ($username, $hashed_password, $salt) WHERE 1";
注意,我交换了原始查询中的双引号和单引号。这是因为在某些版本的PHP中,变量不会用单引号进行解析。例如:

function addOne($number){
    $number = $number + 1;
}

$myNumber = 3;
addOne($myNumber);
echo $myNumber;
$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"

非常感谢你详细地解释了这一点!谢谢现在我明白了原来的代码!:-)
$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"