Masalah Asal:
Menggunakan eval() untuk pengguna -input yang diberikan boleh membahayakan. Bagaimanakah .literal_eval() modul ast boleh menawarkan alternatif yang lebih selamat?
Fungsi Eval:
Fungsi eval() menilai pernyataan Python. Input boleh menjadi rentetan yang mengandungi kod Python dan eval() mengembalikan hasil pelaksanaan kod tersebut.
Bahaya Eval:
Walau bagaimanapun, eval() boleh menjadi berbahaya kerana ia berpotensi untuk melaksanakan kod sewenang-wenangnya, malah kod yang anda tidak berniat. Contohnya, jika pengguna memberikan input seperti:
eval("import os; os.system('rm -rf *')")
Ia akan melaksanakan arahan yang memadamkan semua fail dalam direktori semasa.
Menggunakan Literal Eval:
Tidak seperti eval(), fungsi ast.literal_eval() hanya menilai literal angka, rentetan, boolean, dan kamus. Ini menjadikannya lebih selamat untuk mengendalikan data yang disediakan pengguna, kerana ia tidak akan melaksanakan kod sewenang-wenangnya. Contohnya, dalam kod yang disediakan:
datamap = ast.literal_eval(input('Provide some data here: '))
Kod hanya akan menilai input jika ia boleh dihuraikan sebagai kamus, menghalang sebarang kemungkinan risiko keselamatan. Jika input bukan kamus yang sah, ast.literal_eval() akan menimbulkan pengecualian. Oleh itu, ast.literal_eval() hendaklah sentiasa diutamakan berbanding eval() untuk memproses input yang tidak dipercayai.
Atas ialah kandungan terperinci Keselamatan Python: Bilakah Saya Harus Menggunakan `ast.literal_eval()` Daripada `eval()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!