标签: eval

如何安全地"评估"网页中的用户代码?

我正在开发一个webapp来教授编程概念.网页上有一些关于编程概念的文本,然后让用户在javascript代码中键入文本编辑器窗口以尝试回答编程问题.当用户点击"提交"时,我会分析他们输入的文本以查看他们是否已解决问题.例如,我要求他们"编写一个命名f为其参数添加三个的函数".

以下是我正在分析用户文本的内容:

  1. 使用严格设置在文本上运行JSLint,特别是不使用浏览器或控制台功能.
  2. 如果有任何错误,请显示错误并停止.
  3. eval(usertext);
  4. 循环通过赋值的条件,eval(condition).一个例子是"f(1)===4".条件来自可靠来源.
  5. 显示通过/失败的条件.

我的问题:这是否足以防止安全问题?我还能做些什么才能成为偏执狂?有没有更好的方法来做我想要的?

如果它是相关的我的应用程序是在使用Python后端的Google App Engine上,使用JQuery,具有单独的用户帐户.

javascript security eval jslint

11
推荐指数
1
解决办法
2635
查看次数

比eval更快的替代方案?

我正在处理一个使用本土模板系统的Web应用程序,该系统允许将Perl代码嵌入到HTML中.这些语句由模板解析器在运行时使用执行eval EXPR.

这非常灵活,但这些陈述遍布各地,并且执行得很多.eval EXPR(相反eval BLOCK)需要Perl每次启动解释器,我的分析显示它们是减速的一个相当重要的来源.

许多嵌入式Perl语句非常简单.例如,模板可能有这样的行:

<p>Welcome, <!--E: $user->query('name') -->.
Run Code Online (Sandbox Code Playgroud)

要么:

<p>Ticket number <!--E: $user->generate_ticket_number() --> has been generated.
Run Code Online (Sandbox Code Playgroud)

也就是说,他们只是调用对象方法.但是,也有更复杂的问题.

我希望能够优化这一点,到目前为止有两个想法,这两个想法都很糟糕.首先是重写所有模板替换标记一样简单的调用USER:NAMEUSER:GENERATETICKETNUMBER,其中解析器将然后扫描,并调用合适的对象方法.但是,我没有处理混合HTML和Perl的模板,而是使用混合HTML,Perl和令牌的模板.

第二个想法是尝试解析嵌入的Perl,弄清楚语句想要做什么,如果它足够简单,通过符号引用调用适当的对象方法.这显然是疯了.

我有什么逻辑解决方案可以忽略吗?

perl performance eval

11
推荐指数
1
解决办法
1118
查看次数

Matlab函数处理工作区shenanigans

简而言之:是否有一种优雅的方式来限制匿名函数的范围,或者在这个例子中是否有Matlab破坏?

我有一个函数创建一个在管网解算器中使用的函数句柄.它接受一个网络状态作为输入,其中包括有关管道及其连接的信息(如果必须,还包括边和顶点),构造一个大字符串,在函数形式时将返回一个大矩阵,并"evals"该字符串以创建句柄.

function [Jv,...] = getPipeEquations(Network)
... %// some stuff happens here

Jv_str = ['[listConnected(~endNodes,:)',...
    ' .* areaPipes(~endNodes,:);\n',...
    anotherLongString,']'];

Jv_str = sprintf(Jv_str); %// This makes debugging the string easier

eval(['Jv = @(v,f,rho)', Jv_str, ';']);
Run Code Online (Sandbox Code Playgroud)

这个函数按预期工作,但每当我需要保存包含此函数句柄的后续数据结构时,它需要一个可笑的内存量(150MB) - 巧合的是在创建此函数时整个Matlab工作区(~~) 150MB).这个函数处理的变量需要来自getPipeEquations工作区并不是特别大,但是当我检查函数句柄时,更疯狂的是:

