我正在开发一个webapp来教授编程概念.网页上有一些关于编程概念的文本,然后让用户在javascript代码中键入文本编辑器窗口以尝试回答编程问题.当用户点击"提交"时,我会分析他们输入的文本以查看他们是否已解决问题.例如,我要求他们"编写一个命名f为其参数添加三个的函数".
以下是我正在分析用户文本的内容:
eval(usertext);eval(condition).一个例子是"f(1)===4".条件来自可靠来源.我的问题:这是否足以防止安全问题?我还能做些什么才能成为偏执狂?有没有更好的方法来做我想要的?
如果它是相关的我的应用程序是在使用Python后端的Google App Engine上,使用JQuery,具有单独的用户帐户.
简而言之:是否有一种优雅的方式来限制匿名函数的范围,或者在这个例子中是否有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.有没有相当成熟和支持不使用?
我想允许用户在文本输入中执行简单的计算,因此键入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()应该避免使用JavaScript的方法.从设计角度来看,这个想法很有意义.当更简单,更好的选项可用时,它通常被用作丑陋的解决方法.
但是,我不了解安全漏洞的担忧.当然,运行eval()使黑客能够运行您可以运行的任何JavaScript代码.
但他们不能这样做吗?至少在Chrome中,开发人员工具允许最终用户运行自己的JavaScript.如何eval()比开发人员工具更危险?
我可以在python中将字符串转换为参数列表吗?
def func(**args):
for a in args:
print a, args[a]
func(a=2, b=3)
# I want the following work like above code
s='a=2, b=3'
func(s)
Run Code Online (Sandbox Code Playgroud)
我知道:
list can,只需使用*list,但list不能有如下元素:a = 2
和eval只能评估表达式
这将是:
def func2(*args):
for a in args:
print a
list1=[1,2,3]
func2(*list1)
func2(*eval('1,2,3'))
Run Code Online (Sandbox Code Playgroud) eval ×10
javascript ×5
python ×3
security ×2
client-side ×1
closures ×1
emscripten ×1
input ×1
java ×1
jslint ×1
matlab ×1
pandas ×1
performance ×1
python-3.x ×1
r ×1
scope ×1
string ×1
templates ×1