我正在开发一个webapp来教授编程概念.网页上有一些关于编程概念的文本,然后让用户在javascript代码中键入文本编辑器窗口以尝试回答编程问题.当用户点击"提交"时,我会分析他们输入的文本以查看他们是否已解决问题.例如,我要求他们"编写一个命名f为其参数添加三个的函数".
以下是我正在分析用户文本的内容:
eval(usertext);eval(condition).一个例子是"f(1)===4".条件来自可靠来源.我的问题:这是否足以防止安全问题?我还能做些什么才能成为偏执狂?有没有更好的方法来做我想要的?
如果它是相关的我的应用程序是在使用Python后端的Google App Engine上,使用JQuery,具有单独的用户帐户.
我正在处理一个使用本土模板系统的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:NAME和USER:GENERATETICKETNUMBER,其中解析器将然后扫描,并调用合适的对象方法.但是,我没有处理混合HTML和Perl的模板,而是使用混合HTML,Perl和令牌的模板.
第二个想法是尝试解析嵌入的Perl,弄清楚语句想要做什么,如果它足够简单,通过符号引用调用适当的对象方法.这显然是疯了.
我有什么逻辑解决方案可以忽略吗?
简而言之:是否有一种优雅的方式来限制匿名函数的范围,或者在这个例子中是否有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处理函数及其工作空间有关,也可能与之无关.
使用的Google Chrome扩展程序manifest_version: 2限制使用eval或new Function.我检查的所有JavaScript模板库(mustachejs,underscorejs,jQuery模板,hoganjs等)都使用new Function.有没有相当成熟和支持不使用?
我有一些在客户端(浏览器)和服务器上运行的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) 我想允许用户在文本输入中执行简单的计算,因此键入2*5将导致10.我将使用空字符串替换除数字之外的所有内容,然后使用eval()进行计算.这看起来更容易,并且可能比手动解析更快.
经常有人说eval()是不安全的,所以我想听听在这种情况下使用它有任何危险或缺点.
function (input) {
value = input.value.replace(/[^-\d/*+.]/g, '');
input.value=eval(value);
}
Run Code Online (Sandbox Code Playgroud) 我有字符串变量测试,在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'未定义
我在这里浏览源代码: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)
var在另一个内联标记中再次声明它,这次它检查模块是否存在.我的问题:如果只尝试再次返回模块,那么使用自调用函数声明Module有什么意义呢?是不是已经证明它不存在?为什么不直接将Module声明为{}?
部分代码:
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 ".我怎么知道出了什么问题?
我有几十个条件(例如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) eval ×10
javascript ×5
jslint ×2
performance ×2
python ×2
closures ×1
dry ×1
emscripten ×1
input ×1
java ×1
matlab ×1
pandas ×1
perl ×1
python-3.x ×1
r ×1
scope ×1
security ×1
string ×1
templates ×1