| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | // Copyright (c) Microsoft Corporation.// Licensed under the MIT License./** * @fileoverview Rule to disallow assignment to innerHTML or outerHTML properties * @author Antonios Katopodis */"use strict";const astUtils = require("../ast-utils");//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------module.exports = {  meta: {    type: "suggestion",    fixable: "code",    schema: [],    docs: {      description: "Assignments to [innerHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML)/[outerHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML) properties or calls to [insertAdjacentHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML) method manipulate DOM directly without any sanitization and should be avoided. Use document.createElement() or similar methods instead.",      url: "https://github.com/microsoft/eslint-plugin-sdl/blob/master/docs/rules/no-inner-html.md"    },    messages: {      noInnerHtml: 'Do not write to DOM directly using innerHTML/outerHTML property',      noInsertAdjacentHTML: 'Do not write to DOM using insertAdjacentHTML method'    }  },  create: function (context) {    const fullTypeChecker = astUtils.getFullTypeChecker(context);    function mightBeHTMLElement(node) {      const type = astUtils.getNodeTypeAsString(fullTypeChecker, node, context);      return type.match(/HTML.*Element/) || type === "any";    }    return {      "CallExpression[arguments.length=2] > MemberExpression.callee[property.name='insertAdjacentHTML']"(node) {        // Ignore known false positives        if (          node.parent != undefined          && node.parent.arguments != undefined          && node.parent.arguments.length >= 1          && node.parent.arguments[1] != undefined           // element.insertAdjacentHTML('')          && node.parent.arguments[1].type === 'Literal' && node.parent.arguments[1].value === ''        ) {          return;        }        if (mightBeHTMLElement(node.object)) {          context.report({            node: node,            messageId: "noInsertAdjacentHTML"          });        }      },      "AssignmentExpression[left.type='MemberExpression'][left.property.name=/innerHTML|outerHTML/]"(node) {        // Ignore known false positives        if (          node.right != undefined           // element.innerHTML = ''          && node.right.type === 'Literal' && node.right.value === ''        ) {          return;        }        if (mightBeHTMLElement(node.left.object)) {          context.report({            node: node,            messageId: "noInnerHtml"          });        }      }    };  }};
 |