如何在前端js文件中安装,导入和使用DOMPurify?

use*_*287 7 javascript sanitization input-sanitization dompurify

这更像是一种“您能确认这是正确的”问题吗,因为我认为我在编写问题的过程中已解决了该问题,但希望对其他有些犹豫的人有所帮助实施DOMPurify

简洁版本

DOMPurify在前端js文件中像这样导入和使用是否安全/有效:

npm install dompurify --save

import DOMPurify from 'dompurify'; 

var clean = DOMPurify.sanitize('<img src=x onerror=alert(1)//>', {SAFE_FOR_JQUERY: true}); 
Run Code Online (Sandbox Code Playgroud)

详细版本

目前,我的主要前​​端js文件使用以下约定导入:

import ClipboardJS from 'clipboard';

// date-fns functions
import getYear from 'date-fns/get_year';
import getMonth from 'date-fns/get_month';
import getDaysInMonth from 'date-fns/get_days_in_month';
import startOfMonth from 'date-fns/start_of_month';
import getDay from 'date-fns/get_day';
import format from 'date-fns/format';

import Cookies from './js.cookie';
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

npm install dompurify --save

import DOMPurify from 'dompurify';

console.log(DOMPurify.sanitize('<img src=x onerror=alert(1)//>', {SAFE_FOR_JQUERY: true}));
console.log(DOMPurify.sanitize('<svg><g/onload=alert(2)//<p>', {SAFE_FOR_JQUERY: true}));
console.log(DOMPurify.sanitize('<p>abc<iframe/\/src=jAva&Tab;script:alert(3)>def', {SAFE_FOR_JQUERY: true}));
console.log(DOMPurify.sanitize('<math><mi//xlink:href="data:x,<script>alert(4)</script>">', {SAFE_FOR_JQUERY: true})); 
console.log(DOMPurify.sanitize('<TABLE><tr><td>HELLO</tr></TABL>', {SAFE_FOR_JQUERY: true}));
console.log(DOMPurify.sanitize('<UL><li><A HREF=//google.com>click</UL>', {SAFE_FOR_JQUERY: true}));
Run Code Online (Sandbox Code Playgroud)

字符串示例来自此处:

https://github.com/cure53/DOMPurify#some-purification-samples-please

并使用SAFE_FOR_JQUERY此处提到的标志:

https://github.com/cure53/DOMPurify#can-i-configure-it

一切都按预期方式记录,即:

<img src="x">
<svg><g></g></svg>
<p>abcdef</p>
<math><mi></mi></math>
<table><tbody><tr><td>HELLO</td></tr></tbody></table>
<ul><li><a href="//google.com">click</a></li></ul>
Run Code Online (Sandbox Code Playgroud)

这样很好。

官员DOMPurify自述显示以下方式来进口和使用:

// method 01
<script type="text/javascript" src="dist/purify.min.js"></script>
var clean = DOMPurify.sanitize(dirty);

// method 02
require(['dompurify'], function(DOMPurify) {
    var clean = DOMPurify.sanitize(dirty);
});

// method 03
npm install dompurify
const createDOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');

const window = (new JSDOM('')).window;
const DOMPurify = createDOMPurify(window);

const clean = DOMPurify.sanitize(dirty);

// method 04
const createDOMPurify = require('dompurify');
const jsdom = require('jsdom').jsdom;

const window = jsdom('').defaultView;
const DOMPurify = createDOMPurify(window);

const clean = DOMPurify.sanitize(dirty);
Run Code Online (Sandbox Code Playgroud)

即使未列出我的实现方式,这仍然是一种安全/有效的方法:

npm install dompurify --save

import DOMPurify from 'dompurify'; 
Run Code Online (Sandbox Code Playgroud)

PS,如果上下文需要...

实现方案为:

01) 用户以范围开始:

<span class="editable" data-previous_value="here is previously saved value">here is previously saved value</span>
Run Code Online (Sandbox Code Playgroud)

02) 单击范围时,会将的值data-previous_value添加到input替换的元素中span

03) 用户修改input元素中的文本,然后单击“保存”。

04) 我使用markdown-it,将html选项设置为,false并将markdown-it-attrs(添加css样式)和markdown-it-span(定义spans)用于将任何markdown呈现为html(链接,图像,类,跨度等)。

05) 新值将添加到新span元素(用渲染markdown-it)和data属性(未渲染)中,以替换该input元素。

06) 未渲​​染的新值MongoDB通过保存在数据库中Node/Express

例如,以下输入:

![img](/img/my_thumb.jpg){.video_thumb} [Video](https://www.youtube.com/watch?v=dQw4w9WgXcQ)
Run Code Online (Sandbox Code Playgroud)

转换为此HTML:

<span class="editable" data-previous_value="![img](/img/my_thumb.jpg){.video_thumb} [Video](https://www.youtube.com/watch?v=dQw4w9WgXcQ)">
<img src="/img/my_thumb.jpg" alt="img" class="video_thumb"> 
<a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ">Video</a>
</span>
Run Code Online (Sandbox Code Playgroud)

我正在考虑在输入DOMPurify到达markdown-it之前(步骤04之前)对输入进行消毒。

Дми*_*нов 8

对于反应:

import DOMPurify from "dompurify";
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(dirtyContent) }} />
Run Code Online (Sandbox Code Playgroud)