cover-img

Code Smell 245 - exec() and eval()

A great door for hackers

4 April, 2024

57

57

0

TL;DR: Don't use metaprogramming. It is not that cool

Problems

  • Security
  • Limited Control

Solutions

  1. Use direct calls
  2. Wrap the execution in a primitive and controlled command
  3. Sanitize it

Context

Developers employ the eval() and exec() functions to evaluate arbitrary expressions from strings.

They can be a powerful tool in certain contexts but come with several risks and problems, especially when used with untrusted input or where the code's behavior is not fully controlled or understood.

Sample Code

Wrong

def calculate(mathOperand, firstArgument, secondArgument):
return eval(f'{firstArgument} {mathOperand} {secondArgument}')

# Sample usage to multiply two numbers
result = calculate('*', 4, 6)

# Injection to remove all files
calculate('', "__import__('os').system('rm -rf *')",''))

Right

def calculate(mathOperand, firstArgument, secondArgument):
if mathOperand == '+':
return firstArgument + secondArgument
elif mathOperand == '-':
return firstArgument - secondArgument
elif mathOperand == '*':
return firstArgument * secondArgument
elif mathOperand == '/':
if secondArgument != 0:
return firstArgument / secondArgument
else:
return "Error: Division by zero"
else:
return "Error: Invalid operation - Do not hack!"

# This is a quick solution but another smell
# You should avoid this kind of switches and iterate to
# a Polymorphic Hierarchy

Detection

[X] Automatic

You can search for eval() in the code

Tags

  • Metaprogramming

Level

[x] Intermediate

AI Assistants

Most AI Assistants avoid using eval() in their solutions.

They also recognize it as a code smell and offer different options

Conclusion

Avoid this metaprogramming solution by hardcoding all the possible scenarios and avoiding over-generalizations.

Relations

Code Smell 207 - Dynamic Methods

Code Smell 189 - Not Sanitized Input

Code Smell 215 - Deserializing Object Vulnerability

More Info

Laziness I - Metaprogramming

Disclaimer

Code Smells are my opinion.

Credits

Photo by Yang on Unsplash


When you actually sit down to write some code, you learn things that you didnít get from thinking about them in modeling termsÖthere is a feedback process there that you can only really get at from executing some things and seeing what works.

Martin Fowler

Software Engineering Great Quotes


This article is part of the CodeSmell Series.

How to Find the Stinky Parts of your Code

57

57

0

Maxi Contieri

Buenos Aires, Argentina

🎓Learn something new every day.📆 💻CS software engineer 👷coding👨🏽‍🏫teaching ✍🏾writing 🎨Software Design 🏢SOLID 🌉TDD 👴Legacy 💩Code Smells

More Articles

Showwcase is a professional tech network with over 0 users from over 150 countries. We assist tech professionals in showcasing their unique skills through dedicated profiles and connect them with top global companies for career opportunities.

© Copyright 2024. Showcase Creators Inc. All rights reserved.