繁体   English   中英

将表单数据以加密形式重定向到另一个域

[英]Redirect form data in encrypted form to another domain

我想通过url将表单数据以加密形式发送到另一个域

<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中测试它。

修改回答:

如果你加密你的参数,如果你把它作为GET或POST参数传递是无关紧要的,虽然我建议通过POST传递所有与安全相关的信息,而不是将其作为查询字符串的一部分发送(这是后面的部分)在您的网址,即问号Rishabhhttp://localhost:85/abc/?Rishabh ),因为查询字符串将在浏览器历史记录和网络服务器日志是可见的讨论在这里

无论如何,这里至少有两个选项:

选项1:使用HTTPS / SSL

如果您使用SSL加密通信(“https://”而不是“http://”),则所有数据(甚至查询字符串)都将被加密并发送到服务器,因此无需加密参数手动。 仍有方法可以拦截数据(中间人攻击或伪造的SSL证书),但这是一种非常安全的数据传输方式。 需要一个SSL证书(可以在您的服务器上自签名或由所谓的“CA权威机构购买)。如果您使用的是Linux和Apache, 这里有一篇解释它的文章这个解释了它适用于Windows和Apache。

选项2:手动处理加密和解密

发件人:

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">

Receiver(位于您的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传输表单数据的更多信息 ,编码和解码可以使用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 ,同样它将成为表单请求的查询字符串的一部分。 所有其他表单元素将作为查询字符串的一部分发送,而不是作为表单提交发送。

<form action="http://localhost:85/abc/?<?php echo $_REQUEST['name'] ?>" method="POST">

将输出一个参数name ,该name已通过表单提交或作为查询字符串的一部分发布,它也将是表单请求的查询字符串的一部分。 所有其他表单元素将作为POST /表单数据的一部分发送,与示例1中的相同。

你不能首先在javascript上触发事件来加密你的数据,或者你可以只提交到另一个php文件,然后从那里你可以加密和发送。

您必须使用php加密方法来编码和解码数据。 通过这种方式,您可以以加密形式发送数据,另一方面,您必须解密数据。

看看http://php.net/manual/en/function.mcrypt-encrypt.php

我找到了解决问题的方法并与大家分享。 该解决方案按以下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>

在form的隐藏字段的值字段中,我使用了$ encrypt varible,其中我之前已经存储了加密形式的数据。 我把它放在value选项中,这样我们就不需要再次输入值了。 点击“提交”按钮表单后,会将数据发送到我提到的页面(表格中提到)。

所以这些数据将通过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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM