यह वह समाधान है जिसके साथ मैं गया था। इस दृष्टिकोण की सुरक्षा की चर्चा के लिए, देखें
arifwn के लिए धन्यवाद, मैं पायथन के ast
(सार वाक्य रचना पेड़) मॉड्यूल की खोज में मिला है। यह मॉड्यूल पेड़ को पार करने के लिए कक्षा ast.NodeVisitor
प्रदान करता है। यह कोड एक वाक्यविन्यास परीक्षक बनाने के लिए NodeVisitor
उप-वर्ग बनाता है जो मूल गणित के लिए आवश्यक कोड को श्वेतसूची में डाल देता है। फ़ंक्शन कॉल और नाम विशेष रूप से निगरानी की जाती हैं, क्योंकि केवल कुछ फ़ंक्शंस की अनुमति होनी चाहिए और केवल अप्रयुक्त नामों की अनुमति होनी चाहिए।
import ast
allowed_functions = set([
#math library
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf',
'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod',
'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp',
'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians',
'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc',
#builtins
'abs', 'max', 'min', 'range', 'xrange'
])
allowed_node_types = set([
#Meta
'Module', 'Assign', 'Expr',
#Control
'For', 'If', 'Else',
#Data
'Store', 'Load', 'AugAssign', 'Subscript',
#Datatypes
'Num', 'Tuple', 'List',
#Operations
'BinOp', 'Add', 'Sub', 'Mult', 'Div', 'Mod', 'Compare'
])
safe_names = set([
'True', 'False', 'None'
])
class SyntaxChecker(ast.NodeVisitor):
def check(self, syntax):
tree = ast.parse(syntax)
self.passed=True
self.visit(tree)
def visit_Call(self, node):
if node.func.id not in allowed_functions:
raise SyntaxError("%s is not an allowed function!"%node.func.id)
else:
ast.NodeVisitor.generic_visit(self, node)
def visit_Name(self, node):
try:
eval(node.id)
except NameError:
ast.NodeVisitor.generic_visit(self, node)
else:
if node.id not in safe_names and node.id not in allowed_functions:
raise SyntaxError("%s is a reserved name!"%node.id)
else:
ast.NodeVisitor.generic_visit(self, node)
def generic_visit(self, node):
if type(node).__name__ not in allowed_node_types:
raise SyntaxError("%s is not allowed!"%type(node).__name__)
else:
ast.NodeVisitor.generic_visit(self, node)
if __name__ == '__main__':
x = SyntaxChecker()
while True:
try:
x.check(raw_input())
except Exception as e:
print e
ध्यान दें कि यह कोड का केवल गणितीय भाग को स्वीकार करने के लिए बनाया गया है, समारोह परिभाषा और वापसी कथन प्रदान की जाती हैं।
सभी आवश्यक सुरक्षित संरचनाओं को श्वेतसूची और विशेष रूप से आवश्यक असुरक्षित संरचनाओं को श्वेतसूची में डालने की यह विधि, पाइथन के कई उपयोगी सबसेट बनाने के लिए संशोधित की जा सकती है; उपयोगकर्ता स्क्रिप्ट के लिए उत्कृष्ट!
ध्यान दें कि इसे सुरक्षित रूप से निष्पादित करने के लिए, यह समय समाप्ति के साथ अपने स्वयं के धागे में होना चाहिए, नाम टकराव को कम करने और उपयोगकर्ता कोड एक अनंत लूप या इसी तरह उत्पन्न करता है।
मैं वास्तव में एक पीपीपी सैंडबॉक्स का उपयोग करता हूं। –
मैंने पढ़े कई अन्य उत्तरों को इसके खिलाफ मतदान किया ... इसलिए मैंने वास्तव में पीपीपी में नहीं देखा है - मैं इसे देखता हूं धन्यवाद – SudoNhim
महान सवाल, शायद पीपीपी जवाब है। आज लूआ की तुलना में पाइथन थोड़ी कम हो सकती है, इस बारे में आज बात कर रही थी। –