Skip to content

Commit b28c8f1

Browse files
authored
Eval Rewriting + Scope Fix (#668)
* eval fix: instead of rewriting to 'WB_wombat_eval', rewrite to 'self.eval' for non-top-level eval the wombat object will handle rewriting the eval arg on 'self.eval' tighten rewriting for top-level 'eval', add additional tests part of fix for #663 * rewrite wrap: add extra {, } to avoid collisions, as suggested in webrecorder/wombat#72 eval rewrite: exclude ',eval' as more likely than not causing a false positive, as per #643 * update to latest wombat 3.3.0 with corresponding fixes
1 parent b2a460c commit b28c8f1

File tree

5 files changed

+35
-13
lines changed

5 files changed

+35
-13
lines changed

pywb/rewrite/regex_rewriters.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ def remove_https(string, _):
1313
return string.replace("https", "http")
1414

1515
@staticmethod
16-
def replace_str(replacer):
17-
return lambda x, _: x.replace('this', replacer)
16+
def replace_str(replacer, match='this'):
17+
return lambda x, _: x.replace(match, replacer)
1818

1919
@staticmethod
2020
def format(template):
@@ -100,10 +100,10 @@ def __init__(self):
100100
prop_str = '|'.join(self.local_objs)
101101

102102
rules = [
103-
# rewriting 'eval(....)' - invocation
104-
(r'(?<![$])\beval\s*\(', self.add_prefix('WB_wombat_runEval(function _____evalIsEvil(_______eval_arg$$) { return eval(_______eval_arg$$); }.bind(this)).'), 0),
103+
# rewriting 'eval(...)' - invocation
104+
(r'(?<!function\s)(?:^|[^,$])eval\s*\(', self.replace_str('WB_wombat_runEval(function _____evalIsEvil(_______eval_arg$$) { return eval(_______eval_arg$$); }.bind(this)).eval', 'eval'), 0),
105105
# rewriting 'x = eval' - no invocation
106-
(r'(?<![$])\beval\b', self.add_prefix('WB_wombat_'), 0),
106+
(r'(?<=[=,])\s*\beval\b\s*(?![(:.$])', self.replace_str('self.eval', 'eval'), 0),
107107
(r'(?<=\.)postMessage\b\(', self.add_prefix('__WB_pmw(self).'), 0),
108108
(r'(?<![$.])\s*location\b\s*[=]\s*(?![=])', self.add_suffix(check_loc), 0),
109109
# rewriting 'return this'
@@ -122,9 +122,9 @@ def __init__(self):
122122

123123
super(JSWombatProxyRules, self).__init__(rules)
124124

125-
self.first_buff = local_init_func + local_declares + '\n\n'
125+
self.first_buff = local_init_func + local_declares + '\n\n{'
126126

127-
self.last_buff = '\n\n}'
127+
self.last_buff = '\n\n}}'
128128

129129

130130
# =================================================================

pywb/rewrite/test/test_regex_rewriters.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,20 +218,42 @@
218218
>>> _test_js_obj_proxy('eval(a)')
219219
'WB_wombat_runEval(function _____evalIsEvil(_______eval_arg$$) { return eval(_______eval_arg$$); }.bind(this)).eval(a)'
220220
221+
>>> _test_js_obj_proxy(',eval(a)')
222+
',eval(a)'
223+
221224
>>> _test_js_obj_proxy('this.$eval(a)')
222225
'this.$eval(a)'
223226
224227
>>> _test_js_obj_proxy('x = this.$eval; x(a);')
225228
'x = this.$eval; x(a);'
226229
227230
>>> _test_js_obj_proxy('x = eval; x(a);')
228-
'x = WB_wombat_eval; x(a);'
231+
'x = self.eval; x(a);'
229232
230233
>>> _test_js_obj_proxy('$eval = eval; $eval(a);')
231-
'$eval = WB_wombat_eval; $eval(a);'
234+
'$eval = self.eval; $eval(a);'
235+
236+
>>> _test_js_obj_proxy('foo(a, eval(data));')
237+
'foo(a, WB_wombat_runEval(function _____evalIsEvil(_______eval_arg$$) { return eval(_______eval_arg$$); }.bind(this)).eval(data));'
238+
239+
>>> _test_js_obj_proxy('function eval() {}')
240+
'function eval() {}'
232241
233242
>>> _test_js_obj_proxy('window.eval(a);')
234-
'window.WB_wombat_runEval(function _____evalIsEvil(_______eval_arg$$) { return eval(_______eval_arg$$); }.bind(this)).eval(a);'
243+
'window.eval(a);'
244+
245+
>>> _test_js_obj_proxy('x = window.eval; x(a);')
246+
'x = window.eval; x(a);'
247+
248+
>>> _test_js_obj_proxy('obj = { eval : 1 }')
249+
'obj = { eval : 1 }'
250+
251+
>>> _test_js_obj_proxy('x = obj.eval')
252+
'x = obj.eval'
253+
254+
>>> _test_js_obj_proxy('x = obj.eval(a)')
255+
'x = obj.eval(a)'
256+
235257
236258
#=================================================================
237259
# XML Rewriting

pywb/static/autoFetchWorker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ function fetchDone() {
107107
}
108108

109109
function fetchErrored(err) {
110-
console.warn("Fetch Failed: " + err);
110+
console.warn('Fetch Failed: ' + err);
111111
fetchDone();
112112
}
113113

pywb/static/wombat.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)