Czy Mogę poprosić przeglądarkę, aby nie uruchamiała s w elemencie?

Czy można powiedzieć przeglądarkom, aby nie uruchamiały JavaScript z określonych części dokumentu HTML?

Jak:

<div script="false"> ...

Może być przydatna jako dodatkowa funkcja bezpieczeństwa. Wszystkie skrypty, które chcę, są ładowane w określonej części dokumentu. Nie powinno być żadnych skryptów w innych częściach dokumentu i jeśli są, nie powinny być uruchamiane.

Author: Bergi, 2014-09-19

7 answers

Tak, możesz : -) odpowiedź brzmi: Polityka Bezpieczeństwa treści (CSP).

Większość nowoczesnych przeglądarek obsługuje tę flagę , która mówi przeglądarce tylko do ładowania kodu JavaScript z zaufanego pliku zewnętrznego i uniemożliwia cały wewnętrzny kod JavaScript! Jedynym minusem jest to, że nie możesz używać żadnego wbudowanego JavaScript na całej stronie(nie tylko dla pojedynczego <div>). Chociaż może istnieć obejście poprzez dynamiczne dołączanie div z zewnętrznego pliku z innym polityka bezpieczeństwa, ale nie jestem tego pewien.

Ale jeśli możesz zmienić swoją witrynę, aby załadować wszystkie JavaScript z zewnętrznych plików JavaScript, a następnie można wyłączyć Inline JavaScript całkowicie z tego nagłówka!

Oto fajny samouczek z przykładem: Html5rocks Tutorial

Jeśli możesz skonfigurować serwer, aby wysyłał tę flagę HTTP-Header, świat będzie lepszym miejscem!

 90
Author: Falco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 18:43:25

Możesz zablokować JavaScript załadowany przez <script>, używając zdarzenia beforescriptexecute:

<script>
  // Run this as early as possible, it isn't retroactive
  window.addEventListener('beforescriptexecute', function(e) {
    var el = e.target;
    while(el = el.parentElement)
      if(el.hasAttribute('data-no-js'))
        return e.preventDefault(); // Block script
  }, true);
</script>

<script>console.log('Allowed. Console is expected to show this');</script>
<div data-no-js>
  <script>console.log('Blocked. Console is expected to NOT show this');</script>
</div>

Zauważ, że beforescriptexecute został zdefiniowany w HTML 5.0, ale został usunięty w HTML 5.1. Firefox jest jedyną główną przeglądarką, która go zaimplementowała.

W przypadku, gdy wstawiasz niezaufany plik HTML na swoją stronę, pamiętaj, że blokowanie skryptów wewnątrz tego elementu nie zapewni większego bezpieczeństwa, ponieważ niezaufany HTML może zamknąć element piaskownicy, a tym samym skrypt zostanie umieszczony na zewnątrz i uciekaj.

I to nie zablokuje takich rzeczy jak <img onerror="javascript:alert('foo')" src="//" />.

 13
Author: Oriol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 20:39:26

Ciekawe pytanie, nie wydaje mi się to możliwe. Ale nawet jeśli tak, to brzmi jak włamanie.

Jeśli zawartość tego div jest niezaufana, wtedy musisz uciec od danych po stronie serwera, zanim zostaną one wysłane w odpowiedzi HTTP i wyrenderowane w przeglądarce.

Jeśli chcesz tylko usunąć tagi <script> i zezwolić na inne znaczniki html, po prostu usuń je z treści i pozostaw resztę.

Zajrzyj do XSS profilaktyka.