>> f = functions(Network.jacobianFun)
f = 

     function: [1x8323 char]
         type: 'anonymous'
         file: '...\pkg\+adv\+pipe\getPipeEquations.m'
    workspace: {2x1 cell}
Run Code Online (Sandbox Code Playgroud)

...工作区字段包含getPipeEquations具有的所有内容(顺便说一句,它不是整个Matlab工作区).

如果我改为将eval语句移动到子函数以试图强制范围,则句柄将更加紧凑(~1MB):

function Jv = getJacobianHandle(Jv_str,listConnected,areaPipes,endNodes,D,L,g,dz)
eval(['Jv = @(v,f,rho)', Jv_str, ';']);
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?是否有更优雅的方式来限制此匿名函数的范围?

作为附录,当我多次运行包含此函数的模拟时,清除工作空间变得非常缓慢,这可能与Matlab处理函数及其工作空间有关,也可能与之无关.

matlab closures scope eval anonymous-function

11
推荐指数
1
解决办法
1595
查看次数

不使用eval/new函数的JavaScript模板库

使用的Google Chrome扩展程序manifest_version: 2限制使用evalnew Function.我检查的所有JavaScript模板库(mustachejs,underscorejs,jQuery模板,hoganjs等)都使用new Function.有没有相当成熟和支持不使用?

有关安全限制的信息.

javascript templates eval google-chrome-extension

11
推荐指数
2
解决办法
3282
查看次数

JSLint"eval是邪恶的." 备择方案

我有一些在客户端(浏览器)和服务器上运行的JavaScript函数(在Java Rhino上下文中).这些是小函数 - 基本上很少有验证器,它们定义良好且不依赖于全局或闭包 - 自包含和可移植.

这是一个例子:

function validPhoneFormat(fullObject, value, params, property) {
    var phonePattern = /^\+?([0-9\- \(\)])*$/;
    if (value && value.length && !phonePattern.test(value))
        return [ {"policyRequirement": "VALID_PHONE_FORMAT"}];
    else
        return [];
}
Run Code Online (Sandbox Code Playgroud)

为了保持DRY,我的服务器代码获取每个函数的句柄并调用它们上的toString(),将它们作为JSON对象的一部分返回给浏览器.像这样的东西:

      { "name" : "phoneNumber",
        "policies" : [ 
            { "policyFunction" : "\nfunction validPhoneFormat(fullObject, value, params, property) {\n    var phonePattern = /^\\+?([0-9\\- \\(\\)])*$/;\n    if (value && value.length && !phonePattern.test(value)) {\n        return [{\"policyRequirement\":\"VALID_PHONE_FORMAT\"}];\n    } else {\n        return [];\n    }\n}\n"
            }
          ]
      }
Run Code Online (Sandbox Code Playgroud)

然后我的浏览器JS代码接受此响应,并在该上下文中创建此函数的实例,如下所示:

eval("var policyFunction = " + this.policies[j].policyFunction);

policyFailures …
Run Code Online (Sandbox Code Playgroud)

javascript eval dry jslint

11
推荐指数
2
解决办法
8862
查看次数

使用javascript eval()对输入中的简单计算是否安全?

我想允许用户在文本输入中执行简单的计算,因此键入2*5将导致10.我将使用空字符串替换除数字之外的所有内容,然后使用eval()进行计算.这看起来更容易,并且可能比手动解析更快.

经常有人说eval()是不安全的,所以我想听听在这种情况下使用它有任何危险或缺点.

