Bunu React eğitiminde okudum. Ne anlama geliyor?
React güvenlidir. HTML dizeleri oluşturmuyoruz, bu nedenle XSS koruması varsayılandır.
React güvenliyse XSS saldırıları nasıl çalışır? Bu güvenliğe nasıl ulaşılır?
Bunu React eğitiminde okudum. Ne anlama geliyor?
React güvenlidir. HTML dizeleri oluşturmuyoruz, bu nedenle XSS koruması varsayılandır.
React güvenliyse XSS saldırıları nasıl çalışır? Bu güvenliğe nasıl ulaşılır?
Yanıtlar:
ReactJS tasarımı gereği oldukça güvenlidir
bu yüzden bunun gibi tipik bir saldırı işe yaramayacak
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>
fakat ...
dangerouslySetInnerHTML
Kullandığınızda dangerouslySetInnerHTML
içeriğin herhangi bir javascript içermediğinden emin olmanız gerekir. React burada sizin için hiçbir şey yapamaz.
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>
Örnek 1: javascript kullanma: kod
Sonucu görmek için "Kod pasajını çalıştır" -> "Web Sitem" seçeneğini tıklayın
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>
Örnek 2: Base64 kodlu verileri kullanma:
Sonucu görmek için "Kod pasajını çalıştır" -> "Web Sitem" seçeneğini tıklayın
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>
İşte daha fazla kaynak
React değişkenlerden sizin için otomatik olarak kaçar ... Zararlı Javascript ile string HTML üzerinden XSS enjeksiyonunu engeller. Doğal olarak, bununla birlikte girdiler de temizlenir.
Örneğin bu dizeye sahip olduğunuzu varsayalım
var htmlString = '<img src="javascript:alert('XSS!')" />';
bu dizgeyi tepki olarak oluşturmaya çalışırsanız
render() {
return (
<div>{htmlString}</div>
);
}
<span>
Öğe etiketi dahil tüm dizeyi sayfada kelimenin tam anlamıyla göreceksiniz . aka tarayıcıda göreceksiniz<img src="javascript:alert('XSS!')" />
kaynak html'yi görüntülerseniz görürsünüz
<span>"<img src="javascript:alert('XSS!')" />"</span>
İşte XSS saldırısının ne olduğuna dair biraz daha ayrıntı
İşaretleme ekleme render işlevinde unsurları kendiniz yaratamazsınız sürece temelde yapar Tepki ... bu varlık onlar onun adı verilen render böyle sağlayan bir işlevi var dedi dangerouslySetInnerHTML
... burada bu konuda biraz daha detay
Unutulmaması gereken birkaç şey var, React'in kaçtığını aşmanın yolları var. Daha yaygın bir yol, kullanıcıların bileşeniniz için sahne tanımlamasıdır. Kullanıcı girdisinden herhangi bir veriyi sahne olarak genişletmeyin!