Rumah >pembangunan bahagian belakang >Tutorial Python >Menggodam fungsi Python dengan menukar kod sumbernya
Selamat datang ke pikoTutorial seterusnya!
Menukar gelagat fungsi dengan mengubah suai pelaksanaannya secara manual adalah jelas, tetapi bolehkah kita entah bagaimana mengacaukan pelaksanaan fungsi pada masa jalan aplikasi? Mari atur proses ini dalam 3 langkah:
Mari kita pelajari dahulu cara mendapatkan kod sumber fungsi:
# Import inspect module import inspect # Define some callback function def function(): print('Do something') source_code = inspect.getsource(function) print(source_code)
Output:
def callback(): print('Do something')
Sekarang mari lihat cara menukar beberapa kod Python sewenang-wenang yang disediakan dalam rentetan kepada objek Python boleh dipanggil:
# Source code that we want to execute source_code = 'print("Hello from the inside of the string!")' # Wrap the source code into a function definition, so that it can be accessed by name function_name = 'print_hello' function_definition = f'def {function_name}():\n {source_code}' namespace = {} # Execute code with a function definition within the given namespace, so that the function definition is created exec(function_definition, namespace) # Retrieve function from the namespace and save to a callable variable print_hello = namespace[function_name] # Call the function print_hello()
Output:
Hello from the inside of the string!
Sekarang mari kita laksanakan fungsi yang mengambil sebagai input penuding fungsi dan mengembalikan objek boleh dipanggil dengan kod sumber yang diubah suai:
import inspect def get_hacked_function(function): # Get the source code of the given function original_function_source_code = inspect.getsource(function) # Append a new line to the function source code modified_function_source_code = f'{original_function_source_code} print("You didn\'t expect me here!")' # Call the function within the namespace namespace = {} exec(modified_function_source_code, namespace) # Parse function name by taking everything what's between "def " and "(" at the first line function_name = original_function_source_code.split('(')[0].split()[1] # Retrieve modified function modified_function = namespace[function_name] # Return modified function return modified_function
Sudah tiba masanya untuk mengujinya!
# This is the function passed as an input def original_function(): print("Hello") # Call our hacking function hacked_function = get_hacked_function(original_function) # Call the modified function hacked_function()
Output:
Hello You didn't expect me here!
Nota untuk pemula: sila ingat bahawa eksperimen sedemikian dilakukan terutamanya untuk tujuan pendidikan. Menggunakan fungsi exec() boleh memperkenalkan isu keselamatan yang serius, jadi tidak disyorkan untuk menggunakannya dalam persekitaran pengeluaran. Jika anda perlu mengubah suai gelagat fungsi yang kod sumbernya anda tidak mempunyai akses, pertimbangkan untuk menggunakan penghias fungsi. Sentiasa berhati-hati dan pastikan anda memahami sepenuhnya implikasi keselamatan sebelum menggunakan exec().
Atas ialah kandungan terperinci Menggodam fungsi Python dengan menukar kod sumbernya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!