| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | // Copyright (c) Microsoft Corporation.// Licensed under the MIT License./** * @fileoverview Rule to disallow call to Math.random and crypto.pseudoRandomBytes functions * @author Antonios Katopodis */"use strict";const astUtils = require("../ast-utils");const path = require('path');const bannedRandomLibraries = [  'chance',  'random-number',  'random-int',  'random-float',  'random-seed',  'unique-random']//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------module.exports = {  meta: {    type: "suggestion",    fixable: "code",    schema: [],    docs:{      description: `Methods such as Math.random or crypto.pseudoRandomBytes do not produce cryptographically-secure random numbers and must not be used for security purposes such as generating tokens, passwords or keys.      Use crypto.randomBytes() or window.crypto.getRandomValues() instead.            `,      url: "https://github.com/microsoft/eslint-plugin-sdl/blob/master/docs/rules/no-insecure-random.md"    },    messages: {      default: 'Do not use pseudo-random number generators for generating secret values such as tokens, passwords or keys.'    }  },  create: function(context) {    const fullTypeChecker = astUtils.getFullTypeChecker(context);    return {      "CallExpression > MemberExpression[property.name='pseudoRandomBytes']"(node) {        var notFalsePositive = false;        if (fullTypeChecker) {          const type = astUtils.getNodeTypeAsString(fullTypeChecker, node.object, context);          notFalsePositive = type === "any" || type === "Crypto";        }else{          notFalsePositive = node.object.name === 'crypto';        }        if(notFalsePositive){          context.report({            node: node,            messageId: "default"          });        }         },      "CallExpression > MemberExpression[property.name='random']"(node) {        var notFalsePositive = false;        if (fullTypeChecker) {          const type = astUtils.getNodeTypeAsString(fullTypeChecker, node.object, context);          notFalsePositive = type === "any" || type === "Math";        }else{          notFalsePositive = node.object.name === 'Math';        }        if(notFalsePositive){          context.report({            node: node,            messageId: "default"          });        }      },      ImportDeclaration(node){        if(bannedRandomLibraries.includes(path.basename(node.source.value))){          context.report({            node: node,            messageId: "default"          });          }      },      "CallExpression[callee.name='require'][arguments.length=1]"(node){        var requireName = path.parse(path.basename(node.arguments[0].value)).name;        if(bannedRandomLibraries.includes(requireName)){          context.report({            node: node,            messageId: "default"          });          }      }    };  }};
 |