safe_eval.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #encoding=utf-8
  2. #code by ZPCCZQ
  3. #2015-08-25
  4. import re
  5. def safe_eval(eval_str,**kw):
  6. '''
  7. 安全eval,确保eval的内容是合法的,并且隔离的。
  8. **kw为可定义命名空间。
  9. '''
  10. #callback functions
  11. def start_structure(scanner, token): return "start structure", token
  12. def key(scanner, token): return "key", token
  13. def value(scanner, token):
  14. #非法写法
  15. if token.lower() == 'true'and token != 'True':
  16. raise 'value Error "%s"'%token
  17. def str_value(scanner,token):
  18. return "string value",token
  19. def end_structure(scanner, token): return "end start structure",token
  20. scanner = re.Scanner([
  21. (r"[{\[(]", start_structure),
  22. (r"[\w]+\s*:", key),
  23. (r"['\"][^'\"]+['\"]",str_value),
  24. (r"[\w]+", value),
  25. (r"\s*,\s*",None),
  26. (r"[})\]]", end_structure),
  27. ])
  28. tokens, remainder = scanner.scan(eval_str)
  29. #make a list of safe functions
  30. safe_list = ['math','acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
  31. #use the list to filter the local namespace s
  32. safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
  33. #add any needed builtins back in.
  34. #由于所有内置的对象被屏蔽 __builtins__中的所有对象不可使用,所以True、False需要单独定义
  35. #加入命名空间
  36. safe_dict['True'] = True
  37. safe_dict['False'] = False
  38. safe_dict['sum'] = sum
  39. safe_dict['map'] = map
  40. safe_dict['filter'] = filter
  41. safe_dict['reduce'] = reduce
  42. safe_dict['abs'] = abs
  43. safe_dict['divmod'] = divmod
  44. safe_dict['round'] = round
  45. for k in kw:
  46. if k not in safe_dict:
  47. safe_dict[k]=kw[k]
  48. return eval(eval_str,{'__builtins__':None},safe_dict)
  49. if __name__ == '__main__':
  50. pass