我有一些在服务器端的配置文件中指定的JavaScript代码.由于我无法在配置语言(Lua)中指定JavaScript函数,因此我将其作为字符串.服务器返回一些JSON中的字符串,我让客户端使用清理函数解释它:
parse_fields = function(fields) {
for (var i = 0; i < fields.length; ++i) {
if (fields[i].sortType) {
sort_string = fields[i].sortType;
fields[i].sortType = eval(sort_string);
}
return fields;
}
};
Run Code Online (Sandbox Code Playgroud)
所以基本上它只是评估sortType它是否存在.问题是Firebug eval()在线路上报告了"语法错误" .当我在Firebug控制台上运行相同的步骤时,它没有任何问题,我可以按照我的预期执行该功能.我尝试了一些不同的变化:window.eval而不是简单的eval,存储sortType我上面所做的,并尝试对字符串进行小的变化.
的采样值fields[i].sortType是"function(value) { return Math.abs(value); }".这是我在Firebug控制台中进行的测试:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
Run Code Online (Sandbox Code Playgroud)
和Firebug中的错误本身:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
Run Code Online (Sandbox Code Playgroud)
可能相关的最后一点是,这些都包含在Ext JS onReady()函数中,Ext.ns …
假设我将变量的名称存储在另一个变量中:
myvar=123
varname=myvar
Run Code Online (Sandbox Code Playgroud)
现在,我想通过使用$ varname变量得到123.有直接的方法吗?我发现没有这样的bash内置用于按名称查找,所以想出了这个:
function var { v="\$$1"; eval "echo "$v; }
Run Code Online (Sandbox Code Playgroud)
所以
var $varname # gives 123
Run Code Online (Sandbox Code Playgroud)
这最终看起来并不太糟糕,但我想知道我是否错过了一些更明显的东西.提前致谢!
我正在尝试做一个instance_eval跟随attr_accessor内部initialize,我继续得到这个:``initialize':未定义的方法'attr_accessor'.为什么这不起作用?
代码看起来像这样:
class MyClass
def initialize(*args)
instance_eval "attr_accessor :#{sym}"
end
end
Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的代码:
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
this.i = [];
for (var i=1,j=0 ;i<9;i++) {
var k = eval("i"+i);
if (k > 0) {
this.i[j++] = k;
}
}
}
Run Code Online (Sandbox Code Playgroud)
FireBug profiler声称第二个最长的函数是eval(),占运行时间的近6%.
每个人都说eval是EVIL(就像糟糕的那样)而且很慢(正如我所发现的那样),但我真的无法做任何事情 - 服务器只是将数据从数据库中拉出来并推送到浏览器.
我有什么替代品?我可以像在服务器上做的那样做,但这只会将负担转移到链条上方.我无法更改数据库布局,因为所有内容都挂钩到这8个变量,这是一项艰巨的任务.
我知道JSON.parse()可以防止攻击者将javascript注入到响应中,因为JSON解析器只是一个文本解析器,而不是脚本解析器所以请不要关闭这个是关于这个问题的所有其他问题的重复.这是一个不同的问题.
如果攻击者可以劫持你的Ajax调用并将javascript放入Ajax调用,那么他们是否有可能劫持你的实际网页并将任意javascript放入你的页面中,他们可以完成同样的攻击?
当然,通过使用JSON.parse()而不是eval(),你没有什么可失去的(除非你的环境中还没有JSON解析器,并且必须添加更多代码才能获得),但是它真的是什么情况呢如果您的网页由与ajax呼叫相同的主机提供服务,请增加安全性吗?
我想这样做:
SELECT (EVAL 'SELECT 1') + 1;
Run Code Online (Sandbox Code Playgroud)
EVAL在PostgreSQL中有没有办法像这样做?
查看Kohana文档,我发现这非常有用,它们用于使用点表示法从多维数组中获取值,例如:
$foo = array('bar' => array('color' => 'green', 'size' => 'M'));
$value = path($foo, 'bar.color', NULL , '.');
// $value now is 'green'
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法以相同的方式设置数组值:
set_value($foo, 'bar.color', 'black');
Run Code Online (Sandbox Code Playgroud)
我发现这样做的唯一方法是重新构建数组表示法($ array ['bar'] ['color'])然后设置值..使用eval.
有什么想法避免评估?
如果在eval中发生正则表达式匹配,则在外部环境中看不到与捕获相关的变量($ 1等)的更改.这是一个错误吗?
perlop和perlre似乎没有提到任何这样的限制.
例如:
use strict; use warnings;
$_ = "hello";
eval '/(.*)/';
print "GOT: $1\n";
Run Code Online (Sandbox Code Playgroud)
得到:
Use of uninitialized value $1 in concatenation (.) or string at -e line 1.
GOT:
Run Code Online (Sandbox Code Playgroud)
更简洁的演示是:
perl -we '$_="foo"; eval q(/(.*)/;) ; print "GOT:$1\n";'
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Jython从Java中运行一段Python.如果我使用exec语句导入,一切正常.
PythonInterpreter pi = new PythonInterpreter();
pi.exec("import re");
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // returns a MatchObject
o = pi.eval("re.match('abc', 'def123')"); // returns Py.None
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将两条线组合在一起,那么所有的地狱都会破裂.这个:
PythonInterpreter pi = new PythonInterpreter();
pi.eval("import re"); // exception!
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // never gets here
o = pi.eval("re.match('abc', 'def123')"); // ....
Run Code Online (Sandbox Code Playgroud)
...引发异常"no viable alternative at input 'import'", ('<string>',1,0,'import re\n').
这很重要,因为理想情况下我希望能够将整个脚本作为单个字符串进行评估,而不必将导入分成单独的部分.难道我做错了什么?有没有另一种方法告诉Jython"采取这整个脚本,包括导入,然后运行它,然后给我一个结果"?这需要在运行时 - .class不能将Python预编译到文件中.
我遇到了一段代码,其中call包含另一个调用.例如:
a <- 1
b <- 2
# First call
foo <- quote(a + a)
# Second call (call contains another call)
bar <- quote(foo ^ b)
Run Code Online (Sandbox Code Playgroud)
我们可以使用eval(eval(foo))来评估调用,但是eval(bar)不起作用.这是在R尝试运行时"foo" ^ 2看到的(看作foo非数字对象).
如何评估这样的callception?