Eval
在一些程序语言中,eval 是一个把字符串当作表达式执行而返回一个结果的函数;在另一些之中,它执行多行的代码就好像它们被包括在其中,而不是包括 安全风险当使用 session['authenticated'] = False
data = get_data()
foo = eval(data)
一个攻击者可以让字符串 使用对 比如说, $name = 'John Doe';
$greeting = 'Hello';
$template = '"$greeting, $name! How can I help you today?"';
print eval("return $template;");
尽管这确实有用,它可能导致一些安全问题 (见安全风险),而且比其它的解决方案慢很多。一个更快和更安全的解决方案可以是改变最后一行为
也许 出于表达式求值的目的,eval 相比表达式解析器的主要优势在于,在 实施在直译语言中, 程序语言JavaScript在 JavaScript 中, 如下示例是一个表达式求值器: foo = 2;
alert(eval('foo + 2'));
如下示例则是一个语句执行器。 foo = 2;
eval('foo = foo + 2;alert(foo);');
JavaScript 的 ActionScript在 ActionScript (Flash 的编程语言) 中, ActionScript 3 不支持 eval。 ActionScript 3 Eval Library[2] 和 D.eval API[3] 是进行中的用以在 ActionScript 3 中创建 LispLisp 是首先使用 Lisp Lisp 中的 这是一个示例 Lisp 代码: ; A form which calls the + function with 1,2 and 3 as arguments.
; It returns 6.
(+ 1 2 3)
; In lisp any form is meant to be evaluated, therefore
; the call to + was performed.
; We can prevent Lisp from performing evaluation
; of a form by prefixing it with "'", for example:
(setq form1 '(+ 1 2 3))
; Now form1 contains a form that can be used by eval, for
; example:
(eval form1)
; eval evaluated (+ 1 2 3) and returned 6.
Lisp 众所周知的非常灵活, (eval (read-from-string "(format t \"Hello World!!!~%\")"))
主要造成混淆的一点是这个问题,即在哪个上下文中这个形式中的符号会被求值。在上述示例中, ;; Define some simple form as in the above example.
(define form2 '(+ 5 2))
;Value: form2
;; Evaluate the form within the initial context.
;; A context for evaluation is called an "environment" in Scheme slang.
(eval form2 user-initial-environment)
;Value: 7
;; Confuse the initial environment, so that + will be
;; a name for the subtraction function.
(environment-define user-initial-environment '+ -)
;Value: +
;; Evaluate the form again.
;; Notice that the returned value has changed.
(eval form2 user-initial-environment)
;Value: 3
Perl在 Perl 中, 一个表达式求值器的示例: $foo = 2;
print eval('$foo + 2'), "\n";
一个语句执行器的示例: $foo = 2;
eval('$foo += 2; print "$foo\n";');
(注意字符串的引号。注意单引号在上述示例中被用来引用字符串。如果使用的是双引号,它将会在把该字符串传入 Perl 也有 PHP在 PHP 中, 参考来源
|
Portal di Ensiklopedia Dunia