【问题标题】:gwt jsni variable name obfuscatedgwt jsni 变量名混淆
【发布时间】:2016-05-17 15:42:54
【问题描述】:

我在尝试将 javascript eval() 与 gwt 一起使用时遇到问题。

基本上,我的数据库中有一个动态字符串,例如:

"'31.07.'  + (myVar.getMonth() <= 7 ? myVar.getFullYear() + 3: myVar.getFullYear() + 4 )"

myVar 应该是日期类型的 javascript 变量。

这个变量是通过 GWT JSNI 传递的:

private native String eval(Date dateFieldValue, String scriptlet) /*-{
  var myVar = dateFieldValue;
  return $wnd.eval(scriptlet);
}-*/; 

但未找到 scriptlet 字符串中的“myVar”变量。 我找到了这个: https://support.google.com/code/answer/55205?hl=en

这解释了为什么会发生这种情况。 我将不得不以这种方式分离我的 scriptlet:

"'31.07.'  + (" + myVar + ".getMonth() <= 7 ? " + myVar + ".getFullYear() + 3: " + myVar + ".getFullYear() + 4 )"

问题在于这不灵活,因为 scriptlet 是在数据库中管理的,而不是在代码中。那么在这种情况下该怎么办呢?这是不可能的吗?

【问题讨论】:

  • 代码混淆是一个选项,如果关闭,您可以简单地关闭。
  • 但是gwt还是会改变变量名,还是?我认为,仅仅为了这个而不得不进行混淆就太过分了。
  • 是的,我同意,但在绝望的时刻可能是一种选择。

标签: javascript gwt eval jsni


【解决方案1】:

改用函数:

return (new Function('myVar', 'return ' + scriptlet))(dateFieldValue);

这在安全方面仍然和eval 一样糟糕,但无论如何都要干净得多。

【讨论】:

  • 这会有同样的问题,因为 scriptlet 是一个字符串,而 gwt 不会在字符串中读取。
  • 不,它不会(除非另有证明),因为 'myVar' 现在是作为参数传递给new Function 以命名其参数的字符串,因此它不会被 GWT 重写。如果您愿意,这基本上等同于 eval('function(myVar) { return ' + scriptlet + '}')(dateFieldValue)
  • 这听起来很有希望,谢谢!我尝试了不同的变体,但仍然无法正常工作:简单 Scriptlet:String scriptlet = "myVar.getMonth()"; 和函数:private native String eval(Date myDate, String scriptlet) /*-{ return (new Function('myVar', 'return ' + scriptlet))(myDate); }-*/; 但我得到:“myVar.getMonth 不是函数”。我做错了什么?
  • 更加简化但仍然相同。出了点问题,我不确定是什么。 private native String eval(Date myDate) /*-{ return (new Function('myVar', 'return myVar.getFullYear()'))(myDate); }-*/;
  • 这有效:private native String eval(Date myDate) /*-{ return (new Function('myVar', 'return myVar.getFullYear()'))(new Date()); }-*/; 但与 myDate 相同,而不是 new Date() 无效。这里发生了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多