我想通过网址将表单数据以加密形式发送到另一个域
<form action="http://localhost:85/abc/?<?php echo $_POST['name'] ?>" method="POST">
First name:<br>
<input type="text" name="name" placeholder="name">
<input type="submit" value="Submit">
</form>
在寻找解决方案时,我找到了不同的方法,但它们都不适合我。 对于例如我发现如果我在表单中使用GET方法,那么我可以发送这样的数据
<form action="http://localhost:85/abc/?<?php echo $_GET['name'] ?>" method="GET">
它的工作但是这个解决方案的问题是它不以加密形式发送数据+我无法将我的表单方法从POST
更改为GET
因为from是由插件创建的caldera forms
。
我只能在其中更改表单操作。
根据另一种解决方案,我尝试使用这样的动作
<form action="http://localhost:85/abc/?<?php echo $_REQUEST['name'] ?>" method="POST">
但这对我也没有用。任何建议我还可以尝试。现在我通过创建一个不是插件的小表单在localhost中测试它。
答案 0 :(得分:1)
修订回答:
如果你加密你的参数,如果你把它作为GET或POST参数传递是无关紧要的,虽然我建议通过POST传递所有与安全相关的信息,而不是将其作为查询字符串的一部分发送(这是在您的网址中的问号后面,即Rishabh
中的http://localhost:85/abc/?Rishabh
,因为查询字符串将在浏览器历史记录和网络服务器日志中显示,如here所述。
无论如何,这里至少有两个选项:
如果您使用SSL加密通信(“https://”而非“http://”),所有数据(甚至查询字符串)都将被加密并发送到服务器,因此无需手动加密参数。仍有方法可以拦截数据(中间人攻击或伪造的SSL证书),但这是一种非常安全的数据传输方式。 在您的服务器上需要SSL证书(可以自签名或由所谓的“CA权威机构”购买)。如果您使用的是Linux和Apache,here's an article explaining it,this one会解释它适用于Windows和Apache
<强>发件人:强>
function doEncrypt($encrypt)
{
$crypt_key= '%{is}§a/G00d+kEy.F0r#3ncRypT!0n';
$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$crypted= mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $crypt_key, $encrypt, MCRYPT_MODE_ECB, $iv);
$encode= base64_encode($crypted);
return $encode;
}
$name= 'Rishabh';
$encoded= doEncrypt($name);
?>
<form action="http://localhost:85/abc/?<?php echo $encoded; ?>" method="GET">
接收者(位于abc
目录内):
function doDecrypt($decrypt)
{
$crypt_key='%{is}§a/G00d+kEy.F0r#3ncRypT!0n';
$decoded= base64_decode($decrypt);
$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $crypt_key, $decoded, MCRYPT_MODE_ECB, $iv);
return str_replace("\\0", '', $decrypted);
}
$name= doDecrypt($_REQUEST['QUERY_STRING']);
以下是一个包含上述功能的工作示例:phpFiddle。
这里有关于通过curl传输表单数据的more info,可以使用PHP的mcrypt
扩展以安全的方式完成编码和解码。
您的代码的另一个评论和解释:
<form action="http://localhost:85/abc/?<?php echo $_POST['name'] ?>" method="POST">
将输出先前作为表单提交的一部分发布的变量
name
,该参数将作为表单请求的GET- / Query字符串的一部分发送,表单中的所有其他元素将作为表格提交的一部分发送。
<form action="http://localhost:85/abc/?<?php echo $_GET['name'] ?>" method="GET">
将输出已作为GET- /查询字符串参数传递的变量
name
,同样它将成为表单请求的Query字符串的一部分。所有其他表单元素将作为查询字符串的一部分发送,而不是作为表单提交发送。
<form action="http://localhost:85/abc/?<?php echo $_REQUEST['name'] ?>" method="POST">
将输出参数
name
,该参数已通过表单提交或作为查询字符串的一部分发布,它也将是表单请求的查询字符串的一部分。所有其他表单元素将作为POST /表单数据的一部分发送,与示例1中的相同。
答案 1 :(得分:0)
你不能首先在javascript上触发一个事件来加密你的数据,或者你可以只提交到另一个php文件,然后从那里加密并发送。
答案 2 :(得分:0)
您必须使用php加密方法对数据进行编码和解码。通过这种方式,您可以以加密形式发送数据,另一方面,您必须解密数据。
答案 3 :(得分:0)
我找到了解决问题的方法并与大家分享。该解决方案分为以下4个步骤。
第1步:
对于加密和解密,我在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>
第3步: 在表单重定向到此页面后,我将表单字段的数据存储在变量中并按如下方式对其进行加密
$name = $_POST['fname']; //fname is the name of the form control (Text Box)
// Performing encryption on it like this
$encrypt = Encryptstr('myPass123', $name); // Here "myPass123" is the key that will be use to encrypt and decrypt and "Encryptstr" Is function that I have put in functions.php as shown above.
在加密表单数据并将其存储在变量($ 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 varible,其中我之前已经存储了加密形式的数据。我把它放在value
选项中,这样我们就不需要再次输入值了。
点击“提交”按钮表单后,会将数据发送到我提到的页面(在表格中提到)。
所以这些数据会通过网址传输
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
进行第二次加密。所以我在谷歌上搜索了一下哪个更安全。所以我找到了一个good article来详细描述ECB vs CBC
。在阅读article后,我发现cbc
更安全。这就是为什么我使用CBC
。