1

我有一个小问题,我希望你能帮我解决这个烦人的问题。

我需要在管理面板中使用 iFrame 来让用户使用选择服务,在 HTML 中我有:

<iframe scrolling="yes" runat="server" title="Par Selection" id="iFrame"
    frameborder="0" enableviewstate="true" width="100%" height="490" />

在我的代码隐藏文件中,我有:

iFrame.Attributes.Add("src", String.Format(
            "https://www.parurval.se/urval/?username={0}&password={1}",
            parSettings.GetSettings(parSettings.SettingsType.PARSelection, parSettings.SectionType.Username),
            parSettings.GetSettings(parSettings.SettingsType.PARSelection, parSettings.SectionType.Password)));

输出是这样的:

<iframe id="tcMain_tabPARSelection_iFrame" scrolling="yes" title="Par Selection" 
   frameborder="0" width="100%" height="490" 
   src="https://www.parurval.se/urval/?username=myUsername&amp;password=myPassword">
</iframe>

注意在传递用户名和密码时&amp;改为登录 src 地址&

我怎样才能防止这种情况?

我尝试使用 HttpUtility.Decode(myCompleteUrl) 但取得了相同的成就:(

最糟糕的是,如果 src 代码只有地址

... src="https://www.parurval.se/urval/" ...

我无法输入用户/密码,我看到表单并且可以输入文本,但它什么也没做,它只刷新 iframe 内页,在一个完整的窗口中执行此操作,工作正常。

在该管理面板中,我有一个文本框给用户添加用户名和密码,以便进入管理页面,我将直接跳转到 iFrame 中的服务,因此用户无需每次都输入用户/密码登录,这就是我试图动态添加这些值的方式。

有任何想法吗?

补充: 如果我将正确的 URL 地址(带有用户和密码)放在 HTML 端的 iFrame src 属性中(不是动态的),一切正常:(

4

5 回答 5

5

& 的存在 实际上在那里是正确的。大多数浏览器都足够宽容,不会因为看到 & 就窒息,但这在技术上是不正确的。

于 2009-01-15T09:02:18.210 回答
2

“&” 是 HTML 中的特殊字符(更具体地说是 SGML),因此对其进行编码是正确的做法。是的,即使在链接 URL 中也是如此。

于 2009-01-15T09:02:47.073 回答
1

HTML 4.01 规范指出:

作者应使用“&” (ASCII 十进制 38)而不是“&”以避免与字符引用的开头混淆(实体引用打开分隔符)。作者还应该使用“&” 在属性值中,因为在CDATA属性值中允许字符引用。

因此编码&as&amp;是正确的行为,因为src属性值(CDATA 数据类型)的解释被描述为:

CDATA是来自文档字符集的字符序列,可能包括字符实体。用户代理应该如下解释属性值:

  • 用字符替换字符实体,
  • 忽略换行,
  • 用一个空格替换每个回车符或制表符。

否则,src属性值 like/foo?bar&sect=123将是模棱两可的,因为它们可以按字面意思解释为/foo?bar&sect=123或(替换sect实体)为/foo?bar§=123

于 2009-01-15T12:14:02.147 回答
-1

这似乎是您可以利用 URL 编码来隐藏 &,绕过 XML 编码的情况。& 是 U+0025,因此您可以将其编码为 %25:https ://www.parurval.se/urval/? username= {0}%25password={1}

于 2009-01-15T09:00:23.863 回答
-3

你应该使用

     HttpUtility.HtmlEncode(String.Format("https://www.parurval.se/urval/?username={0}&password={1}",            
parSettings.GetSettings(parSettings.SettingsType.PARSelection, parSettings.SectionType.Username),            
parSettings.GetSettings(parSettings.SettingsType.PARSelection, parSettings.SectionType.Password)));
于 2009-01-15T09:02:09.367 回答