<form action="https://b.example.com/post.aspx" method="post" target="frmPost">
<input name="cmd" type="text" size="20" />
<input type="submit" value="傳送至 B 域" />
</form>
<iframe src="https://b.example.com/main.aspx" style="width:100%;height:400px;"></iframe>
<%@ Page Language="C#" %>
<frameset rows="*,0" framespacing="0" border="0" frameborder="no">
<frame src="b.html" name="frmMain" />
<frame src="post.aspx" name="frmPost" />
</frameset>
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string cmd = Request.Form["cmd"];
if (!string.IsNullOrEmpty(cmd))
{
// 輸出腳本操作同域 frmMain (b.html)
Response.Write($@"
<script>
if (parent && parent.frames['frmMain']) {{
var target = parent.frames['frmMain'].document.getElementById('targetInput');
if (target) target.value = '{cmd.Replace("'", "\\'")}';
}}
</script>");
}
}
</script>
<input type="text" id="targetInput" placeholder="等待 A 域資料..." />
| 關鍵 | 說明 |
|---|---|
| form target | 指向隱藏 iframe (`frmPost`),不刷新主頁面。 |
| frameset 隱藏 frame | `rows="*,0"` 使 `frmPost` 高度為 0,使用者不可見。 |
| 同域腳本操作 | `parent.frames['frmMain']` 同屬 B 域,可合法操作 `b.html` DOM。 |
| 跳躍式跨域 | A→B(post.aspx)→B(b.html),中間躍過一層 frame 繞過同源限制。 |
iframe + form post + frameset 回呼是早期跨域無刷新提交的經典技巧,利用「允許跨域提交」與「同域框架互通」特性繞過同源策略。現代專案首選 **postMessage** 或 **CORS**,標準、安全、無需額外頁面結構。理解此技巧有助於維護舊系統與理解跨域通訊演進史。