Maison >développement back-end >Tutoriel Python >Pirater les fonctions Python en modifiant leur code source
Bienvenue dans le prochain tutoriel piko !
Changer le comportement d'une fonction en modifiant manuellement son implémentation est évident, mais pouvons-nous d'une manière ou d'une autre perturber les implémentations des fonctions au moment de l'exécution de l'application ? Organisons ce processus en 3 étapes :
Apprenons d'abord comment obtenir un code source de la fonction :
# Import inspect module import inspect # Define some callback function def function(): print('Do something') source_code = inspect.getsource(function) print(source_code)
Sortie :
def callback(): print('Do something')
Voyons maintenant comment convertir du code Python arbitraire fourni dans une chaîne en un objet Python appelable :
# 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()
Sortie :
Hello from the inside of the string!
Implémentons maintenant une fonction qui prend en entrée un pointeur de fonction et renvoie un objet appelable avec le code source modifié :
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
Il est temps de le tester !
# 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()
Sortie :
Hello You didn't expect me here!
Remarque pour les débutants : veuillez garder à l'esprit que de telles expériences sont réalisées principalement à des fins éducatives. L'utilisation de la fonction exec() peut introduire de graves problèmes de sécurité, il n'est donc pas recommandé de l'utiliser dans un environnement de production. Si vous devez modifier le comportement d'une fonction dont vous n'avez pas accès au code source, envisagez plutôt d'utiliser des décorateurs de fonctions. Soyez toujours prudent et assurez-vous de bien comprendre les implications en matière de sécurité avant d'utiliser exec().
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!