Editor PHP Yuzai hari ini membawakan anda Soal Jawab Java tentang kerentanan "pemeriksaan timbunan". Dalam proses pembangunan perisian, semakan timbunan ialah kelemahan keselamatan biasa yang boleh dieksploitasi dengan mudah oleh penggodam untuk melakukan serangan berniat jahat. Melalui format Soal Jawab artikel ini, kami akan memberi anda pemahaman yang mendalam tentang definisi, prinsip dan kaedah pencegahan kelemahan pemeriksaan timbunan, membantu anda melindungi keselamatan sistem perisian anda dengan lebih baik.
Saya perlu menghantar kata laluan kepada panggilan. Jika saya melakukan ini
byte[] datasourcepasswddecoded = base64.getdecoder().decode(datasourcepasswdencoded); string datasourcepasswd = new string(datasourcepasswddecoded); hikaridatasource.setpassword(datasourcepasswd);
Apabila fortify mengimbas kod ini, dilaporkan bahawa kod tersebut mempunyai kerentanan "pemeriksaan timbunan" kerana memberikan kata laluan kepada rentetan.
fortify tidak akan merungut tentang kod asal:
hikaridatasource.setpassword(env.getproperty("spring.datasource.password"));
Walaupun env.getproperty() mengembalikan rentetan.
fortify mengesyorkan:
private JPasswordField pf; ... final char[] password = pf.getPassword(); // use the password ... // erase when finished Arrays.fill(password, ' ');
Tetapi bagaimana untuk menggunakan char[] sebagai kata laluan apabila fungsi menjangkakan rentetan?
Ya... Pengekodan Base64 kata laluan tidak melindungi sama sekali. Mana-mana penggodam dengan separuh otak tahu cara mengenal pasti dan menyahkod base64. Jadi "barang base64 pelik" anda tidak membantu.
Tetapi sebaliknya, pengimbas kerentanan anda menunjukkan masalah yang agak sukar untuk dieksploitasi dan mungkin tidak dapat diselesaikan.
Pada satu ketika dalam aplikasi (bergantungannya atau di suatu tempat) kata laluan akan ditukar kepada Java String
...因为某些 API 需要 String
。此时,无论扫描器是否告诉您,您都存在“堆检查”漏洞。例如,如果数据源使用 JDBC,则需要将该密码作为参数传递给 DriverManager.connect
调用。 connect
Terdapat 3 lebihan beban... tetapi semuanya memerlukan lulus kata laluan sebagai rentetan teks yang jelas. Menyelesaikan masalah ini adalah tidak praktikal.
(Nampaknya, apa yang dipanggil pembetulan yang dicadangkan oleh Fortify jelas tidak berfungsi. Dan ia tidak perasan bahawa panggilan anda kepada setPassword(env.getProperty("spring.datasource.password"))
hanyalah "buruk" untuk apa yang sedang anda lakukan. Ia adalah "keselamatan prestasi".. .)
Penyelesaian yang paling praktikal ialah memberitahu pengimbas bahawa ini adalah "positif palsu". Kemudian ambil langkah untuk menghalang penggodam daripada melampirkan penyahpepijat, menyemak RAM, pembuangan teras, menukar cakera, dsb., dan mencari timbunan untuk objek String yang mungkin mewakili kata laluan.
Terdapat juga penyelesaian "jahat" yang memerlukan String
menghancurkan melalui pengabstrakan jenis objek dan mengatasi tatasusunan sandarannya. Tetapi pendekatan ini rapuh.
String
的表示形式在 Java 的生命周期中已更改多次,每次更改都可能会破坏您的 String
telah berubah berkali-kali sepanjang hayat Java, dan setiap perubahan boleh memecahkan kod liputan String
的后备数组会与其他 String
Dalam sesetengah kes, tatasusunan sandaran String
可能已被复制或插入到其他 String
mungkin telah disalin atau dimasukkan ke dalam objek lain.
🎜 🎜Melainkan anda berurusan dengan 🎜maklumat sulit🎜, ini adalah (IMO) di atas. Jika anda mengendalikan maklumat sulit, sila selamatkan platform anda sebelum mengambil langkah ini. (Dan jangan bergantung pada perisian pengimbasan keselamatan yang bodoh untuk audit keselamatan!) 🎜Atas ialah kandungan terperinci Kerentanan "Pemeriksaan Timbunan".. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!