我遇到了问题。我将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 ,为什么?
答案 0 :(得分:3)
您必须验证用户拥有故障单的服务器端,例如使用SQL查询:
"SELECT * FROM ticket_user WHERE user_id = :user_id AND ticket_id = :ticket_id"
如果它返回一行,那么你可以处理更新,否则抛出一个错误。
除此之外,您还可以加密/解密ticket_id。
答案 1 :(得分:2)
<?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。
这是你应该做的:
希望这有帮助。