我目前正在开发一个“简单”的税收计算器,它可以从数据库和当前托管的网页获取一些信息。例如,您在属性页面上,其中包含有关您家的详细信息。它会找到特定的信息:税区,财产类型和当前值等等。除此之外,数据库还有一些不断变化的信息,通过管理界面输入以开发税收公式。
我正在尝试使用eval来处理通过jsonp从数据库返回的公式。我遇到的问题是如何让eval函数识别公式所包含的变量位于“calculator”对象中。
json结果示例:
var calculator = {
"Name": "Residential",
"Formula": "(((rrb * (base + iv) - (hcv * homestead)) - (mcv * military)) * (levy / 1000))",
"Levy": 1000.00000,
"Variables": [
{
"Type": "System",
"DisplayName": "Tax District",
"ShortName": "levy",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Current Property Value",
"ShortName": "currentValue",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Number of Homestead Credits",
"ShortName": "homestead",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Number of Military Credits",
"ShortName": "military",
"Value": 0.000000
},
{
"Type": "Rollback",
"DisplayName": "Residential Rollback",
"ShortName": "rrb",
"Value": 0.528200
},
{
"Type": "User Input",
"DisplayName": "Total Value Add of Improvements",
"ShortName": "iv",
"Value": 0.000000
},
{
"Type": "Credit",
"DisplayName": "Homestead Credit Value",
"ShortName": "hcv",
"Value": 4850.000000
},
{
"Type": "Credit",
"DisplayName": "Military Credit Value",
"ShortName": "mcv",
"Value": 1852.000000
}
]
}
使用上面的对象,与eval一起使用的公式只会查看全局命名空间,但我真的不希望以这种方式公开变量。
让et与eval很好地融合的最简单方法是什么?理想情况下,我可以将一些函数传递给对象,它可以使值很容易地被eval函数使用。
答案 0 :(得分:1)
好的,先关闭:不要这样做。 eval
用户给你的任何东西都是绝对不安全的,因为它可以打开各种令人讨厌的攻击向量。
严重。 不要这样做。写一个解析器,它会为你做这个。这将是一个痛苦的屁股,但我保证,无论如何,一旦有明显的安全漏洞,你将最终做到这一点。
但是,如果你仍然坚持这样做:
无法使用eval
或eval.call
告诉{p> eval.apply
使用新的上下文。您必须通过定义在特定对象上下文中调用的函数来自行按摩范围。
拿这段代码:
var o = {
s: 'catpants',
t: 'doggyhat',
f: function(statement) {
return eval(statement);
}
}
通过致电o.f("this.s + ' ' + this.t");
,您将获得catpants doggyhat
。
对于您的情况,您必须定义一个对象来解析用户可能在表达式中使用的所有变量,然后在该对象上定义一个eval
用户语句的函数。
答案 1 :(得分:1)
可能这可以帮到你:
var calculator = {
Name: "Residential",
Formula : function(){
return (((rrb * (base + iv) - (hcv * homestead)) - (mcv * military)) * (levy / 1000));
},
Levy: 1000.00000,
Variables: [
{
"Type": "System",
"DisplayName": "Tax District",
"ShortName": "levy",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Current Property Value",
"ShortName": "currentValue",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Number of Homestead Credits",
"ShortName": "homestead",
"Value": 0.000000
},
{
"Type": "Form Variable",
"DisplayName": "Number of Military Credits",
"ShortName": "military",
"Value": 0.000000
},
{
"Type": "Rollback",
"DisplayName": "Residential Rollback",
"ShortName": "rrb",
"Value": 0.528200
},
{
"Type": "User Input",
"DisplayName": "Total Value Add of Improvements",
"ShortName": "iv",
"Value": 0.000000
},
{
"Type": "Credit",
"DisplayName": "Homestead Credit Value",
"ShortName": "hcv",
"Value": 4850.000000
},
{
"Type": "Credit",
"DisplayName": "Military Credit Value",
"ShortName": "mcv",
"Value": 1852.000000
}
]
}
我假设您的变量rrb, base, iv, hcv, homestead, mcv, military, levy
全局定义。
答案 2 :(得分:0)
您需要为公式编写解析器。没有自动/简单的方法来做到这一点。