FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 3979|回复: 0
打印 上一主题 下一主题

Text输出中带script标签的BUG及解决方案

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-16 18:05:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
反馈BUG
程序版本: FineUI v3.3.1 FineUI v4.0
浏览器: Chrome Firefox IE10 IE9 IE8 其它(请在帖子中注明浏览器及版本) 
BUG截图:
BUG地址: -
本帖最后由 辉月 于 2013-11-16 18:05 编辑

字符串字段输出时带有</SCRIPT>标签,会导致JS代码被此标签截断,页面错误。

源码:FineUI.ControlBase的1183行

        /// <summary>
        /// 将控件的属性列表转化为JObject对象
        /// </summary>
        /// <param name="propertyList">属性列表</param>
        /// <returns>属性列表的JObject形式</returns>
        public JObject ConvertPropertiesToJObject(List<string> propertyList)

string propertyValueStr = propertyValue.ToString().Replace("</script>", @"<\/script>");

已对</script>做了转义,转义形式是<\/script>,未对</SCRIPT>做转义(虽然大写不符合标准,但是确实有不少人写代码会用大写)。

这样的转义效果不是我需要的,而且对大小写没有做匹配。

临时解决方案:
1183行修改为:
string propertyValueStr = Regex.Replace(propertyValue.ToString(), "</script>", "</scr\"+\"ipt>", RegexOptions.IgnoreCase);

889行的OnFirstPreRender修改为:

        /// <summary>
        /// 渲染 HTML 之前调用(页面第一次加载或者普通回发)
        /// </summary>
        protected virtual void OnFirstPreRender()
        {
            List<string> totalModifiedProperties = XState.GetTotalModifiedProperties();
            if (totalModifiedProperties.Count > 0)
            {
                string propertyValue = ConvertPropertiesToJObject(totalModifiedProperties).ToString(Formatting.None).Replace("</scr\\\"+\\\"ipt>","</scr\"+\"ipt>");
                OB.AddProperty("x_state", propertyValue, true);
            }
            else
            {
                OB.AddProperty("x_state", "{}", true);
            }

            ……………………
        }


可解决问题。

另,FineUI.JsHelper中也对</script>进行转义,同样可能存在这个问题,修改为:

        /// <summary>
        /// 返回的是双引号括起来的字符串,用来作为JSON属性比较合适
        /// </summary>
        /// <param name="s">源字符串</param>
        /// <returns>双引号括起来的字符串</returns>
        public static string Enquote(string s)
        {
            string jsonString = new JValue(s).ToString(Formatting.None);

            // The browser HTML parser will see the </script> within the string and it will interpret it as the end of the script element.
            // http://www.xiaoxiaozi.com/2010/02/24/1708/
            // http://stackoverflow.com/questio ... n-javascript-string
            jsonString = Regex.Replace(jsonString, "</script>", "</scr\"+\"ipt>", RegexOptions.IgnoreCase);

            return jsonString;
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-11-28 02:39 , Processed in 0.047556 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表