eslint-plugin-security 1.2.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +13 -0
- package/.github/workflows/ci.yml +47 -0
- package/.github/workflows/pr.yml +15 -0
- package/.prettierrc.json +7 -0
- package/CHANGELOG.md +65 -0
- package/README.md +97 -16
- package/docs/avoid-command-injection-node.md +85 -0
- package/docs/bypass-connect-csrf-protection-by-abusing.md +42 -0
- package/docs/regular-expression-dos-and-node.md +83 -0
- package/docs/the-dangers-of-square-bracket-notation.md +107 -0
- package/index.js +20 -0
- package/package.json +29 -4
- package/rules/data/fsFunctionData.json +49 -49
- package/rules/detect-buffer-noassert.js +66 -60
- package/rules/detect-child-process.js +37 -32
- package/rules/detect-disable-mustache-escape.js +24 -14
- package/rules/detect-eval-with-expression.js +19 -9
- package/rules/detect-new-buffer.js +17 -21
- package/rules/detect-no-csrf-before-method-override.js +34 -23
- package/rules/detect-non-literal-fs-filename.js +38 -37
- package/rules/detect-non-literal-regexp.js +24 -21
- package/rules/detect-non-literal-require.js +25 -21
- package/rules/detect-object-injection.js +61 -59
- package/rules/detect-possible-timing-attacks.js +39 -45
- package/rules/detect-pseudoRandomBytes.js +18 -15
- package/rules/detect-unsafe-regex.js +36 -23
- package/test/detect-buffer-noassert.js +30 -0
- package/test/detect-child-process.js +25 -0
- package/test/detect-disable-mustache-escape.js +16 -0
- package/test/detect-eval-with-expression.js +16 -0
- package/test/detect-new-buffer.js +17 -0
- package/test/detect-no-csrf-before-method-override.js +16 -0
- package/test/detect-non-literal-fs-filename.js +18 -0
- package/test/detect-non-literal-regexp.js +17 -0
- package/test/detect-non-literal-require.js +21 -0
- package/test/detect-object-injection.js +45 -0
- package/test/detect-possible-timing-attacks.js +34 -0
- package/test/detect-pseudoRandomBytes.js +17 -0
- package/test/detect-unsafe-regexp.js +27 -0
- package/.npmignore +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const RuleTester = require('eslint').RuleTester;
|
|
4
|
+
const tester = new RuleTester();
|
|
5
|
+
|
|
6
|
+
const ruleName = 'detect-object-injection';
|
|
7
|
+
|
|
8
|
+
const Rule = require(`../rules/${ruleName}`);
|
|
9
|
+
|
|
10
|
+
const valid = 'var a = {};';
|
|
11
|
+
// const invalidVariable = "TODO";
|
|
12
|
+
// const invalidFunction = "TODO";
|
|
13
|
+
const invalidGeneric = 'var a = {}; a[b] = 4';
|
|
14
|
+
|
|
15
|
+
// TODO
|
|
16
|
+
// tester.run(`${ruleName} (Variable Assigned to)`, Rule, {
|
|
17
|
+
// valid: [{ code: valid }],
|
|
18
|
+
// invalid: [
|
|
19
|
+
// {
|
|
20
|
+
// code: invalidVariable,
|
|
21
|
+
// errors: [{ message: 'Variable Assigned to Object Injection Sink' }]
|
|
22
|
+
// }
|
|
23
|
+
// ]
|
|
24
|
+
// });
|
|
25
|
+
//
|
|
26
|
+
//
|
|
27
|
+
// tester.run(`${ruleName} (Function)`, Rule, {
|
|
28
|
+
// valid: [{ code: valid }],
|
|
29
|
+
// invalid: [
|
|
30
|
+
// {
|
|
31
|
+
// code: invalidFunction,
|
|
32
|
+
// errors: [{ message: `Variable Assigned to Object Injection Sink: <input>: 1\n\t${invalidFunction}\n\n` }]
|
|
33
|
+
// }
|
|
34
|
+
// ]
|
|
35
|
+
// });
|
|
36
|
+
|
|
37
|
+
tester.run(`${ruleName} (Generic)`, Rule, {
|
|
38
|
+
valid: [{ code: valid }],
|
|
39
|
+
invalid: [
|
|
40
|
+
{
|
|
41
|
+
code: invalidGeneric,
|
|
42
|
+
errors: [{ message: 'Generic Object Injection Sink' }]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const RuleTester = require('eslint').RuleTester;
|
|
4
|
+
const tester = new RuleTester();
|
|
5
|
+
|
|
6
|
+
const ruleName = 'detect-possible-timing-attacks';
|
|
7
|
+
const Rule = require(`../rules/${ruleName}`);
|
|
8
|
+
|
|
9
|
+
const valid = 'if (age === 5) {}';
|
|
10
|
+
const invalidLeft = 'if (password === \'mypass\') {}';
|
|
11
|
+
const invalidRigth = 'if (\'mypass\' === password) {}';
|
|
12
|
+
|
|
13
|
+
// We only check with one string "password" and operator "==="
|
|
14
|
+
// to KISS.
|
|
15
|
+
|
|
16
|
+
tester.run(`${ruleName} (left side)`, Rule, {
|
|
17
|
+
valid: [{ code: valid }],
|
|
18
|
+
invalid: [
|
|
19
|
+
{
|
|
20
|
+
code: invalidLeft,
|
|
21
|
+
errors: [{ message: 'Potential timing attack, left side: true' }]
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
tester.run(`${ruleName} (right side)`, Rule, {
|
|
27
|
+
valid: [{ code: valid }],
|
|
28
|
+
invalid: [
|
|
29
|
+
{
|
|
30
|
+
code: invalidRigth,
|
|
31
|
+
errors: [{ message: 'Potential timing attack, right side: true' }]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const RuleTester = require('eslint').RuleTester;
|
|
4
|
+
const tester = new RuleTester();
|
|
5
|
+
|
|
6
|
+
const ruleName = 'detect-pseudoRandomBytes';
|
|
7
|
+
const invalid = 'crypto.pseudoRandomBytes';
|
|
8
|
+
|
|
9
|
+
tester.run(ruleName, require(`../rules/${ruleName}`), {
|
|
10
|
+
valid: [{ code: 'crypto.randomBytes' }],
|
|
11
|
+
invalid: [
|
|
12
|
+
{
|
|
13
|
+
code: invalid,
|
|
14
|
+
errors: [{ message: 'Found crypto.pseudoRandomBytes which does not produce cryptographically strong numbers' }]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const RuleTester = require('eslint').RuleTester;
|
|
4
|
+
const tester = new RuleTester();
|
|
5
|
+
|
|
6
|
+
const ruleName = 'detect-unsafe-regex';
|
|
7
|
+
const Rule = require(`../rules/${ruleName}`);
|
|
8
|
+
|
|
9
|
+
tester.run(ruleName, Rule, {
|
|
10
|
+
valid: [{ code: '/^d+1337d+$/' }],
|
|
11
|
+
invalid: [
|
|
12
|
+
{
|
|
13
|
+
code: '/(x+x+)+y/',
|
|
14
|
+
errors: [{ message: 'Unsafe Regular Expression' }]
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
tester.run(`${ruleName} (new RegExp)`, Rule, {
|
|
20
|
+
valid: [{ code: 'new RegExp(\'^d+1337d+$\')' }],
|
|
21
|
+
invalid: [
|
|
22
|
+
{
|
|
23
|
+
code: 'new RegExp(\'x+x+)+y\')',
|
|
24
|
+
errors: [{ message: 'Unsafe Regular Expression (new RegExp)' }]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
});
|
package/.npmignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
node_modules
|