- Custom Cross-Site Scripting Prevention
Contact Support
Preventing Cross-Site Scripting (XSS)
27 Feb 202522 minutes to read
The Rich Text Editor allows users to edit the content with security by preventing cross-site scripting (XSS). By default, it provides built-in support to remove elements from editor content that cause XSS attacks. The editor removes the elements based on the attributes if it is possible to execute a script.
The enableHtmlSanitize property determines whether XSS prevention is active. It’s set to true
by default.
In the following sample, we removed the script
tag and onmouseover
attribute from the content of the Rich Text Editor.
[Class-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
class App extends React.Component {
rteValue="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
onBeforeSanitizeHtml(e) {
e.helper = (value) => {
e.cancel = true;
let temp = document.createElement('div');
temp.innerHTML = value;
let scriptTag = temp.querySelector('script');
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar, BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
class App extends React.Component<{},{}> {
private rteValue:string ="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
public onBeforeSanitizeHtml(e: BeforeSanitizeHtmlArgs): void {
e.helper = (value: string) => {
e.cancel = true;
let temp: HTMLElement = document.createElement('div');
temp.innerHTML = value;
let scriptTag: HTMLElement = temp.querySelector('script') as HTMLElement;
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
function App() {
let rteValue="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>"
const onBeforeSanitizeHtml=(e) =>{
e.helper = (value) => {
e.cancel = true;
let temp = document.createElement('div');
temp.innerHTML = value;
let scriptTag = temp.querySelector('script');
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
return (<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar,BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
function App(){
let rteValue:string="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
const onBeforeSanitizeHtml=(e:BeforeSanitizeHtmlArgs) =>{
e.helper = (value: string) => {
e.cancel = true;
let temp: HTMLElement = document.createElement('div');
temp.innerHTML = value;
let scriptTag: HTMLElement = temp.querySelector('script') as HTMLElement;
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
return (
<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
The XSS prevention feature is only applicable when the editorMode is set to HTML.
Custom Cross-Site Scripting Prevention
For more precise control over XSS prevention, you can implement custom filtering logic using the beforeSanitizeHtml event.
Implementing Custom Cross-Site Scripting and Filtering in Rich Text Editor
- Use the beforeSanitizeHtml event to define custom filtering rules.
- Utilize the
helper
function from the event argument to apply your custom filters. - Set the
cancel
argument totrue
if you want to override the built-in XSS prevention entirely.
The following sample demonstrates how to filter the script
tag by value.
[Class-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
class App extends React.Component {
rteValue="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
onBeforeSanitizeHtml(e) {
e.helper = (value) => {
e.cancel = true;
let temp = document.createElement('div');
temp.innerHTML = value;
let scriptTag = temp.querySelector('script');
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar, BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
class App extends React.Component<{},{}> {
private rteValue:string ="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
public onBeforeSanitizeHtml(e: BeforeSanitizeHtmlArgs): void {
e.helper = (value: string) => {
e.cancel = true;
let temp: HTMLElement = document.createElement('div');
temp.innerHTML = value;
let scriptTag: HTMLElement = temp.querySelector('script') as HTMLElement;
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
function App() {
let rteValue="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>"
const onBeforeSanitizeHtml=(e) =>{
e.helper = (value) => {
e.cancel = true;
let temp = document.createElement('div');
temp.innerHTML = value;
let scriptTag = temp.querySelector('script');
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
return (<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar,BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
import { detach } from '@syncfusion/ej2-base';
function App(){
let rteValue:string="<div>Prevention of Cross Sit Scripting (XSS)</div><script>alert('hi')</script>";
const onBeforeSanitizeHtml=(e:BeforeSanitizeHtmlArgs) =>{
e.helper = (value: string) => {
e.cancel = true;
let temp: HTMLElement = document.createElement('div');
temp.innerHTML = value;
let scriptTag: HTMLElement = temp.querySelector('script') as HTMLElement;
if (scriptTag) {
detach(scriptTag);
}
return temp.innerHTML;
}
}
return (
<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
You can also filter out the e.selectors.tags
and e.selector.attributes
in the beforeSanitizeHtml event to control which HTML tags and attributes are allowed to appear.
For instance, if you want to display <iframe>
, By manipulating the e.selectors.tags
property in this event, you can selectively remove tags like <iframe>
. This approach ensures that your application can safely display iframe while preventing potential security risks associated with XSS vulnerabilities.
The following sample demonstrates how to filter the iframe
tag.
[Class-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteValue=`<div>Prevention of Cross-Site Scripting (XSS)</div><script>alert('hi')</script><iframe srcdoc="<p>The Rich Text Editor component is WYSIWYG ('what you see is what you get') editor that provides the best user experience to create and update the content. Users can format their content using standard toolbar commands.</p>"></iframe>`;
onBeforeSanitizeHtml(e) {
if (e.selectors && e.selectors.tags) {
e.selectors.tags = e.selectors.tags.filter((tag) => tag !== 'iframe:not(.e-rte-embed-url)');
e.selectors.tags = [('iframe[src^="https://"]')];
}
}
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar, BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
public rteValue: string = `<div>Prevention of Cross-Site Scripting (XSS)</div><script>alert('hi')</script><iframe srcdoc="<p>The Rich Text Editor component is WYSIWYG ('what you see is what you get') editor that provides the best user experience to create and update the content. Users can format their content using standard toolbar commands.</p>"></iframe>`;
public onBeforeSanitizeHtml(e: BeforeSanitizeHtmlArgs): void {
if (e.selectors && e.selectors.tags) {
e.selectors.tags = e.selectors.tags.filter((tag: string) => tag !== 'iframe:not(.e-rte-embed-url)');
e.selectors.tags = [('iframe[src^="https://"]')];
}
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} beforeSanitizeHtml={this.onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue = `<div>Prevention of Cross-Site Scripting (XSS)</div><script>alert('hi')</script><iframe srcdoc="<p>The Rich Text Editor component is WYSIWYG ('what you see is what you get') editor that provides the best user experience to create and update the content. Users can format their content using standard toolbar commands.</p>"></iframe>`;
const onBeforeSanitizeHtml=(e) =>{
if (e.selectors && e.selectors.tags) {
e.selectors.tags = e.selectors.tags.filter((tag) => tag !== 'iframe:not(.e-rte-embed-url)');
e.selectors.tags = [('iframe[src^="https://"]')];
}
}
return (<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
import { HtmlEditor, Image, Inject, Link, QuickToolbar,BeforeSanitizeHtmlArgs, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App(){
let rteValue:string = `<div>Prevention of Cross-Site Scripting (XSS)</div><script>alert('hi')</script><iframe srcdoc="<p>The Rich Text Editor component is WYSIWYG ('what you see is what you get') editor that provides the best user experience to create and update the content. Users can format their content using standard toolbar commands.</p>"></iframe>`;
const onBeforeSanitizeHtml=(e: BeforeSanitizeHtmlArgs)=> {
if (e.selectors && e.selectors.tags) {
e.selectors.tags = e.selectors.tags.filter((tag: string) => tag !== 'iframe:not(.e-rte-embed-url)');
e.selectors.tags = [('iframe[src^="https://"]')];
}
}
return (
<RichTextEditorComponent height={450} value={rteValue} beforeSanitizeHtml={onBeforeSanitizeHtml}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;