Https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet{[11]

 8
Author: cowls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 08:46:33

JavaScript jest wykonywany "inline", tzn. w kolejności, w jakiej pojawia się w DOM (gdyby tak nie było, nigdy nie można było być pewnym, że jakaś zmienna zdefiniowana w innym skrypcie była widoczna podczas pierwszego użycia).

Czyli teoretycznie możesz mieć skrypt na początku strony (tj. pierwszy <script> element), który przegląda DOM i usuwa wszystkie <script> elementy i procedury obsługi zdarzeń wewnątrz twojego <div>.

Ale rzeczywistość jest bardziej złożona: DOM i wczytywanie skryptów odbywa się asynchronicznie. Oznacza to, że przeglądarka gwarantuje tylko, że skrypt może zobaczyć część DOM, która jest przed it (tj. nagłówek do tej pory w naszym przykładzie). Nie ma żadnych gwarancji na nic poza (jest to związane z document.write()). Możesz więc zobaczyć następny znacznik skryptu, a może nie.

Możesz przykleić do zdarzenia onload dokumentu - co upewniłoby się, że masz cały DOM-ale w tym czasie złośliwy kod mógł już stracony. Sytuacja pogarsza się, gdy Inne skrypty manipulują DOM, dodając tam skrypty. Więc musiałbyś też sprawdzać każdą zmianę DOM.

Więc @cowls solution (filtrowanie na serwerze) jest jedynym rozwiązaniem, które może działać w każdej sytuacji.

 7
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 08:57:26

Jeśli chcesz wyświetlić kod JavaScript w swojej przeglądarce:

Używając JavaScript i HTML, będziesz musiał użyć encji HTML , Aby wyświetlić kod JavaScript i uniknąć wykonania tego kodu. Tutaj znajdziesz listę encji HTML:

Jeśli używasz języka skryptowego po stronie serwera (PHP, ASP.NET, itd.), najprawdopodobniej istnieje funkcja, która uciekałaby od ciągu znaków i konwertowałaby znaki specjalne na encje HTML. W PHP można użyć "htmlspecialchars ()" lub " htmlentities ()". Ta ostatnia obejmuje wszystkie znaki HTML.

Jeśli chcesz wyświetlać swój kod JavaScript w przyjemny sposób, wypróbuj jeden z kodów zakreślacze:

 1
Author: Wissam El-Kik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-19 19:36:01

Mam teorię:

  • zawiń określoną część dokumentu wewnątrz noscript tag.
  • Użyj funkcji DOM, aby odrzucić wszystkie znaczniki script wewnątrz znacznika noscript, a następnie rozpakować jego zawartość.

Przykład dowodu koncepcji:

window.onload = function() {
    var noscripts = /* _live_ list */ document.getElementsByTagName("noscript"),
        memorydiv = document.createElement("div"),
        scripts = /* _live_ list */ memorydiv.getElementsByTagName("script"),
        i,
        j;
    for (i = noscripts.length - 1; i >= 0; --i) {
        memorydiv.innerHTML = noscripts[i].textContent || noscripts[i].innerText;
        for (j = scripts.length - 1; j >= 0; --j) {
            memorydiv.removeChild(scripts[j]);
        }
        while (memorydiv.firstChild) {
            noscripts[i].parentNode.insertBefore(memorydiv.firstChild, noscripts[i]);
        }
        noscripts[i].parentNode.removeChild(noscripts[i]);
    }
};
body { font: medium/1.5 monospace; }
p, h1 { margin: 0; }
<h1>Sample Content</h1>
<p>1. This paragraph is embedded in HTML</p>
<script>document.write('<p style="color: red;">2. This paragraph is generated by JavaScript</p>');</script>
<p>3. This paragraph is embedded in HTML</p>
<h1>Sample Content in No-JavaScript Zone</h1>
<noscript>
    <p>1. This paragraph is embedded in HTML</p>
    <script>document.write('<p style="color: red;">2. This paragraph is generated by JavaScript</p>');</script>
    <p>3. This paragraph is embedded in HTML</p>
</noscript>
<noscript>
    <p>1. This paragraph is embedded in HTML</p>
    <script>document.write('<p style="color: red;">2. This paragraph is generated by JavaScript</p>');</script>
    <p>3. This paragraph is embedded in HTML</p>
</noscript>
 1
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-20 10:00:07

Jeśli chcesz ponownie włączyć znaczniki skryptów później, moim rozwiązaniem było złamanie środowiska przeglądarki tak, że każdy uruchomiony skrypt wyrzuci błąd dość wcześnie. Jednak nie jest całkowicie niezawodny, więc nie można go używać jako funkcji bezpieczeństwa.

Jeśli spróbujesz uzyskać dostęp do właściwości globalnych, Chrome wyrzuci wyjątek.

setTimeout("Math.random()")
// => VM116:25 Uncaught Error: JavaScript Execution Inhibited  

Nadpisuję wszystkie właściwości nadpisywalne na window, ale możesz je również rozszerzyć, aby złamać inne funkcje.

window.allowJSExecution = inhibitJavaScriptExecution();
function inhibitJavaScriptExecution(){

    var windowProperties = {};
    var Object = window.Object
    var console = window.console
    var Error = window.Error

    function getPropertyDescriptor(object, propertyName){
        var descriptor = Object.getOwnPropertyDescriptor(object, propertyName);
        if (!descriptor) {
            return getPropertyDescriptor(Object.getPrototypeOf(object), propertyName);
        }
        return descriptor;
    }

    for (var propName in window){
        try {
            windowProperties[propName] = getPropertyDescriptor(window, propName)
            Object.defineProperty(window, propName, {
                get: function(){
                    throw Error("JavaScript Execution Inhibited")
                },
                set: function(){
                    throw Error("JavaScript Execution Inhibited")
                },
                configurable: true
            })
        } catch (err) {}
    }

    return function allowJSExecution(){
        for (var propName in window){
            if (!(propName in windowProperties)) {
                delete windowProperties[propName]
            }
        }

        for (var propName in windowProperties){
            try {
                Object.defineProperty(window, propName, windowProperties[propName])
            } catch (err) {}
        }
    }
}
 0
Author: Matt Zeunert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 09:26:02