рдореИрдВ рдЕрдкрдиреЗ рд╕реАрдПрдордПрд╕ рд╕реЗ рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓-рд░рд┐рдПрдХреНрд╢рди-рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдХреНрд╕рдПрд╕рдПрд╕ рд╣рдорд▓реЛрдВ рд╕реЗ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕реНрд╡рдЪреНрдЫ рдХрд░рддрд╛ рд╣реИ? https://stackoverflow.com/questions/29044518/safe-alternative-to-dangerouslysetinnerhtml#answer -48261046 рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд░реАрдбрдореЗ рдореЗрдВ рдХрд╣реАрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ/рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдмрдврд╝рд┐рдпрд╛ рд╕рд╡рд╛рд▓ @ рдбреЗрд╡-рд╕реНрдЯреАрд╡рдВрд╕-рдиреЗрдЯ!
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдЦреНрдд рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдирд╛ рдЪреБрдирд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╣рдорд▓реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ 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>')
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ sanitize-html рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ . рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп dompurify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдпрд╣ 10 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ CSS рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред
html('<iframe src=javascript:alert("xss")></iframe>')