Skip to content

Commit

Permalink
Improve noeval-if scriptlet
Browse files Browse the repository at this point in the history
  • Loading branch information
gorhill committed Feb 19, 2025
1 parent 17c6603 commit 0df7faf
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 34 deletions.
58 changes: 58 additions & 0 deletions src/js/resources/noeval.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*******************************************************************************
uBlock Origin - a comprehensive, efficient content blocker
Copyright (C) 2019-present Raymond Hill
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/

import { proxyApplyFn } from './proxy-apply.js';
import { registerScriptlet } from './base.js';
import { safeSelf } from './safe-self.js';

/******************************************************************************/

function noEvalIf(
needle = ''
) {
if ( typeof needle !== 'string' ) { return; }
const safe = safeSelf();
const logPrefix = safe.makeLogPrefix('noeval-if', needle);
const reNeedle = safe.patternToRegex(needle);
proxyApplyFn('eval', function(context) {
const { callArgs } = context;
const a = String(callArgs[0]);
if ( needle !== '' && reNeedle.test(a) ) {
safe.uboLog(logPrefix, 'Prevented:\n', a);
return;
}
if ( needle === '' || safe.logLevel > 1 ) {
safe.uboLog(logPrefix, 'Not prevented:\n', a);
}
return context.reflect();
});
}
registerScriptlet(noEvalIf, {
name: 'noeval-if.js',
aliases: [
'prevent-eval-if.js',
],
dependencies: [
proxyApplyFn,
safeSelf,
],
});
35 changes: 1 addition & 34 deletions src/js/resources/scriptlets.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import './attribute.js';
import './href-sanitizer.js';
import './noeval.js';
import './replace-argument.js';
import './spoof-css.js';
import './prevent-settimeout.js';
Expand Down Expand Up @@ -1598,40 +1599,6 @@ function adjustSetTimeout(

/******************************************************************************/

builtinScriptlets.push({
name: 'noeval-if.js',
aliases: [
'prevent-eval-if.js',
],
fn: noEvalIf,
dependencies: [
'safe-self.fn',
],
});
function noEvalIf(
needle = ''
) {
if ( typeof needle !== 'string' ) { return; }
const safe = safeSelf();
const logPrefix = safe.makeLogPrefix('noeval-if', needle);
const reNeedle = safe.patternToRegex(needle);
window.eval = new Proxy(window.eval, { // jshint ignore: line
apply: function(target, thisArg, args) {
const a = String(args[0]);
if ( needle !== '' && reNeedle.test(a) ) {
safe.uboLog(logPrefix, 'Prevented:\n', a);
return;
}
if ( needle === '' || safe.logLevel > 1 ) {
safe.uboLog(logPrefix, 'Not prevented:\n', a);
}
return Reflect.apply(target, thisArg, args);
}
});
}

/******************************************************************************/

builtinScriptlets.push({
name: 'prevent-fetch.js',
aliases: [
Expand Down

0 comments on commit 0df7faf

Please sign in to comment.