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

时间:2016-09-07 08:09:02

标签: php forms redirect

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

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

4 个答案:

答案 0 :(得分:1)

修订回答:

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

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

选项1:使用HTTPS / SSL

如果您使用SSL加密通信(“https://”而非“http://”),所有数据(甚至查询字符串)都将被加密并发送到服务器,因此无需手动加密参数。仍有方法可以拦截数据(中间人攻击或伪造的SSL证书),但这是一种非常安全的数据传输方式。 在您的服务器上需要SSL证书(可以自签名或由所谓的“CA权威机构”购买)。如果您使用的是Linux和Apache,here's an article explaining itthis one会解释它适用于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">

接收者(位于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加密方法对数据进行编码和解码。通过这种方式,您可以以加密形式发送数据,另一方面,您必须解密数据。

看看http://php.net/manual/en/function.mcrypt-encrypt.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