【问题标题】:ASP.net c# post form on users behalfASP.net c# 代表用户发布表单
【发布时间】:2010-10-06 08:23:34
【问题描述】:

我有一个 ASP 按钮,当单击它时,它会调用一个函数,将订单信息添加到我的数据库中。订购流程的下一步是使用此表单将用户转移到支付网关:

<form action="https://select-test.wp3.rbsworldpay.com/wcc/purchase" name="BuyForm" method="POST">
<input type="hidden" name="instId"  value="151711">
<input type="hidden" name="cartId" value="abc123">
<input type="hidden" name="currency" value="GBP">
<input type="hidden" name="amount"  value="1221">
<input type="hidden" name="desc" value="">
<input type="hidden" name="testMode" value="100">
<input type="submit" value="To Payment!">
</form>

但我真的很希望用户:

按下订单按钮 -> 订单功能 调用 -> 用户自动传递给 订单页面

应该这样:

按下订单按钮 -> 订单功能 调用 -> 用户转到另一个页面 -> 用户手动单击按钮转到 worldpay支付页面

在 C# 中是否有将用户重定向到订单页面,并与他们一起提交表单数据?

【问题讨论】:

标签: c# asp.net forms redirect response.redirect


【解决方案1】:

您可以从第一个订单表单的提交处理程序重定向:

Response.Redirect("https://select-test.wp3.rbsworldpay.com/wcc/purchase?instId=151711&cartId=abc123&currency=GBP&amount=1221&desc=&testMode=100");

请注意,无论您是通过 GET 还是 POST 提交,您的表单参数目前都可能被篡改。我确信 WorldPay 有一些安全措施可以用来防止和/或检测篡改。你应该使用它们!

编辑...

WorldPay 允许您submit a hash along with your payment parameters 以帮助防止篡改。这应该可以阻止任何业余查询字符串的篡改;它是否能阻止一个坚定的攻击者是另一回事。

正如您在 cmets 中提到的,您绝对应该在提交之前记录最后的参数,然后将它们与回调数据交叉引用,以确保没有任何内容被触及。

【讨论】:

  • @Tim:在您的评论出现之前已经编辑过了。无论您使用 GET 还是 POST,都存在安全问题:使用 GET 意味着任何人都可以篡改这些值;使用 post 意味着几乎任何人都可以篡改这些值。
  • 我猜这是必须的!网关会进行回调以进行验证,因此我将标记任何被篡改的订单。不过,我希望阻止任何业余查询字符串攻击。
  • @Tim:如果您要重定向到外部站点,那么您需要以某种方式发送该数据。我非常怀疑 WorldPay 是否能够看到 Tom 的服务器上保存的会话数据。
  • @Tom:WorldPay 允许您在提交数据时发送数据的哈希值。这绝对可以防止任何业余攻击。它是否会阻止坚定的专家是另一回事。 rbsworldpay.com/support/kb/bg/htmlredirect/rhtml5800.html
  • @Luke - 我说我最初回复时没有意识到它是第 3 方网关。我将删除我的 cmets。
【解决方案2】:

您可以在事件处理程序的末尾使用Response.Redirect("OtherPage.aspx");。使用此方法,您可以将项目附加到查询字符串(例如订单 ID)...Response.Redirect("OtherPage.aspx?OrderID=abcdef");

或者,您可以在订单页面中进行处理并将其列为 PostbackUrl,因此第一页直接回传到订单页面。

【讨论】:

  • 您可以在查询字符串上传递某种令牌,但实际 ID 可能会让您对 URL 篡改开放。在任何一种情况下,这种方法都需要在服务器上基于更难篡改的东西(例如匹配的 Session 变量)进行验证。
【解决方案3】:

多种方式:

1) 将订单置于 Session 状态并随身携带,在用户跳转到最终页面时自动检索。

2) 创建一个以新页面为目标提交其数据的表单(而不是作为 ASP.Net 中的默认行为回发给自身)。

3) 生成带有隐藏字段的表单并输出到页面。

在情况 #2 和 #3 中,您可以选择使用客户端脚本自动提交表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-18
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多