如何以安全的方式将id存储在隐藏值上

时间:2015-09-16 06:04:25

标签: php html mysql security hash

我遇到了问题。我将id存储在隐藏值中,如

<input id="send" type="submit" value="Save" class="btn btn-success">
<input type="hidden" value="update" name="action">
<input type="hidden" value="$ticket_id" name="ticket_id">

当用户点击 crtl + shift + i 时,他们可以看到代码

<input id="send" type="submit" value="Save" class="btn btn-success">
<input type="hidden" value="update" name="action">
<input type="hidden" value="40" name="ticket_id">

如果他们将 ticket_id 的值更改为其他数字, 这将更新另一个故障单的信息, 但我的系统结构是允许发布票证的人进行更新。

那我怎么解决这个问题呢?请给出一些建议。

更新
我会在更新前检查用户ID,并使用mcrypt_encrypt()mcrypt_decrypt()
这是我目前的代码

$secret_key = "fd4f8dasdjia5s5fd856d2s2";
#Create the initialization vector for added security.#
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
#Encrypt $string#
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret_key, $ticket_id, MCRYPT_MODE_CBC, $iv);
<input type='hidden' value='$encrypted_string' name='ticket_id'>

这是我在客户端看到的

M�l ���e�/^�u�&22�)L�w�X�

这是我解密 ticket_id

时的代码
$secret_key = "fd4f8dasdjia5s5fd856d2s2";
// Create the initialization vector for added security.
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
         $decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret_key, $ticket_id, MCRYPT_MODE_CBC, $iv);
         echo $decrypted_string;die;

但是当我回声 $decrypted_string时,我就明白了     ~~��+A�W� HA%lJYTYY͝j0K1r-RS Z��zE�h�tLQ8�

我没有 40 ,为什么?

6 个答案:

答案 0 :(得分:3)

您必须验证用户拥有故障单的服务器端,例如使用SQL查询:

"SELECT * FROM ticket_user WHERE user_id = :user_id AND ticket_id = :ticket_id"

如果它返回一行,那么你可以处理更新,否则抛出一个错误。

除此之外,您还可以加密/解密ticket_id。

答案 1 :(得分:2)

  1. 使用访问控制和应用程序逻辑。只允许用户访问他们有明确访问权限的资源。
  2. 如果您需要阻止表单属性被篡改,还应包含MAC
  3. <?php
        $id = 40;
        $some_long_secret_key = 
            "\xc4\x28\x06\xca" . "\xaa\x9c\x45\x66" .
            "\x61\xdd\xeb\x40" . "\x13\x59\x86\xb6" .
            "\xbb\xe6\xeb\x13" . "\x56\xdc\x17\x8d" .
            "\x5f\x4e\x3b\x79" . "\x1e\x98\x28\xb3";
    ?>
    <input type="hidden" name="id" value="<?php echo intval($id); ?>" />
    <input type="hidden" name="id_mac" value="<?php 
        echo hash_hmac('sha256', $id, $some_long_secret_key); 
    ?>" />
    

    此外,在实施任何加密建议之前,请先阅读url encryption上的这篇文章。 TL; DR不这样做。

答案 2 :(得分:0)

您可以使用PHP中的各种加密方法来保护您的ID。因此,每次首次将您的id字段转换为加密值。然后传递它来查看或设置为文本字段中的值。

当你拿回那个加密值然后首先解密那个值,这样你就会得到真正的id。

答案 3 :(得分:-1)

你可以在javascript中处理这个问题。你可以将你的对象传递给javascript函数然后利用javascript中的值,并在你的实时环境中部署缩小的javascript文件。

您还可以考虑将此信息存储到会话中。

答案 4 :(得分:-2)

您可以在将值存储在隐藏字段之前加密该值 然后在您想要使用它时解密该值 你可以使用mcrypt_encrypt()和mcrypt_decrypt()看this

答案 5 :(得分:-2)

我不建议在会话变量中存储id。你会遇到其他问题。如果用户在另一个选项卡(选项卡2)中打开另一个故障单并切换回选项卡1并提交表单。您的代码将更新会话中存储的最新票证ID。

这是你应该做的:

  1. 添加限制:允许授权用户访问属于他们的票证。
  2. 加密:使用AES加密并加密您的ticket_id。在提交表单之后,您将能够在呈现和解码之前进行编码。 AES会在每次渲染时更改输出(即使它的ID相同)。这将是一个长期独特的不可预测的字符串。
  3. 希望这有帮助。