如何以编程方式从代码隐藏提交表单到外部站点
How to submit a form programmatically from code behind to an external site
我尝试将以编程方式创建的 HtmlForm
的值获取到外部站点。此站点要求数据以 POST
形式发送,因为它可能包含敏感信息。
我从这样的 JSon 响应生成 HtmlForm
:
JObject jsonResponseActionData = (JObject)joResponse["action_data"];
var redirectURL = (JValue)jsonResponseActionData["url"];
HtmlForm form= new HtmlForm {
Method = "post",
Action = redirectURL.ToString()
};
var inputTypeString = "<input type=\"text\" name=\"inputName\" value=\"inputValue\">";
foreach (var obj in jsonResponseFields) {
if (obj.Value.ToString() == "") {
form.InnerHtml += inputTypeString.Replace("inputName", obj.Key).Replace("inputValue", "").Replace(">", " disabled >");
} else {
form.InnerHtml += inputTypeString.Replace("inputName", obj.Key).Replace("inputValue", obj.Value.ToString());
}
}
如果我像这样将其写入 HTML-File 并向其添加提交按钮,我可以将其成功提交到外部站点,因此我可以接受 JSon -正确响应并从那里提取所有信息。
我尝试过的:
- 向 apsx 页面添加一个隐藏的表单元素,但是 this isn't possible and results in an empty stack error
- submitting it with
Server.Transfer
and Response.Redirect
,但都抛出异常(分别为 System.ArgumentException
和 ThreadAbortException
),因为我想访问外部站点
如何将生成的表单提交到外部站点?请注意,该网站确实需要我提交表格,因此任何其他不涉及提交表格的解决方案都没有建设性。
我现在实施了一个解决方法,也许这对其他人有帮助(但也许这个答案被否决了,因为它太糟糕了?):
我在子文件夹中创建了一个新的 HTML 页面。此子文件夹受 Web.config
和 .htaccess
保护(因为我没有找到禁止调用 *.html-files in Web.config
的方法),这意味着文件不能从外部来源列出的文件也无法查看,即使您知道文件名。
此 HTML 页面仅包含我要提交的表单和一些 JavaScript,它会在页面加载时自动点击提交按钮:
<head>
<script>
function clickButton(){
document.getElementById("submitForm").click();
</script>
</head>
<body onload="clickButton()">
<!--Actual content goes here-->
</body>
然后我将用户重定向到该页面:
Response.Redirect(pageName);
一旦 JSON 数据处理完成。
这对我来说是有效的,因为无论如何用户都会被重定向到外部站点,在最好的情况下 s/he 甚至不会注意到重定向到这个中间站点,即使它被注意到了,该页面不包含用户不知道的任何内容,加上 HTML 文件中的数据不敏感,该数据必须由用户在外部站点上输入,因此没有可能的安全性突破这里。至少none我现在能想到的。
我尝试将以编程方式创建的 HtmlForm
的值获取到外部站点。此站点要求数据以 POST
形式发送,因为它可能包含敏感信息。
我从这样的 JSon 响应生成 HtmlForm
:
JObject jsonResponseActionData = (JObject)joResponse["action_data"];
var redirectURL = (JValue)jsonResponseActionData["url"];
HtmlForm form= new HtmlForm {
Method = "post",
Action = redirectURL.ToString()
};
var inputTypeString = "<input type=\"text\" name=\"inputName\" value=\"inputValue\">";
foreach (var obj in jsonResponseFields) {
if (obj.Value.ToString() == "") {
form.InnerHtml += inputTypeString.Replace("inputName", obj.Key).Replace("inputValue", "").Replace(">", " disabled >");
} else {
form.InnerHtml += inputTypeString.Replace("inputName", obj.Key).Replace("inputValue", obj.Value.ToString());
}
}
如果我像这样将其写入 HTML-File 并向其添加提交按钮,我可以将其成功提交到外部站点,因此我可以接受 JSon -正确响应并从那里提取所有信息。
我尝试过的:
- 向 apsx 页面添加一个隐藏的表单元素,但是 this isn't possible and results in an empty stack error
- submitting it with
Server.Transfer
andResponse.Redirect
,但都抛出异常(分别为System.ArgumentException
和ThreadAbortException
),因为我想访问外部站点
如何将生成的表单提交到外部站点?请注意,该网站确实需要我提交表格,因此任何其他不涉及提交表格的解决方案都没有建设性。
我现在实施了一个解决方法,也许这对其他人有帮助(但也许这个答案被否决了,因为它太糟糕了?):
我在子文件夹中创建了一个新的 HTML 页面。此子文件夹受 Web.config
和 .htaccess
保护(因为我没有找到禁止调用 *.html-files in Web.config
的方法),这意味着文件不能从外部来源列出的文件也无法查看,即使您知道文件名。
此 HTML 页面仅包含我要提交的表单和一些 JavaScript,它会在页面加载时自动点击提交按钮:
<head>
<script>
function clickButton(){
document.getElementById("submitForm").click();
</script>
</head>
<body onload="clickButton()">
<!--Actual content goes here-->
</body>
然后我将用户重定向到该页面:
Response.Redirect(pageName);
一旦 JSON 数据处理完成。
这对我来说是有效的,因为无论如何用户都会被重定向到外部站点,在最好的情况下 s/he 甚至不会注意到重定向到这个中间站点,即使它被注意到了,该页面不包含用户不知道的任何内容,加上 HTML 文件中的数据不敏感,该数据必须由用户在外部站点上输入,因此没有可能的安全性突破这里。至少none我现在能想到的。