Saya membaca ini di tutorial React. Apa artinya ini?
Bereaksi aman. Kami tidak membuat string HTML jadi perlindungan XSS adalah defaultnya.
Bagaimana cara kerja serangan XSS jika React aman? Bagaimana keamanan ini tercapai?
ReactJS secara desain cukup aman sejak saat itu
jadi serangan biasa seperti ini tidak akan berhasil
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>
tapi ...
dangerouslySetInnerHTML
Saat Anda menggunakan, dangerouslySetInnerHTML
Anda perlu memastikan konten tidak mengandung javascript. React tidak dapat melakukan apa pun di sini untuk Anda.
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>
Contoh 1: Menggunakan javascript: code
Klik "Jalankan cuplikan kode" -> "Situs Saya" untuk melihat hasilnya
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>
Contoh 2: Menggunakan data berenkode base64:
Klik "Jalankan cuplikan kode" -> "Situs Saya" untuk melihat hasilnya
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>
Berikut lebih banyak sumber daya
React secara otomatis meloloskan variabel untuk Anda ... Ini mencegah injeksi XSS melalui string HTML dengan Javascript berbahaya .. Biasanya, masukan dibersihkan bersama ini.
Misalnya, Anda memiliki string ini
jika Anda mencoba membuat string ini bereaksi
Anda benar-benar akan melihat di halaman seluruh string termasuk
<span>
tag elemen. alias di browser Anda akan melihat<img src="javascript:alert('XSS!')" />
jika Anda melihat html sumber, Anda akan melihat
Berikut adalah beberapa detail lebih lanjut tentang apa itu serangan XSS
React pada dasarnya membuatnya sehingga Anda tidak dapat menyisipkan markup kecuali Anda membuat elemen sendiri dalam fungsi render ... yang dikatakan memiliki fungsi yang memungkinkan rendering tersebut dipanggil
dangerouslySetInnerHTML
... berikut ini beberapa detail lebih lanjut tentangnyaEdit:
Beberapa hal yang perlu diperhatikan, ada cara untuk menghindari apa yang lolos React. Satu cara yang lebih umum adalah ketika pengguna mendefinisikan props ke komponen Anda. Jangan memperluas data apa pun dari input pengguna sebagai alat peraga!
sumber