我有一点问题,我正在跳,你可以帮我解决这个恼人的问题。
我需要在管理面板中使用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&password=myPassword">
</iframe>
注意 &
,而不是 &
在传递用户名和密码时在src地址中签名
我该如何防止这种情况?
我尝试了HttpUtility.Decode(myCompleteUrl),但取得了同样的成就:(
最糟糕的是,如果src代码只有地址
... src="https://www.parurval.se/urval/" ...
我无法输入用户/ pwd,我看到表格,我可以输入文字,但它什么也没做,只刷新iframe内页,在完整的窗口中执行此操作,工作正常。
在该管理面板中我有一个文本框给用户添加用户名和密码以便进入管理页面,我将直接跳转到iFrame中的服务,这样用户就不需要输入user / pwd了每次登录,这是我试图动态添加这些值的方式。
有什么想法吗?
加了: 如果我将正确的URL地址(带有用户和密码)放在HTML端的iFrame src属性中(不是动态的),一切正常:(
答案 0 :(得分:5)
&amp; amp; amp;实际上是正确的。大多数浏览器都是宽容的,不会因为只看到&amp;那里,但技术上不正确。
答案 1 :(得分:2)
“&amp;”是HTML中的特殊字符(更具体地说是在SGML中),因此对其进行编码是正确的。是的,即使在链接网址中也是如此。
答案 2 :(得分:1)
作者应使用“&amp; amp;” (ASCII十进制38)而不是“&amp;”避免与字符引用(实体引用打开分隔符)的开头混淆。作者也应该使用“&amp; amp;”在属性值中,因为CDATA属性值中允许使用字符引用。
因此将&
编码为&
是正确的行为,因为src
属性值(CDATA data type)的解释被描述为:
CDATA 是文档字符集中的字符序列,可能包含字符实体。用户代理应解释属性值,如下所示:
- 用字符替换字符实体
- 忽略换行,
- 用一个空格替换每个回车或标签。
其他src
属性值(如/foo?bar§=123
)将不明确,因为它们可以按字面解释为/foo?bar§=123
或(将sect
entity替换为)/foo?bar§=123
。
答案 3 :(得分:-1)
这似乎是一种可以利用URL编码隐藏&amp ;,绕过XML编码的情况。 &安培;是U + 0025,因此您可以将其编码为%25:https://www.parurval.se/urval/?username= {0}%25password = {1}
答案 4 :(得分:-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)));