【问题标题】:Fetch POST via form action attribute通过表单操作属性获取 POST
【发布时间】:2011-06-08 21:09:14
【问题描述】:

我不记得我在哪里读到的:通过表单操作属性传递数据比通过 href 属性传递数据更安全。在验证段方面更安全,因为它是 $_POST 并且您可以在提交表单时比较令牌以进行 csrf 保护,这与直接链接不同。这是真的吗?

如果假设我在表单中有以下操作,

<form method="post" action="/edit/pictures/delete/2235/">

我可以通过 $_POST 获取 URI 段 2235 吗?

编辑:请假设存在 URL 重写。 2235 是一个变量值。我不是在问如何检索2235,只是我可以通过$_POST 检索它

【问题讨论】:

  • 您所说的更安全是什么意思?安全方面还是可靠性方面? ...关于如何获取细分,您可能在某处启用了 URL 重写 - 您必须发布重写规则
  • 从应用程序安全的角度来看,来自 POST 或 GET 的数据是无关紧要的,它们应该被同等对待(即不可信)。这通常适用于所有用户输入。但是,通过在表单操作中定义变量,它们将可以通过 GET 数组获得(并非没有一些魔法,因为您使用的是漂亮的 url)。
  • 假设 url 重写?你能发布你的具体规则吗?
  • @Ben Lee,将?some_id=2235 的 URL 重写为 2235
  • 您的问题的答案是“有时”,这取决于您的重写规则。请发布您的确切重写规则,否则我们不能说。

标签: php forms


【解决方案1】:

在您的操作页面上,爆炸$_SERVER['REQUEST_URI']

$parts = explode('/', $_SERVER['REQUEST_URI']);

foreach($parts as $slug)
{
    echo htmlspecialchars($slug);
}

您应该能够提取该 ID。

另一种方法就是把它作为一个隐藏的 HTML 字段:

<input type="hidden" name="id" value="2235" />

【讨论】:

    【解决方案2】:

    当您将表单发布到 php 端点时,$_POST 只会填充来自输入元素的数据。请求路径在$_SERVER['REQUEST_URI'] 中可用。要从请求路径中获取 id id,您可能需要使用如下正则表达式:

    preg_match('/\/\d+\/?$/', $_SERVER['REQUEST_URI'], $matches);
    $matches[0] // Contains '2235'
    

    关于您的安全问题——答案是 POST 绝对不比 GET 更安全。它们是不同的 HTTP 动词,并以稍微不同的方式传输数据,但无论哪种方式,您的应用程序接收的数据都是不可信的。欺骗 POST 请求(如表单)与欺骗 GET 请求(如锚链接)一样容易。

    【讨论】:

      【解决方案3】:

      如果您使用此类 URL,您可能会有一些 .htaccess 将其转换为从 $_GET 访问的查询参数 - 尝试这样的事情 [从我的脑海中写出来,需要测试]:

      RewriteRule ^/edit/pictures/delete/(.+)$ ?module=pictures&action=delete&id=$1
      

      如果没有,您可以随时访问$_SERVER['REQUEST_URI'] 并从中提取必要的信息。

      【讨论】:

      • 你不能。表单动作属性中的内容是GET请求参数,所以包含的所有参数都是GET参数。
      猜你喜欢
      • 2015-07-29
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多