2013-05-23 8 views
7

हम जानते हैं कि अजगर के eval() बुराईSymPy की सहानुभूति कितनी सुरक्षित है (<string>) .evalf()?

http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

है और StackOverflow भर धागे SymPy के evalf() उपयोग करने के लिए सुझाव देते हैं।

पाइथन नौसिखिया के रूप में, मैं वास्तव में खुद को यह विश्वास नहीं कर सकता कि evalf() सुरक्षित है क्योंकि मुझे कौशल की कमी है। क्या कोई evalf() क्या (अलग) पर विस्तार कर सकता है?

+0

'eval' के बजाय 'evalf' का उपयोग करने के लिए कोई सुझाव नहीं है क्योंकि उनके पास कुछ भी सामान्य नहीं है। 'Eval' के बजाय 'sympify' का उपयोग करने के लिए सुझाव हैं, लेकिन (सुरक्षा दृष्टिकोण से) वे गुमराह हैं क्योंकि ये मूल रूप से समान हैं। – Krastanov

उत्तर

7

अजगर eval के बीच आम कुछ भी नहीं है और sympy evalf (उत्तरार्द्ध sympy अभिव्यक्ति पेड़ों की अंकीय मान की गणना के लिए है और यह, कुछ भी नहीं पार्स के साथ क्या करना है eval एक स्ट्रिंग को पार्स और के रूप में यह मूल्यांकन के बारे में सब है, जबकि अगर यह कोड है)।

दूसरी ओर, sympifyeval जितना खतरनाक है, क्योंकि यह वास्तव में eval का उपयोग करता है।

दो मूल मोड जिसमें sympify प्रयोग किया जाता है कर रहे हैं और शायद यह एक बुरा विचार है कि वे एक ही समारोह में मिलाया गया है:

  • sympify(some_object) वस्तु का प्रतिनिधित्व में उपयोग के लिए अधिक उपयुक्त वापसी होगी एक कैस, sympy.Integer(1)

  • sympify("some_text") में int(1) बदलने eval के माध्यम से लगभग सीधे पाठ पार्स की तरह (आयात के लिए sympy.parsing वर्तमान सेखोजऔर इसका पालन करें)। यह सुरक्षित है क्योंकि कुछ बाधाएं हैं लेकिन यह सुरक्षित नहीं है

+0

आपके उत्तर के लिए धन्यवाद। क्या आप कृपया दूसरे मूल मोड पर विस्तारित कर सकते हैं, 'सहानुभूति ("कुछ पाठ") ', और इसका दुर्भावनापूर्ण तरीके से शोषण कैसे किया जा सकता है? उदाहरण के लिए, [नेड बैटचेल्डर का eval खतरनाक] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) उदाहरण SymPy में काम करता है? ईजी कॉलिंग 'एफ = sympy.sympify (' __ आयात __ ("ओएस") ')' मुझे एक कॉल करने योग्य वस्तु नहीं देता है। –

+2

ठीक है, मैं sypify का उपयोग करके 'subprocess.Popen' तक पहुंच प्राप्त करने और सिस्टम कमांड चलाने के लिए सक्षम था, ईजी 'f = sympy.sympify (" "" [] .__ वर्ग __.__ आधार __.__ उपclasses __() [158] (' ls ') "" ")' 'मेरी निर्देशिका सामग्री सूचीबद्ध है। वहां से 'आरएम-आरएफ \' के लिए बस एक आसान कदम है। अच्छी तरह से किया [@ Krastanov] (http://stackoverflow.com/users/669329/krastanov) आपने सिद्ध किया है कि sympy ** ** सुरक्षित नहीं है! सिम्पी खतरनाक है। –

संबंधित मुद्दे