首页 > 其他分享 >【前端面试题-20】js如何对输出内容进行HTML编码

【前端面试题-20】js如何对输出内容进行HTML编码

时间:2024-03-29 11:01:04浏览次数:33  
标签:编码 面试题 gt 20 quot js lt HTML var

在JavaScript中,对输出内容进行HTML编码通常是为了防止XSS攻击(跨站脚本攻击),即将特殊字符转换成HTML实体的形式,避免它们被浏览器解析为HTML或JavaScript代码。以下是一些常见的HTML编码方法:

使用内建函数 encodeURIComponent()encodeURI()

虽然这两个函数主要用于编码URI组件而不是HTML内容,但在某些场景下也可以用来对HTML内容中的特殊字符进行编码,特别是对于属性值,推荐使用encodeURIComponent

var str = '<script>alert("Hello, World!");</script>';
var encodedStr = encodeURIComponent(str);
console.log(encodedStr); // "%3Cscript%3Ealert(%22Hello%2C%20World%21%22)%3B%3C/script%3E"

// 注意:这会编码URI特殊字符,但不包括单引号、双引号和尖括号

使用自定义函数或库

为了对HTML内容进行全面的HTML实体编码,可以编写一个简单的函数,或者利用现成库的功能,例如:

自定义函数示例:
function htmlEncode(str) {
  return String(str)
    .replace(/&/g, '&amp;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;');
}

var rawStr = 'This is "<b>bold</b>" and "single \'quote".';
var encodedStr = htmlEncode(rawStr);
console.log(encodedStr); // "This is &quot;&lt;b&gt;bold&lt;/b&gt;&quot; and &quot;single &#39;quote&quot;."
使用库(例如 jQuery 提供的 $.fn.htmlPrefilter 或其他第三方库):
// jQuery 示例(假设已引入jQuery库)
var unsafeStr = '<script>alert("Unsafe!");</script>';
var safeStr = $('<div />').text(unsafeStr).html(); // jQuery自动进行了转义
console.log(safeStr); // "&lt;script&gt;alert(&quot;Unsafe!&quot;);&lt;/script&gt;"

ES6+ 使用模板字符串配合DOM API

如果你有一个安全的上下文环境,例如在Vue.js或React等现代框架中,可以利用模板字符串结合DOM APIs(如textContent或innerText)来安全地插入HTML内容:

const unsafeStr = '<script>alert("Unsafe!");</script>';
const div = document.createElement('div');
div.textContent = unsafeStr; // 这里会自动进行适当的HTML转义
const safeHtml = div.innerHTML;
console.log(safeHtml); // "&lt;script&gt;alert(&quot;Unsafe!&quot;);&lt;/script&gt;"

总之,在实际应用中,选择哪种方式取决于具体需求和所使用的框架或库。如果是纯JavaScript环境且没有现成的安全插入机制,建议使用自定义函数来确保内容被正确地HTML编码。

标签:编码,面试题,gt,20,quot,js,lt,HTML,var
From: https://blog.csdn.net/ivan5277/article/details/137138453

相关文章

  • 2024年数字IC秋招-华为-数字芯片-实习笔试题
    文章目录前言一、单选题1、wirea=1'bx;wireb;bufif1(b,a,1);则b=2、在CDC异步电路检查报告中,如果出现了violation信息,那么在实际电路中一定会出现错误。3、芯片电压的设计规格是中心电压0.9V,以下说法不正确的是5、SystemVerilog语句$urandom_range(100)可......
  • 【NC207028】第k小数
    题目第k小数快速排序思想思路这道题有多种解法,这里记录一种个人认为最优的解法:基于快速排序的选择算法基于快速排序的寻找数组中第kkk小元素的算法......
  • 2013年认证杯SPSSPRO杯数学建模A题(第一阶段)护岸框架全过程文档及程序
    2013年认证杯SPSSPRO杯数学建模A题护岸框架原题再现:  在江河中,堤岸、江心洲的迎水区域被水流长期冲刷侵蚀。在河道整治工程中,需要在受侵蚀严重的部位设置一些人工设施,以减弱水流的冲刷,促进该处泥沙的淤积,以保护河岸形态的稳定。  现在常用的设施包括四面六边透水框......
  • 抢先看!界面控件DevExpress WPF 2024产品路线图预览(一)
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。本文将介绍2024年DevExpressWPF第一个主要更新(v2......
  • 【2024-03-28】吾日再省
    20:00要想养成某种习惯,那就去付诸行动。不想养成某种习惯,那就避而远之。要想改变一个习惯,那就做点别的事来取代它。                                                 —......
  • [RoarCTF 2019]Online Proxy --不会编程的崽
    这几天也是ctf做得有点头疼了。好些序列化的题没碰,一直做些sql注入类的题目。闲来无事,在更一次sql注入吧。整个页面就这点信息。首先想想为什么他能获取你的ip。猜测是数据包X-Forwarded-For。  它还输出上次访问页面客户端的ip。很明显了,多半是二次注入X-Forwarded-For......
  • ECON 8820高级理论
    (高级理论ECON8820)截止时间:美国东部时间4月2日星期二晚上10点注意:本课业要求您使用Dynare。除了提交答案,您还需要提交Dynaremod文件和输出文件。请通过Brightspace提交所有文件。总分:40分1)(5分)在表1中,您得到了根据A1计算的两个样本期P1和P3的关键劳动力市场变量的波动率。P1:大......
  • 面试题知识点笔记-MySQL开发
    目录可以使用MySQL直接存储文件(ppt,exel,图像等)吗?什么时候存,什么时候不存?Emoji乱码怎么办?存储的时候有遇到过什么问题吗?如何存储ip地址?长文本如何存储?大段文本如何设计表结构?大段文本查找时如何建立索引?有没有在开发中使用过TEXT,BLOB数据类型日期,时间如何存......
  • 20240328,位运算,可变数组,链表(我是真的没有听懂)
    位运算一,按位运算按位运算,把整数当作2进制的数字进行运算?&按位与,|按位或,~按位取反,^按位的异或,<<左移, >>右移1.1&按位与·如果(x)i==1并且(y)i==1,那么(x&y)=1否则的话(x&y)i=0按位与常用于两种应用:·让某一位或某些位为0:  x&0xFE·取一个数中的一段: x&......
  • 面试题知识点笔记-MySQL日志
    目录MysqI会产生几种日志?binlog作用是什么?redolog作用是什么?undolog作用是什么?Mysql日志是否实时写入磁盘?binlog刷盘机制是如何实现的?redolog刷盘机制是如何实现的?undolog刷盘机制是如何实现的?MySQL的binlog有有几种录入格式?分别有什么区别?Mysq!集群同......