【问题标题】:Zend Framework - Secure way to pass parameter from view to controllerZend Framework - 将参数从视图传递到控制器的安全方法
【发布时间】:2011-06-18 06:45:38
【问题描述】:

我使用 Zend Framework 将近 3 个月,我正在寻找一种以安全方式将参数从视图传递到控制器的方法。我更喜欢传递 $_POST 方法之类的参数,但我不想使用表单。 ZF有什么方法可以使用吗?我只知道 url() 方法,但我不知道这种方法是否适用于将重要数据传递给控制器​​。

【问题讨论】:

  • “安全”以什么方式?为什么不想使用表格?请澄清问题。
  • 你想从视图中传递什么信息?请描述一个场景。
  • 如果您使用的是 mvc 范例,您应该将变量从控制器传递到视图,而不是相反...
  • 对不起。我有一个带有 5 个按钮的视图,每个按钮都重定向到不同的操作,并且每个操作都调用模型层的方法来使用参数更新数据库。这就是为什么我需要像 POST 这样的东西。我认为其他 PHP 框架(Cake、Symfony)有方法在不使用表单的情况下发送参数 POST。

标签: php zend-framework frameworks post parameter-passing


【解决方案1】:

HTTP 是一种无状态协议,您基本上可以从四种解决方案中进行选择来保留请求之间的信息(我认为,这正是您想要做的,不是吗):

  • 查询字符串
  • 表单中的隐藏元素
  • 饼干
  • 会话

会话将是最安全的。在 ZF 中,您有 Zend_Session 组件来帮助您进行会话管理。

就发送没有表单的 POST 而言,这是相当困难的。看看:Zend Framework: How to POST data to some external page (e.g. external payment gate) without using form?。但是,如果您只想发送 POST 数据,则可以在 PHP 中使用 cURL 发送数据。

【讨论】:

  • 好的,谢谢 Marcin。我已经在使用表单来发送参数。但是我有一个带有 5 个按钮的视图,每个按钮都重定向到不同的操作,并且每个操作都调用模型层的方法来使用参数更新数据库。这就是为什么我需要像 POST 这样的东西。我认为其他 PHP 框架(Cake、Symfony)有方法在不使用表单的情况下发送参数 POST。
  • @Gerzman。如果您只想发送 POST,则可以使用 cURL 在 PHP 中发送。
  • 由于这些操作会导致服务器状态更改 - 数据库写入 - 使用 POST 似乎是正确的。如果您确实想将用户转换到这些页面之一,那么您将被表单困住。唯一的问题是您是否希望将参数公开给用户。如果是这样,则将它们塞入表单上的隐藏字段中。如果没有,则将它们存储在会话中。在任何情况下,在发布后进行重定向总是好的——所谓的Post-Redirect-Get——这样目标页面的刷新就不会重新提交数据。
  • 您还可以使用 Javascript 以编程方式将 GET 请求转换为 POST(尽管如果用户关闭了 JS,这不会很好地降级,但谁会这样做呢??)
【解决方案2】:

我认为您可能正在寻找 Session 变量。

您想将无法从 URL 中看到的内容发送到下一个请求中,对吗? Session 是理想的选择。

更新:

我将您的问题解读为: “页面中有这个变量,它以某种方式发生了变化。我希望用户将它发送到服务器,但它不应该出现在 URL 中。但不使用表单。”

没有表单或javascript axaj调用,无法从浏览器发起POST请求(比如让用户发布密码或类似的东西)。要通过 POST 发送一些数据,您可以使用 Zend_Http_Client(),但这是在服务器端完成的,您仍然需要先发出 GET 请求。

请问您将如何使用 GET 来实现它?这将有助于我们了解您到底想做什么。

最后一个想法:

我正在寻找一种通过的方法 从视图到参数 控制器以安全的方式

只是因为它不在 URL 中它不安全! :)

【讨论】:

  • 感谢 tomas-fejfar,会议可能是一种选择。但我认为其他 PHP 框架(Cake、Symfony)有方法在不使用表单的情况下发送参数 POST。
【解决方案3】:

我认为您可以使用摘要键

该方法与安全 GET、POST、Cookie 或 Session 无关,客户端的人可以操纵参数。

例子:

mywebsite.com/widget.php?id=1234&action=delete

人们可以更改 GET 参数 id 并删除他们想要的任何内容。显然,您的控制器应该实现 Auth 和可能的 ACL,用于身份验证和授权,但这仍然不会阻止 URL 篡改。例如,什么会阻止 Bob 登录并更改 URL 以编辑 John 的小部件。

您通过将参数连接成字符串来生成摘要键:

1234+password = "1234password" then generate the MD5 of the result = d5b1ee4b463dc7db3b0eaaa0ea2cb5b4

通过 url 传递这个。

mywebsite.com/widget.php?id=1234&action=delete&mac=d5b1ee4b463dc7db3b0eaaa0ea2cb5b4

在 widget.php 中,您可以使用相同的公式来计算摘要键并检查它是否匹配。如果他们尝试将 id 更改为 4567,则 MD5 结果将是09fef3620249f28ae64adc23bded949,因此您可以拒绝该请求。

如果您的 URI 上有超过 1 个参数,请将它们串在一起,添加密码并生成 MD5 或 SHA1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多