Tukar Perwakilan Rentetan Kamus kepada Kamus Tanpa Menggunakan Eval
Tugas yang sedang dijalankan melibatkan menukar perwakilan rentetan kamus kepada kamus Python sebenar. Walaupun eval ialah pilihan yang mudah, terdapat kebimbangan tentang kelemahan keselamatannya. Artikel ini meneroka kaedah alternatif menggunakan fungsi ast.literal_eval terbina dalam.
Fungsi ast.literal_eval
ast.literal_eval ialah fungsi yang direka untuk menilai ungkapan yang mengandungi hanya struktur literal seperti rentetan, nombor, senarai, tupel, dict, boolean dan Tiada. Ia menyediakan pendekatan yang lebih selamat berbanding eval kerana ia mengehadkan input untuk mengelakkan potensi risiko keselamatan.
Penggunaan
Untuk menggunakan ast.literal_eval, import modul ast dan lulus perwakilan rentetan kamus sebagai hujah. Sebagai contoh, pertimbangkan rentetan berikut:
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Menukar rentetan ini kepada kamus menggunakan ast.literal_eval adalah semudah:
>>> ast.literal_eval(s) {'muffin': 'lolz', 'foo': 'kitty'}
Pertimbangan Keselamatan
Menggunakan ast.literal_eval secara berkesan melindungi daripada serangan suntikan yang mungkin timbul dengan eval. Eval membenarkan input pengguna dilaksanakan secara dinamik sebagai kod Python, meningkatkan risiko suntikan kod berniat jahat. Sebaliknya, ast.literal_eval mengehadkan input kepada hanya struktur literal, menghalang serangan sedemikian.
Contoh
Untuk menggambarkan perbezaan, bandingkan penilaian dua ungkapan berikut :
# Using eval, which can be risky eval("shutil.rmtree('mongo')") # Using ast.literal_eval, which is safer ast.literal_eval("shutil.rmtree('mongo')")
Seperti yang ditunjukkan, pendekatan tidak selamat menggunakan eval boleh membawa kepada kritikal ralat sistem, manakala ast.literal_eval dengan betul mengenal pasti rentetan yang cacat dan melontarkan ralat.
Kesimpulan
Ringkasnya, ast.literal_eval menawarkan kaedah yang selamat dan berkesan untuk menukar representasi rentetan kamus ke dalam kamus Python. Tidak seperti eval, ia melindungi daripada suntikan kod berniat jahat sementara masih membenarkan penilaian struktur literal. Ini menjadikannya pilihan yang ideal untuk mengendalikan input pengguna atau data daripada sumber yang tidak dipercayai.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Kamus Rentetan kepada Kamus Python Dengan Selamat Tanpa Menggunakan `eval`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!