Question: I've got some user generated html markup from a text area and I'd like to render it on another part of the screen. The markup is saved as a string in the props of the component. 

I don't want to use dangerouslysethtml for obvious reasons. Is there a parser such as [marked](https://github.com/chjj/marked) but for html so that it strips out script tags and other invalid html.

Answer: 
Sanitize the html using the [sanitize-html](https://www.npmjs.com/package/sanitize-html) module, and render the sanitized string using [dangerouslySetInnerHTML](https://facebook.github.io/react/tips/dangerously-set-inner-html.html).

You can create a simple wrapper component:

```
const defaultOptions = {
  allowedTags: [ 'b', 'i', 'em', 'strong', 'a' ],
  allowedAttributes: {
    'a': [ 'href' ]
  },
  allowedIframeHostnames: ['www.youtube.com']
};

const sanitize = (dirty, options) => ({
  __html: sanitizeHtml(
    dirty, 
    options: { ...defaultOptions, ...options }
  )
});

const SanitizeHTML = ({ html, options }) => (
  <div dangerouslySetInnerHTML={sanitize(html, options)} />
);

```

**Usage:**

```
<SanitizeHTML html="<img src=x onerror=alert('img') />" />

```

---

You can also use [react-sanitized-html](https://www.npmjs.com/package/react-sanitized-html)'s SanitizedHTML component, which is a react wrapper around `sanitize-html`: 

```
<SanitizedHTML
  allowedAttributes={{ 'a': ['href'] }}
  allowedTags={['a']}
  html={ `<a href="http://bing.com/">Bing</a>` }
/>

```
For XSS filtering, there is a good alternative to [sanitize-html](https://www.npmjs.com/package/sanitize-html) written by security people, called [dompurify](https://www.npmjs.com/package/dompurify).

Here is how the wrapper from <https://stackoverflow.com/a/38663813/1762849> would look with DOMPurify:

```js
const defaultOptions = {
  ALLOWED_TAGS: [ 'b', 'i', 'em', 'strong', 'a' ], 
  ALLOWED_ATTR: ['href']
};

const sanitize = (dirty, options) => ({
  __html: DOMPurify.sanitize(
    dirty, 
    { ...defaultOptions, ...options }
  )
});

const SanitizeHTML = ({ html, options }) => (
  <div dangerouslySetInnerHTML={sanitize(html, options)} />
);

```

Usage:

```js
<SanitizeHTML html="<img src=x onerror=alert('img') />" />

```

---

Also, if you you need to sanitize HTML on client and server, consider using the [isomophic-dompurify](https://www.npmjs.com/package/isomorphic-dompurify) module which unifies use of DOMPurify on frontend and backend.