C#中的String.Format - 输入字符串无效

8

我有一个类似下面的MVC3 HtmlHelper扩展:

public static MvcHtmlString ShowInfoBar(this HtmlHelper helper, string message, InfoMessageType messageType)
    {
        return MvcHtmlString.Create(String.Format(@"<script type=""text/javascript"">$(document).ready(function () { gtg.core.showInfoBar('{0}', '{1}'}; );</script>", message, messageType.ToString().ToLower()));
    }

message 的值为 "产品名称" 已成功保存。

messageType 的值为 信息

一直显示 输入字符串的格式不正确。

我卡住了?


1
如果您只输入字符串而不使用String.Format()方法,那么会出现错误吗? - Edward Black
5个回答

21

对于每个不是标记的大括号,你必须要加倍符号 - 这样

function() {{

等等,还要考虑跨站脚本攻击(XSS) - message 被适当地转义以插入 JavaScript 了吗?


哪个,XSS?任何地方都有可能。维基百科是一个好的起点。你只需要用a ' message " with ' quotes " in来测试它(虽然完全转义不仅仅是引号)。 - Marc Gravell
1
优秀的提及是否正确地为JavaScript转义方法参数。 - Adam Porad
1
@Sam 对的,目前它是坏掉了。现在想象一下,我精心创建了一个产品名称,例如 '); stealYourCookiesAndPostThemSomewhere(); // - 然后我黑了你的登录 - 因此发生了 XSS 攻击。最简单的选项是将数据写入某个隐藏元素中并读取它。另一个选项是使用类似 JavascriptSerializer 的东西来编写 JSON(然后进行转义)。纯 JSON 转义也是可以的。 - Marc Gravell
@Marc - 那么你需要访问服务器才能这样做吗?我的意思是你必须从某个地方输入才行,对吧?所以在这种情况下,虽然它是一种XSS攻击,但这是一个站点的后端管理器,所以我认为它的概率不是很高,但如果公共用户可以访问它,那就可能是一个严重的问题了。 - Sam
1
@Sam 当然这完全取决于上下文 - 你可以主张,仅仅无法正确处理O'Neills' biscuits就足以被定义为bug。但同时不要低估一个组织内部*恶意行为的程度(尤其是在薪酬考核不理想之后)- 不仅是那些未经洗漱的公众有能力造成伤害。 - Marc Gravell
显示剩余5条评论

10

在格式字符串中,转义花括号{{ }}。

String.Format(@"<script type=""text/javascript"">$(document).ready(function () {{ gtg.core.showInfoBar('{0}', '{1}'); }});</script>", message, messageType.ToString().ToLower())

5
您需要转义大括号:

{{}}
String.Format(@"<script type=""text/javascript"">$(document).ready(function () {{ gtg.core.showInfoBar('{0}', '{1}'}}; );</script>", 
              message, messageType.ToString().ToLower())

1

在我的情况下,我使用了括号进行JsonP格式化。JsonP还需要一个 '{'。通过像这样转义 {:'{{',我的问题得到了解决。


0

我已经尝试了以下方法,它可以正常工作。

string.Format(@"ExecuteOrDelayUntilScriptLoaded(function () {{ Your function. 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接