Apabila bekerja dengan rentetan C, kerumitan pengurusan memori dan potensi risiko keselamatan boleh menjadi menakutkan. Antara fungsi manipulasi rentetan yang biasa digunakan, strncpy mempunyai reputasi yang terkenal kerana tidak selamat.
Tidak seperti rakan sejawatannya strcpy(), yang mana menyalin rentetan ke penimbal destinasi dan secara automatik menambahkan nol penamat watak, strncpy tidak menjamin penamatan NUL rentetan destinasi. Ketiadaan penamatan NUL ini mewujudkan kelemahan yang boleh dieksploitasi oleh kod hasad.
Salah satu eksploitasi utama yang melibatkan strncpy ialah serangan limpahan penimbal . Jika saiz penimbal destinasi tidak mencukupi untuk menampung keseluruhan rentetan sumber, strncpy boleh terus menulis melangkaui sempadan penimbal destinasi, berpotensi menimpa data kritikal atau melaksanakan kod hasad.
Selain itu, kekurangan NUL penamatan boleh membawa kepada tingkah laku yang tidak dijangka dalam operasi rentetan seterusnya. Fungsi seperti strcmp() dan strlen() bergantung pada aksara NUL untuk menentukan panjang rentetan dan melakukan perbandingan. Menggunakan rentetan yang tidak ditamatkan dengan fungsi ini boleh membawa kepada ralat dan hasil yang salah.
Pertimbangkan kod hipotesis berikut:
char dst[10]; strncpy(dst, "overflowexample", 10);
Memandangkan strncpy tidak NUL-menamatkan rentetan destinasi, ia mengandungi "contoh limpahan". Sekarang, mari kita anggap rentetan ini kemudiannya diproses oleh fungsi yang menganggap penamatan NUL:
strcmp(dst, "overflowexample");
Fungsi strcmp() akan mengembalikan 0, kerana ia tersilap mengandaikan bahawa rentetan berakhir pada aksara ke-10, mengabaikan watak NUL yang hilang. Perbandingan yang salah ini boleh membawa kepada laluan pelaksanaan yang tidak diingini atau pelanggaran keselamatan.
Walaupun strncpy mungkin kelihatan seperti pilihan yang mudah untuk penyalinan rentetan, kekurangan NUL. penamatan menjadikannya pilihan yang tidak selamat dalam banyak senario. Untuk manipulasi rentetan selamat, adalah disyorkan untuk menggunakan fungsi seperti strncpy_s() atau strlcpy(), yang secara eksplisit mengendalikan penamatan nol dan menghalang kemungkinan limpahan.
Atas ialah kandungan terperinci Mengapakah strncpy Dianggap sebagai Fungsi Penyalinan Rentetan Tidak Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!