While I quite like the simplicity of this idea, where it kind of reminds me of the @inert attribute.
My main concern is how to bypass it, take the code: <div noscripts="true"><?= $unsafe_user_name ?></div> Where the attacker can set their username to `X*</div>* <script>evil_code</script><div>` --- Unfortunately, I think this is why we need to work with more complicated/advanced solutions... We need to sanitise all strings that are included in the HTML on the server side - e.g. using templating systems; or passing the string though something like HTML Purifier: http://htmlpurifier.org/ Or, and you have to be careful here... escaping all HTML output though functions like htmlentities() / htmlencode(), where this does not fix `<a href=<?= htmlentities($unsafe_url)>` due to the url being able to start with `javascript:`, or being able to take advantage of the missing quotation marks on the attribute via ` onclick=evil_code`. And when working with strings in JavaScript - you should use safe methods like `element.textContent`, or pass them though something to sanitise the HTML (both in removing the many ways JavaScript can be included, but also just making sure the HTML is well formed): https://github.com/google/closure-library/blob/master/closure/goog/html/sanitizer/htmlsanitizer.js https://github.com/punkave/sanitize-html Then you would ideally add a Content Security Policy to limit the scripts on the page, just incase you miss something. https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP And as an extra bonus, start playing with the (currently in development) Trusted Types, to make sure you aren't using unsafe things like element.innerHTML. https://developers.google.com/web/updates/2019/02/trusted-types Or for even more fun (pain), on your local development server, try setting the header: Content-Type: application/xhtml+xml; charset=UTF-8 Do not do this on live, as any bad formatting of your HTML will break the page - but this ensures all of your attributes are quoted, and all of your tags are perfectly nested (this includes `<br>` needing to be `<br />`, the attribute `selected` needing to be `selected="selected"`, etc). Craig On Fri, 5 Apr 2019 at 23:47, Yog Bii <joris.gutj...@gmail.com> wrote: > XSS prevention is a very important and costly part of a Websites Security. > Because XSS is currently prevented by matching for JS in user input > and is than either blocked or masked by the Web Developer, each on his > own site, > XSS attacks find differences between the matching of the Web Developer > and the Browser, such that the Web Developer's matching doesn't > recognize JS as JS, but the Browser executes it. > > This is a constant fight between the Web Developer and the XSS attacker, > that costs many resources needed somewhere else instead. > And this fight favors larger business over small Web developers. > > I think that this fight can be terminated by letting the > Web Developer not guess what the Browser may think to be JS > and instead tell him explicitly that somewhere shouldn't be any code. > The Browser then behaves in that region like > he would have JS disabled. > > I would do that with a new attribute, called noscripts. > Inside an HTML element with noscripts = "true", > the Browser handle anything inside that element like > JS would be disabled globally. > > An example HTML would look like this: > <!doctype html> > <html> > ... > <div noscripts="true"> > <script> > // No danger by unescaped <script> tags > </script> > <button onclick="nor by Event listeners">Click me</button> > ... > </html> > > If you know a way to do this without any differences between what the > Browser executes and what ever that mechanic lets pass, let me know > and let me know why it isn't thought in every HTML/JS Tutorial and > every Documentation about Web Development. > _______________________________________________ > dev-security mailing list > dev-security@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-security > _______________________________________________ dev-security mailing list dev-security@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-security