如何在没有表单字段的情况下从表单传递数据? (PHP)

Posted

技术标签:

【中文标题】如何在没有表单字段的情况下从表单传递数据? (PHP)【英文标题】:How to pass data from form without a form field? (PHP) 【发布时间】:2011-08-11 12:08:20 【问题描述】:

我有一个用于编辑用户名和电子邮件的表单。 因此,当它更新名称和电子邮件时,它需要用户名来确定它应该更新哪一行。

所以我想知道是否有任何元素与表单一起传递但没有显示值或在输入标签中可编辑。

所以我从一个脚本中获取用户名。 编辑用户脚本使用指定的用户名从数据库中获取名称和电子邮件。 然后它将新名称和带有用户名的电子邮件传递给另一个更新它的脚本。

【问题讨论】:

【参考方案1】:

如果您想安全使用它,请使用它:

<input type='hidden' name='username' value='<?php echo encode("Please Encode Me!","This is a key"); ?>' />

这将导致:

<input type='hidden' name='username' value='p3e4e4241674d2r4m4i5o464a4f2p3k5c2' />

在修改脚本中你必须使用:

<?php $username = decode("p3e4e4241674d2r4m4i5o464a4f2p3k5c2","This is a key"); ?>

下面是 ENCODE/DECODE 的 PHP 函数:

<?php

function encode($string,$key) 
    $key = sha1($key);
    $strLen = strlen($string);
    $keyLen = strlen($key);
    for ($i = 0; $i < $strLen; $i++) 
        $ordStr = ord(substr($string,$i,1));
        if ($j == $keyLen)  $j = 0; 
        $ordKey = ord(substr($key,$j,1));
        $j++;
        $hash .= strrev(base_convert(dechex($ordStr + $ordKey),16,36));
    
    return $hash;


function decode($string,$key) 
    $key = sha1($key);
    $strLen = strlen($string);
    $keyLen = strlen($key);
    for ($i = 0; $i < $strLen; $i+=2) 
        $ordStr = hexdec(base_convert(strrev(substr($string,$i,2)),36,16));
        if ($j == $keyLen)  $j = 0; 
        $ordKey = ord(substr($key,$j,1));
        $j++;
        $hash .= chr($ordStr - $ordKey);
    
    return $hash;


?>

【讨论】:

【参考方案2】:

相信您正在寻找

 <input type='hidden' name='username' value='theusername' />

hidden - 只能在您的 html 文档的源代码中看到name - 它将在 $_REQUEST/$_POST/$_GET($_POST 或 $_GET 取决于您的状态)中提交您的表单)提交时的变量value - 您希望此表单关联的用户名专业提示:有办法知道谁在尝试更新用户所以你没有未经授权的人更新你的用户信息。有人可以很容易地更改表单中的用户名并尝试更新其他人。

【讨论】:

谢谢,成功了。你的意思是说任何人都可以在发送表格时更改代码并更改其他人的详细信息。那么你能告诉我如何让它更安全吗? @Arjun Bajaj:您目前如何识别/验证您的用户?有很多方法可以使 Web 应用程序更安全。要记住的主要事情是从不隐式信任客户端输入。您需要确保在处理此请求之前对用户进行身份验证,并确保(使用您使用的任何授权机制、任何角色或权限系统)用户有权执行此操作。后者更倾向于业务逻辑,而前者纯粹是身份验证。 这是我找到的一个教程,应该开始给你一个大概的思路:knowledgesutra.com/forums/topic/7887-php-simple-login-tutorial【参考方案3】:

您可以使用隐藏的表单域:

<input type="hidden" name="originalUsername" value="something" />

这不会在浏览器中的表单上呈现,并且可能会被用户忽略和忽视。

但是,请注意此可编辑的。 不要将此作为安全措施。提交表单时,请确保提交表单的用户(使用您现有的任何身份验证和授权机制)有权在将其持久化到数据库之前进行此更改。 任何提交的表单域都可以编辑。

【讨论】:

【参考方案4】:

使用:

 <input type="hidden" />

HIDDENFORMs 的INPUT 元素的TYPE 属性值。它表示在文档中不可见且用户不与之交互的表单域。它可用于传输有关客户端或服务器的状态信息。隐藏字段通常存储默认值(例如通过 php),或者通过 javascript 更改其值。

more here

【讨论】:

【参考方案5】:

Arun,您可以使用 GET 将变量从一个页面传递到另一个页面。只需将 URL 构造为 edituser.php?username=arun 等等。这是将变量或数据(当然除了 cookie 之外)传递到不使用表单标签的其他页面的唯一可能方式。 第二种方法是使用 JavaScript 创建一个隐藏的表单字段并使用用户名进行更新。 第三个是简单地添加隐藏的输入标签。但是这个和后者都需要表单标签。

请注意,过滤用户输入,是 JS、GET 或隐藏字段。

【讨论】:

【参考方案6】:

正如所有其他人所说,您需要一个隐藏的输入。虽然它是可编辑的,但永远不要相信它,因为你永远不会相信来自外部的任何其他数据。

但我想补充一点,最好不要使用用户名来标识行,而是将 ID 列作为主键添加到您的数据库中(可能会自动递增),然后在您的表单中使用它。

类似

<input type="hidden" name="userid" value="<?=$userid?>" />

【讨论】:

【参考方案7】:

使用隐藏的输入标签:

<input type='hidden' name='username' value='theusername' />

【讨论】:

【参考方案8】:

您可以使用隐藏的输入类型

<input type="hidden" name = "username" value="<?php echo $username ?>">

【讨论】:

以上是关于如何在没有表单字段的情况下从表单传递数据? (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用自动模型表单的情况下从 Django 的文本框中获取数据?

在没有表单的情况下从 Django 中的 jQuery 检索 POST 数据

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

在没有打印预览或打开报表的情况下从 Access 中的表单打印报表?

如何在不使用表单的情况下从 Rails 应用程序发布到外部 url