Html-react-parser: рдХреНрдпрд╛ рдПрдЪрдЯреАрдПрдордПрд▓-рд░рд┐рдПрдХреНрд╢рди-рдкрд╛рд░реНрд╕рд░ рдПрдХреНрд╕рдПрд╕рдПрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдорд╛рд░реНрдЪ 2019  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: remarkablemark/html-react-parser

рдореИрдВ рдЕрдкрдиреЗ рд╕реАрдПрдордПрд╕ рд╕реЗ рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓-рд░рд┐рдПрдХреНрд╢рди-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдХреНрд╕рдПрд╕рдПрд╕ рд╣рдорд▓реЛрдВ рд╕реЗ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдХрд░рддрд╛ рд╣реИ? https://stackoverflow.com/questions/29044518/safe-alternative-to-dangerouslysetinnerhtml#answer -48261046 рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд░реАрдбрдореЗ рдореЗрдВ рдХрд╣реАрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ/рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ sanitize-html рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ . рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп dompurify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдпрд╣ 10 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ CSS рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред

import parse, { domToReact } from 'html-react-parser'
import DOMPurify from 'dompurify'
import React from 'react'

// export function replaceNode() {}

export default function html(html, opts = {}) {
  return parse(DOMPurify.sanitize(html), {
    ...{
      replace: replaceNode,
    },
    ...opts,
  })
}

html('<iframe src=javascript:alert("xss")></iframe>')

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдмрдврд╝рд┐рдпрд╛ рд╕рд╡рд╛рд▓ @ рдбреЗрд╡-рд╕реНрдЯреАрд╡рдВрд╕-рдиреЗрдЯ!

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдЦреНрдд рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдирд╛ рдЪреБрдирд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╣рдорд▓реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ XSS рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЦрддрд░рдирд╛рдХ рд░реВрдк рд╕реЗ SetInnerHTML

рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рд╢реАрдШреНрд░ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдиреНрдпрд╡рд╛рджред

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди @ рдбреЗрд╡-рд╕реНрдЯреАрд╡рдВрд╕-рдиреЗрдЯ рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рд╣реЛ рд╕рдХрддреА рд╣реИ?

@ рдбреЗрд╡-рд╕реНрдЯреАрд╡рдВрд╕-рдиреЗрдЯ рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХреНрд╕рдПрд╕рдПрд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдЧрд▓рдд рдмрддрд╛рдпрд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХреНрд╕рдПрд╕рдПрд╕-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ dangerouslySetInnerHTML рдпрд╣рд╛рдВ рдирд┐рд░реНрднрд░ рдерд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА XSS рднреЗрджреНрдпрддрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдореЗрд░реА рдмреЗрд▓рд╛ рджреЗрдЦреЗрдВ, рдЬреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХреНрд╕рдПрд╕рдПрд╕ рд╣рдорд▓реЛрдВ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рднрд╛рдЧреНрдп рд╣реИред

рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг XSS рд╣рдорд▓реЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдФрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реА рдмреЗрд▓рд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ https://www.in-secure.org/misc/xss/xss.html рдкрд░ рдкрд╛рдпрд╛

рдореИрдВрдиреЗ sanitize-html рдкреИрдХреЗрдЬ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ

import React from 'react'
import sanitizeHtml from 'sanitize-html'

const Sanitize = ({ html }) => {
    const clean = sanitizeHtml(html, {
        allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'span']),
        allowedAttributes: {
           ...
        },
    })
    return (
        <span
            className="sanitized-html"
            dangerouslySetInnerHTML={{ __html: clean }}
        />
    )
}
export default Sanitize

рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ:

<Sanitize html={data.wordpressPage.title} />

@harveydf рдмрдврд╝рд┐рдпрд╛ рдЦреЛрдЬ! рдмреЗрд▓рд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП README.md рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА XSS рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рдореИрдВ sanitize-html рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ . рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп dompurify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдпрд╣ 10 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ CSS рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред

import parse, { domToReact } from 'html-react-parser'
import DOMPurify from 'dompurify'
import React from 'react'

// export function replaceNode() {}

export default function html(html, opts = {}) {
  return parse(DOMPurify.sanitize(html), {
    ...{
      replace: replaceNode,
    },
    ...opts,
  })
}

html('<iframe src=javascript:alert("xss")></iframe>')

dompurify @ k1sul1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ Repl.it рдбреЗрдореЛ рдмрдирд╛рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

shiglet picture shiglet  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

poacher2k picture poacher2k  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

christianfredh picture christianfredh  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

danielimmke picture danielimmke  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rscott78 picture rscott78  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