【问题标题】:Is there a way to pass the **type** HTML input attribute value to the $_POST array in a HTML/PHP Form?有没有办法将 **type** HTML 输入属性值传递给 HTML/PHP 表单中的 $_POST 数组?
【发布时间】:2021-06-30 01:39:29
【问题描述】:

我们能否以某种方式将type HTML 输入属性值传递给 $_POST 数组,或者用 PHP 以其他方式获取它?

我知道我可以创建一个隐藏字段并将实际输入的类型基本上放入隐藏字段的值中,但这对我来说似乎有点像“重复”工作。

我想创建一个表单,其中输入值提交到 $_POST 并且我可以检测该输入的 type 而无需硬编码/映射每个类型的单个输入。

通过这种方式,我可以检测字段类型并采取行动,而无需创建将我的自定义输入(按名称或 ID)映射到某种类型的“映射”,无论如何我已经以 HTML 形式声明了该类型。

在表单提交中无法检测到输入的 type 似乎是一个真正的缺点 - 或者可能(希望)我错过了什么?

【问题讨论】:

  • 你可以相应地name他们,即name="text_firstname"name="select_language"
  • 这个的用例是什么? <input type="number"><input type="date"> 仍然会发送一个字符串,如果我没记错的话,不是整数/日期
  • 用例只是为了避免必须“知道”程序内部的类型,但下面的答案特别是@syed 的答案让我重新思考,现在我认为“信任”类型输入,因为它可以 A) 只需在浏览器的 HTML 中更改 B) 如果我们知道并采取行动,我们知道我们是安全的,否则我们会面临安全问题

标签: php html forms validation input


【解决方案1】:

这里是细分;

在 PHP 处理中通过 $_GET 访问的 GET 和在 PHP 中通过 $_POST 访问的 POST 是传输方法,PUT 和 DELETE 等也是传输方法,无论您使用什么方法都无关紧要,它只适用于客户端并且只知道将其中的所有内容映射到序列化的查询字符串中,或​​者至少读取它以进行序列化。

例如

<input type="text" id="firstname" name="fname">

它接受name属性并转换成这个

?fname=ferret

看到它甚至没有打扰 ID 属性。当我们点击提交按钮时,表单只会遍历每个输入的名称属性,并使用值生成 LHS 并将用户输入作为 RHS 添加到值中。它根本不会做任何其他事情。

在 PHP 方面,我们询问 $_GET 隧道在请求或 $_POST 隧道中是否有任何查询字符串。如果有任何查询字符串,这些中的每一个 - 强调单词字符串。将字符串分解为数组并提供给您。因此 $POST['fname']。 看起来像这样

$_POST = [
fname => 'ferret',
someothingelse => 'someothervalue']

所以你想要做的是或者至少要求做的是......让浏览器改变它的 BOM 行为——我们实际上不能这样做;让表单添加这样的东西。

?fname=ferret,text 

?fname=ferret-text

?fname=ferret/text 

默认情况下表单不会这样做,除非您在提交之前运行自定义函数更新每个查询,这就是我们所谓的转义,3/100 次如果有机会您会错过它

然后在 PHP 方面,您希望 PHP 自己弄清楚斜线之后的类型是这样的

$_POST = [
fname => 'ferret/text']

PHP 不会自己做这件事,除非你像 Facebook 所做的那样对它进行自定义,然后运行它,或者至少制作某种低级库,但这也是事后的事。

如果您不知道,XSS 和注入就是这样发生的。

SO 查询字符串标准是严格的,以保持带有军国主义数据和序列化的字符串。

所以是的,您打算对隐藏字段执行的操作是实现您想要的一种经过测试的方法。

【讨论】:

  • 感谢您的回答,它有助于更​​多地了解其工作原理。
  • "$_GET 和 $_POST 是传输方法" — 它们不是。 GET 和 POST 是。 $_GET$_POST 是 PHP 超全局变量,它们与 HTTP 方法分离了几度(完全可以提交一个表单并让它填充 both 这些超全局变量)。
  • 嗯,它是一个全球性的超级晚餐,也可以不受限制地在任何地方访问。这就是所有超级全球性的东西,因此它们的名字。超级+全球。从来没有较少的方法 http 方法,我确实在我的回答中强调了这一点作为传输方法,但是你的指示是点,我会更新句子以反映 GET 和 POST。
【解决方案2】:

我们能否以某种方式将 type HTML 输入属性值传递给 $_POST 数组或使用 PHP 以其他方式获取它?

本身不是。

我知道我可以创建一个隐藏字段,并且基本上将真实输入的类型放入隐藏字段的值中

这是一种方法。

在表单提交中无法检测到输入的类型似乎是一个真正的缺点

通常您知道给定字段的数据类型是什么,因为您没有对它们进行一般处理,因此它很少是有用的功能。

也许(希望)我错过了什么?

没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多