【问题标题】:Send form data without hidden inputs [closed]发送没有隐藏输入的表单数据[关闭]
【发布时间】:2014-01-06 18:36:15
【问题描述】:

到目前为止,我一直在使用以下方法将表单数据发送到 PHP 文件(通过 Ajax)。这样做的问题是,仍然可以在源代码中查看“隐藏”输入以显示我不希望用户看到的数据:

HTML:

<form>
    <input name="user_field">
    <input name="user_id_field" hidden>
    <button type="submit">Submit</button>
</form>

JQuery/Ajax:

$(document).ready(function() {
    $(document).on("submit", "form", function(event) {
        event.preventDefault();
        $.ajax({
            url: 'php/verification.php',
            type: 'POST',
            dataType: 'json',
            data: $(this).serialize(),
            success: function(data) {
                alert(data);
            }
        });
    });
});

PHP:

<?php
    $user = $_POST['user_field'];
    $user_id = $_POST['user_id_field'];

    // verification code and echo back to document
?>

我的问题是,大多数网站如何在不使用隐藏输入的情况下发送表单数据?我听说使用会话有效,但我不确定如何。

谢谢。

【问题讨论】:

  • 如果数据以任何方式发送到服务器,则可以更改。了解会议:php.net/manual/en/book.session.php
  • 客户端不应该提供敏感数据
  • 我同意 AWOlff 的观点,你永远不应该向客户端发送敏感数据,因为它可以被查看和操作。如果您无法使用会话(例如,因为您需要一些 简单 负载平衡),那么您可以尝试(但如果可能的话我会避免)加密该数据。
  • @A.Wolff 这就是我问这个问题的原因......
  • @Bagwell 让我之前的评论更清楚,明智的数据永远不会发送到服务器,因为它永远不可用客户端

标签: javascript php jquery html session


【解决方案1】:

在用户首次登录时,为剩余的会话建立会话和用户 ID:

router.php

   session_start();
   /* once user has authenticated */
   $_SESSION['user_id_field'] = $userid;

subsequentpages.php

   session_start();
   /* assign user id to local variable */
   $userid = $_SESSION['user_id_field'];
   ... do your stuff

每个页面都实例化一个会话并分配一个仅对该页面可用的局部变量。

【讨论】:

  • 而且这些是隐藏的,用户无法编辑?
  • 这不是不可能,但不太可能。恶意脚本可能会尝试捕获会话 ID,然后修改数据。但就表单而言,用户 ID 不会出现在脚本输出中的任何位置(除非您打印它)。
  • 会话是服务器端分配的值,无法以任何方式查看除非您专门在 PHP 中回显这些值。或者,用户实际上已经侵入了服务器。除此之外,使用会话是安全的,但 cookie 不完全是 different animal。 @巴格韦尔
【解决方案2】:

AFAIK 这是不可能的,因为用户可以访问任何发送到浏览器的数据。做你想做的事情的唯一方法是加密数据。

这是我为此使用的代码:

define('CRYPT_KEY', 'some_secret_key');

function dataEncrypt($data) {
    $crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, CRYPT_KEY, $data, 'ecb');
    $base64 = base64_encode($crypt);
    return $base64;
}

function dataDecrypt($data) {
    $crypt = base64_decode($data);
    $str = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, CRYPT_KEY, $crypt, 'ecb'), "\0\4");
    return $str;
}

CRYPT_KEY 是你自己的随机字符串

更新:

要使用mcrypt_encryptmcrypt_decrypt,您应该安装一个包php5-mcrypt。在类似 Ubuntu 的系统上,可以通过以下命令完成:

sudo apt-get install php5-mcrypt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多