मैंने इसे रिएक्ट ट्यूटोरियल पर पढ़ा। इसका क्या मतलब है?
प्रतिक्रिया सुरक्षित है। हम HTML स्ट्रिंग्स उत्पन्न नहीं कर रहे हैं इसलिए XSS सुरक्षा डिफ़ॉल्ट है।
यदि प्रतिक्रिया सुरक्षित है तो XSS हमले कैसे काम करते हैं? यह सुरक्षा कैसे हासिल की जाती है?
मैंने इसे रिएक्ट ट्यूटोरियल पर पढ़ा। इसका क्या मतलब है?
प्रतिक्रिया सुरक्षित है। हम HTML स्ट्रिंग्स उत्पन्न नहीं कर रहे हैं इसलिए XSS सुरक्षा डिफ़ॉल्ट है।
यदि प्रतिक्रिया सुरक्षित है तो XSS हमले कैसे काम करते हैं? यह सुरक्षा कैसे हासिल की जाती है?
जवाबों:
ReactJS डिज़ाइन के हिसाब से काफी सुरक्षित है
इसलिए इस तरह का एक विशिष्ट हमला काम नहीं करेगा
const username = "<img onerror='alert(\"Hacked!\")' src='invalid-image' />";
class UserProfilePage extends React.Component {
render() {
return (
<h1> Hello {username}!</h1>
);
}
}
ReactDOM.render(<UserProfilePage />, document.querySelector("#app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
परंतु ...
dangerouslySetInnerHTMLजब आप उपयोग करते हैं dangerouslySetInnerHTMLतो आपको यह सुनिश्चित करने की आवश्यकता होती है कि सामग्री में कोई जावास्क्रिप्ट नहीं है। प्रतिक्रिया यहाँ आपके लिए कुछ भी नहीं कर सकती।
const aboutUserText = "<img onerror='alert(\"Hacked!\");' src='invalid-image' />";
class AboutUserComponent extends React.Component {
render() {
return (
<div dangerouslySetInnerHTML={{"__html": aboutUserText}} />
);
}
}
ReactDOM.render(<AboutUserComponent />, document.querySelector("#app"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
उदाहरण 1: जावास्क्रिप्ट का उपयोग करना: कोड
परिणाम देखने के लिए "रन कोड स्निपेट" -> "मेरी वेबसाइट" पर क्लिक करें
const userWebsite = "javascript:alert('Hacked!');";
class UserProfilePage extends React.Component {
render() {
return (
<a href={userWebsite}>My Website</a>
)
}
}
ReactDOM.render(<UserProfilePage />, document.querySelector("#app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
उदाहरण 2: बेस 64 एन्कोडेड डेटा का उपयोग करना:
परिणाम देखने के लिए "रन कोड स्निपेट" -> "मेरी वेबसाइट" पर क्लिक करें
const userWebsite = "data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGFja2VkISIpOzwvc2NyaXB0Pg==";
class UserProfilePage extends React.Component {
render() {
const url = userWebsite.replace(/^(javascript\:)/, "");
return (
<a href={url}>My Website</a>
)
}
}
ReactDOM.render(<UserProfilePage />, document.querySelector("#app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
const customPropsControledByAttacker = {
dangerouslySetInnerHTML: {
"__html": "<img onerror='alert(\"Hacked!\");' src='invalid-image' />"
}
};
class Divider extends React.Component {
render() {
return (
<div {...customPropsControledByAttacker} />
);
}
}
ReactDOM.render(<Divider />, document.querySelector("#app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
यहाँ अधिक संसाधन हैं
प्रतिक्रिया स्वचालित रूप से आपके लिए चर से बच जाती है ... यह दुर्भावनापूर्ण जावास्क्रिप्ट के साथ स्ट्रिंग एचटीएमएल के माध्यम से एक्सएसएस इंजेक्शन को रोकता है .. स्वाभाविक रूप से, इसके साथ इनपुट भी पवित्र होते हैं।
उदाहरण के लिए मान लें कि आपके पास यह स्ट्रिंग है
var htmlString = '<img src="javascript:alert('XSS!')" />';
यदि आप प्रतिक्रिया में इस स्ट्रिंग को प्रस्तुत करने का प्रयास करते हैं
render() {
return (
<div>{htmlString}</div>
);
}
आप सचमुच <span>तत्व टैग सहित पूरे स्ट्रिंग पृष्ठ पर देखेंगे । ब्राउज़र में उर्फ आप देखेंगे<img src="javascript:alert('XSS!')" />
यदि आप स्रोत HTML देखते हैं तो आप देखेंगे
<span>"<img src="javascript:alert('XSS!')" />"</span>
यहां एक XSS हमले के बारे में कुछ और विवरण दिए गए हैं
React मूल रूप से इसे बनाता है ताकि आप मार्कअप न डाल सकें जब तक कि आप रेंडर फंक्शन में एलिमेंट्स खुद नहीं बनाते ... कहा जा रहा है कि उनके पास एक फंक्शन है जो इस तरह के रेंडर को इसकी अनुमति देता है dangerouslySetInnerHTML... यहाँ इसके बारे में कुछ और विस्तार से बताया गया है
ध्यान देने योग्य कुछ बातें, रिएक्ट से बच निकलने के रास्ते हैं। एक और सामान्य तरीका यह है कि जब उपयोगकर्ता आपके घटक के लिए प्रॉपर परिभाषित करते हैं। प्रॉप के रूप में उपयोगकर्ता इनपुट से किसी भी डेटा का विस्तार न करें!