我找到了解决我的问题的方法,并与大家分享。这个解决方案分为以下4个步骤。
第一步:
对于加密和解密,我在我的functions.php
文件中使用以下函数。
function Encryptstr($password, $data)
{
$salt = substr(md5(mt_rand(), true), 8);
$key = md5($password . $salt, true);
$iv = md5($key . $password . $salt, true);
$ct = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode('Salted__' . $salt . $ct);
}
function Decryptstr($password, $data)
{
$data = base64_decode($data);
$salt = substr($data, 8, 8);
$ct = substr($data, 16);
$key = md5($password . $salt, true);
$iv = md5($key . $password . $salt, true);
$pt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ct, MCRYPT_MODE_CBC, $iv);
return $pt;
}
我被告知无法直接在表单的action
路径上执行加密函数,因此我正在使用另一种方法。我将表单重定向到一个页面,在该页面上对表单字段进行加密。
步骤2:
首先构建一个简单的表单,如下所示,在表单的操作中,我已经给出了我将执行加密的页面路径。
<form action="http://localhost:85/xyz/" method="POST"> //In action I am giving path to the page in which I will perform encryption
<input type="text" name="fname" placeholder="First Name">
<input type="submit" value="Login">
</form>
步骤三:在表单重定向到此页面后,我将表单字段的数据存储在一个变量中,并按以下方式进行加密。
$name = $_POST['fname'];
$encrypt = Encryptstr('myPass123', $name);
在加密表单数据并将其存储在变量($encrypt)中后,我创建了另一个表单,其中包含隐藏字段。但是,在此表单中,我使用的是GET
方法而不是POST
。
<form action="http://localhost:85/abc/" method="GET">
First name:<br>
<input type="hidden" name="fname" value="<?php echo $encrypt; ?>">
<input type="submit" value="Login">
</form>
在表单的隐藏字段的值字段中,我使用了 $encrypt 变量,其中存储了之前加密的表单数据。我将其放在
value
选项中,这样我们就不需要再次输入值。
点击提交按钮后,表单将向我指定的页面发送数据(在表单的 action 中指定)。
因此,这些数据将通过 URL 传输,类似于这样:
http://localhost:85/abc/?fname=sdfhf3jh4jhdfjsdffsf
正如您所看到的,如果我没有进行加密,fname字段将被加密,否则输出结果将会是这样的。
http://localhost:85/abc/?fname=Entered_value_by_user
步骤4:
因此,在上一个步骤中,我只需要从 URL 中提取数据,为此我使用了 GET
方法,就像这样。 这是加密数据重定向的页面。
if(isset($_GET['fname'])) //Getting the value of fname field from url via GET method
{
$entry = $_GET['fname']; // Storing value in a variable
//Decripting value using Decryptstr function where 'myPass123' is the key that we used to encrypt and same key needed to decrypt
echo 'Result: '.Decryptstr('myPass123', $entry);
}
参考:http://heiswayi.github.io/php-encryption-decryption-and-password-hashing.html
注意:这种方法非常有效,但我不知道它提供了什么级别的安全性。我有两个加密选项,第一个是使用 ECB
,第二个是使用 CBC
。所以我在谷歌上搜索了一下,想找出哪个更安全。于是我找到了一篇好文章详细描述了 ECB vs CBC
。阅读完文章后,我发现cbc
更安全。这就是为什么我使用CBC
。
http://localhost:85/abc/?<?php echo $_GET['name'] ?>
。所以我只想用url发送名称字段。比如,如果在表单中输入了名称Rishabh
,那么重定向的url将会是这样的http://localhost:85/abc/?Rishabh (但名称是加密的)
。我已经展示了我在解决这个问题方面的搜索进展,除此之外,我还尝试使用隐藏字段,但对我也没有帮助。暂时不考虑加密,如果我在表单中使用POST
方法,我甚至无法以非加密形式发送数据。 - Rishabh