function (input) {
  value = input.value.replace(/[^-\d/*+.]/g, '');
  input.value=eval(value);
}
Run Code Online (Sandbox Code Playgroud)

javascript eval

11
推荐指数
1
解决办法
606
查看次数

python 3中的输入字符串

我有字符串变量测试,在Python 2.7中这很好用.

test = raw_input("enter the test") 
print test
Run Code Online (Sandbox Code Playgroud)

但是在Python 3.3中.我用

test = input("enter the test") 
print test
Run Code Online (Sandbox Code Playgroud)

使用输入字符串test,我收到一条错误消息

Traceback(最近一次调用最后一次):

文件"/home/ananiev/PycharmProjects/PigLatin/main.py",

第5行,在test = input("输入测试")

NameError中的文件"",第1行:名称'sdas'未定义

python string eval input python-3.x

11
推荐指数
2
解决办法
10万
查看次数

这个eval条件的目的是什么?

我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html并注意到一些事情:

if (typeof Module === 'undefined') 
{
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
Run Code Online (Sandbox Code Playgroud)
  • Module函数使用内联脚本标记定义
  • 稍后var在另一个内联标记中再次声明它,这次它检查模块是否存在.

我的问题:如果只尝试再次返回模块,那么使用自调用函数声明Module有什么意义呢?是不是已经证明它不存在?为什么不直接将Module声明为{}

javascript eval conditional-statements emscripten

11
推荐指数
1
解决办法
235
查看次数

如何在R中评估eval期间出了什么问题?

部分代码:

Rengine re = getRengine();
re.eval("library(quantmod)");
re.eval("library(PerformanceAnalytics)");
re.eval("library(tseries)");
re.eval("library(FinTS)");
re.eval("library(rugarch)");
re.eval("library(robustbase)");

re.assign("arLagNum", new double[]{1});
re.assign("maLagNum", new double[]{1});
re.assign("archLagNum", new double[]{1});
re.assign("garchLagNum", new double[]{1});

re.eval("garchSpec <- ugarchspec(variance.model = list(model=\"iGARCH\", garchOrder=c(archLagNum,garchLagNum)), mean.model = list(armaOrder=c(arLagNum,maLagNum)), distribution.model=\"std\")");

re.assign("transformedTsValueData", new double[]{getSomeDoubles()};
re.eval("estimates <- ugarchfit(spec = garchSpec, data = transformedTsValueData, solver.control = list(trace = 1))");
re.eval("estimates");
Run Code Online (Sandbox Code Playgroud)

最后一行返回null.API文档说:" 如果出现问题,eval方法返回null ".我怎么知道出了什么问题?

java eval r

11
推荐指数
1
解决办法
233
查看次数

何时使用DataFrame.eval()与pandas.eval()或python eval()

我有几十个条件(例如foo > bar),我需要在~1MM的a行上进行评估DataFrame,最简洁的写法是将这些条件存储为字符串列表并创建一个DataFrame布尔结果(每行一行)每个条件记录x一列).(评估用户输入.)

在寻求过早优化的过程中,我试图确定是否应该将这些条件写入评估范围内DataFrame(例如,df.eval("foo > bar")或者只是将其保留为python,如同eval("df.foo > df.bar")

根据增强评估性能文档:

您不应将eval()用于简单表达式或涉及小型DataFrame的表达式.事实上,对于较小的表达式/对象,eval()比普通的'Python'要快许多个数量级.一个好的经验法则是当你有一个超过10,000行的DataFrame时才使用eval().

能够使用df.eval("foo > bar")语法会很好,因为我的列表会更具可读性,但我总是找不到评估速度不慢的情况.文档显示了哪里pandas.eval()比python更快的例子eval()(符合我的经验)但没有DataFrame.eval()(因为它被列为'实验').

例如,DataFrame.eval()在一个大型的非简单表达式中仍然是一个明显的输家DataFrame:

import pandas as pd
import numpy as np
import numexpr
import timeit

someDf = pd.DataFrame({'a':np.random.uniform(size=int(1e6)), 'b':np.random.uniform(size=int(1e6))})

%timeit -n100 someDf.eval("a**b - a*b > b**a - b/a") # DataFrame.eval() on notional expression
%timeit -n100 eval("someDf['a']**someDf['b'] - someDf['a']*someDf['b'] > someDf['b']**someDf['a'] …
Run Code Online (Sandbox Code Playgroud)

python performance eval pandas

11
推荐指数
1
解决办法
3728
查看次数