كيفية استخدام دالة eval() لتنفيذ النصوص البرمجية في Python

تمت الكتابة بواسطة: عبد الحكيم

تارخ آخر تحديث: 26 ديسمبر 2024

محتوى المقال

كيفية استخدام دالة eval() لتنفيذ النصوص البرمجية في Python

في Python، تُعد دالة eval() واحدة من الأدوات القوية والمثيرة للجدل في الوقت نفسه. تسمح لك هذه الدالة بتنفيذ تعبيرات Python المُمررة إليها كسلاسل نصية خلال وقت التشغيل. يعني هذا أنك تستطيع تحويل سلسلة نصية تحتوي على شيفرة برمجية إلى كود Python قابل للتنفيذ.

بينما تُعد eval() أداة قوية للغاية، يجب استخدامها بحذر نظرًا لأنها قد تشكل خطرًا أمنيًا إذا لم تتم إدارتها بشكل صحيح. في هذا المقال، سنتناول كيفية استخدام eval()، وكيفية التعامل مع مخاطرها، مع تقديم أمثلة عملية توضيحية.

ما هي دالة eval()؟

دالة eval() هي دالة مدمجة في Python تقوم بتقييم وتنفيذ تعبير Python مُمرر إليها على هيئة سلسلة نصية. تُستخدم عادةً لتنفيذ التعبيرات الرياضية، الدوال أو أي شيفرة برمجية بسيطة تُكتب كسلسلة نصية.

صيغة استخدام eval() هي:

eval('expression', globals=None, locals=None)

حيث expression هو سلسلة نصية تحتوي على تعبير Python، وglobals وlocals هما قواميس اختيارية تحتوي على المتغيرات العامة والمحلية التي يمكن استخدامها داخل التعبير.

أبسط استخدام لدالة eval()

دعونا نبدأ بأبسط استخدام لدالة eval(). يمكن استخدام eval() لتقييم العمليات الرياضية أو أي تعبيرات بسيطة مكتوبة على هيئة سلسلة نصية:

مثال: تقييم تعبير رياضي

expression = "3 + 4 * 2"
result = eval(expression)
print(result) # الناتج: 11

في هذا المثال، يقوم eval() بتقييم التعبير الرياضي "3 + 4 * 2"، والذي يعيد الناتج 11.

تنفيذ تعبيرات مع متغيرات باستخدام eval()

يمكن أيضًا استخدام eval() مع المتغيرات. إذا كنت ترغب في استخدام متغيرات معينة داخل التعبير المُمرر، يمكنك القيام بذلك عن طريق تمرير القواميس التي تحتوي على المتغيرات باستخدام المعاملين globals وlocals.

مثال: استخدام المتغيرات مع eval()

x = 10
expression = "x * 2"
result = eval(expression, globals())
print(result) # الناتج: 20

في هذا المثال، نقوم بتمرير المتغير x مع القيمة 10 إلى eval() باستخدام globals(). النتيجة تكون 20 بعد تنفيذ التعبير.

تقييم التعبيرات المعقدة

تستطيع eval() تقييم تعبيرات معقدة تتضمن دوال أو شروطًا منطقية. دعونا نرى بعض الأمثلة على ذلك.

مثال: تقييم تعبير يحتوي على دوال

def square(n):
    return n ** 2

expression = "square(5)"
result = eval(expression, globals())
print(result) # الناتج: 25

في هذا المثال، نستخدم دالة square() داخل التعبير المُمرر إلى eval(). يقوم eval() بتقييم التعبير وتنفيذ الدالة، مما يُعيد الناتج 25.

مخاطر استخدام eval()

رغم أن eval() قوية ومرنة، فإن استخدامها قد يكون محفوفًا بالمخاطر إذا تم تمرير تعبيرات غير آمنة. على سبيل المثال، إذا سمحت للمستخدمين بإدخال نصوص تُمرر إلى eval()، فقد يتمكنون من تنفيذ شيفرة خبيثة.

مثال: مخاطر الأمان في eval()

user_input = "__import__('os').system('rm -rf /')" # شيفرة ضارة
eval(user_input) # قد يؤدي إلى حذف الملفات إذا تم تنفيذه

في هذا المثال، يتم استخدام eval() لتنفيذ شيفرة ضارة تُحذف جميع الملفات من النظام. هذا مثال على ما يمكن أن يحدث إذا لم يتم تأمين eval() بشكل جيد. لذلك، يجب تجنب استخدام eval() مع مدخلات غير موثوقة.

كيفية تأمين استخدام eval()

لتأمين استخدام eval()، يجب عليك التحكم في السياق الذي تُنفذ فيه التعبيرات. يمكنك تحقيق ذلك من خلال تحديد القواميس globals وlocals، حيث يمكنك تقييد الدوال والمتغيرات المتاحة داخل التعبير.

مثال: استخدام eval() بأمان

expression = "a + b"
safe_globals = {'__builtins__': None, 'a': 10, 'b': 20}
result = eval(expression, safe_globals)
print(result) # الناتج: 30

في هذا المثال، قمنا بتعطيل الدوال المدمجة عن طريق تعيين '__builtins__' إلى None وتقييد المتغيرات المتاحة فقط إلى a وb. هذا يُقلل من مخاطر الأمان المرتبطة بـ eval().

بدائل أكثر أمانًا لـ eval()

بدلاً من استخدام eval()، هناك بدائل أكثر أمانًا في بعض الحالات. على سبيل المثال، يمكنك استخدام تعبيرات شرطية أو دوال مخصصة لتنفيذ المهام دون الحاجة إلى تنفيذ النصوص البرمجية مباشرة.

مثال: استخدام تعبيرات شرطية بدلاً من eval()

expression = 'addition'
if expression == 'addition':
    result = 10 + 20
print(result) # الناتج: 30

في هذا المثال، قمنا باستخدام تعبير شرطي لتنفيذ العمليات بدلاً من الاعتماد على eval(). يُعتبر هذا الخيار أكثر أمانًا لأنه لا يتضمن تنفيذ النصوص البرمجية.

متى يجب استخدام eval()؟

رغم أن eval() قوية، إلا أنه ينبغي استخدامها فقط في حالات معينة، مثل عندما تحتاج إلى تقييم تعبيرات بسيطة في بيئة مغلقة أو عند التعامل مع تعبيرات رياضية أو منطقية محددة بشكل صارم.

في المقابل، إذا كنت تتعامل مع مدخلات غير موثوقة أو بيانات من مستخدمين، فمن الأفضل تجنب استخدام eval() لصالح حلول أكثر أمانًا مثل التعابير الشرطية أو تحليل البيانات يدويًا.

الخلاصة

دالة eval() في Python تُعد أداة قوية لتقييم وتنفيذ النصوص البرمجية أثناء وقت التشغيل. يمكن استخدامها لتقييم تعبيرات بسيطة أو معقدة، لكن يجب التعامل معها بحذر لأنها قد تشكل خطرًا أمنيًا إذا لم تُستخدم بشكل صحيح. من خلال تقييد المتغيرات والبيئة التي تعمل فيها eval()، يمكنك تقليل المخاطر الأمنية المرتبطة بها. رغم ذلك، يُنصح بالبحث عن بدائل أكثر أمانًا في الحالات التي تكون فيها المخاطر مرتفعة.

طور مهاراتك: مقالات يجب قراءتها في البرمجة