আমি কি কোনও ব্রাউজারকে কোনও উপাদানটির মধ্যে <script> গুলি না চালানোর জন্য বলতে পারি?


84

এইচটিএমএল ডকুমেন্টের নির্দিষ্ট অংশ থেকে ব্রাউজারগুলি জাভাস্ক্রিপ্ট চালাবেন না তা কি বলা সম্ভব?

পছন্দ:

<div script="false"> ...

এটি অতিরিক্ত সুরক্ষা বৈশিষ্ট্য হিসাবে কার্যকর হতে পারে। আমি চাই সমস্ত স্ক্রিপ্ট নথির একটি নির্দিষ্ট অংশে লোড হয়ে গেছে। নথির অন্যান্য অংশে কোনও স্ক্রিপ্ট থাকতে হবে না এবং সেগুলি থাকলে তা চালানো উচিত নয়।


4
আমার এরকম কিছু জানা নেই. এটি একটি উত্তরের পরিবর্তে একটি মন্তব্য, কারণ আমি 100% বলতে পারি না
ফ্রিফালার

4
@ চিয়েস্টিক-সুরক্ষা DOM লোড হওয়ার পরে আপনি কেবল ডিওএমকেই অতিক্রম করতে পারবেন। যার মাধ্যমে সেই ব্লকের কোনও জেএস কার্যকর করা হত।
কপাল

8
আমি সবচেয়ে কাছাকাছি ভাবতে পারি বিষয়বস্তু সুরক্ষা নীতি, যেখানে আপনি স্ক্রিপ্টগুলি তাদের উত্স দ্বারা সীমাবদ্ধ করতে পারেন (সম্ভবত এটি আপনি চান)) উদাহরণস্বরূপ নির্দিষ্ট করে script-src:"self"আপনি নিজের ডোমেন থেকে কেবল স্ক্রিপ্টগুলিকেই পৃষ্ঠাটিতে চলতে অনুমতি দিন। আপনি যদি আগ্রহী হন তবে মাইক্রো ওয়েস্টের এই নিবন্ধটি সিএসপি সম্পর্কে পড়ুন
ক্রিস্টোফ

4
@ চিস্টিক-সিকিউরিটি আপনি শিরোনামগুলি ইতিমধ্যে প্রেরণের পরে কোনও শিরোনামে নির্দিষ্ট হওয়া কোনও বিধিনিষেধ শিথিল করার পরিকল্পনা কীভাবে করবেন? যাইহোক, সিএসপি যেহেতু ডিফল্টরূপে ইনলাইন স্ক্রিপ্টগুলি অক্ষম করে এবং শ্বেত তালিকাভুক্ত না হওয়া পর্যন্ত দূরবর্তী স্ক্রিপ্টগুলি লোড হবে না, কেন আপনি এটিকে অন্য কোনও কিছুর সাথে একত্রিত করতে হবে? সিএসপি সম্ভবত ওপির সেরা বেট; আমি আশা করি কেউ একটি সিএসপি উত্তর ছেড়ে গেছে।
Dagg Nabbit

6
আপনি যদি কেউ আপনার এইচটিএমএলটিতে স্বেচ্ছাচারী ব্লক ইনজেকশন দেওয়ার বিষয়ে উদ্বিগ্ন হন তবে কীভাবে আপনার প্রস্তাবিত সমাধানটি </div>এই ডম উপাদানটি বন্ধ করার জন্য একটি ইনজেকশন প্রতিরোধ করতে চলেছে এবং তারপরে একটি নতুন শুরু শুরু <div>করবে যেখানে স্ক্রিপ্টগুলি চলছে না এমন একটি ভাইবোন হবে?
ড্যামিয়েন_এ_বিশ্বাসীরা

উত্তর:


92

হ্যাঁ, আপনি :-) উত্তরটি পারেন: সামগ্রী সুরক্ষা নীতি (সিএসপি)।

বেশিরভাগ আধুনিক ব্রাউজারগুলি এই পতাকাটিকে সমর্থন করে , যা ব্রাউজারকে কেবল একটি বিশ্বস্ত বাহ্যিক ফাইল থেকে জাভাস্ক্রিপ্ট কোড লোড করতে এবং সমস্ত অভ্যন্তরীণ জাভাস্ক্রিপ্ট কোডটি বাতিল করতে বলে! একমাত্র নেতিবাচকতা হ'ল, আপনি আপনার পুরো পৃষ্ঠায় কোনও ইনলাইন জাভাস্ক্রিপ্ট ব্যবহার করতে পারবেন না (কেবল একটির জন্য নয় <div>)। যদিও আলাদা আলাদা সুরক্ষা নীতিমালা সহ বাহ্যিক ফাইল থেকে ডিভকে অন্তর্ভুক্ত করে গতিশীলভাবে কাজ করা যেতে পারে তবে আমি সে সম্পর্কে নিশ্চিত নই।

তবে আপনি যদি বাহ্যিক জাভাস্ক্রিপ্ট ফাইলগুলি থেকে সমস্ত জাভাস্ক্রিপ্ট লোড করতে আপনার সাইটটি পরিবর্তন করতে পারেন তবে আপনি এই শিরোলেখ দিয়ে পুরোপুরি ইনলাইন জাভাস্ক্রিপ্ট অক্ষম করতে পারেন!

এখানে উদাহরণ সহ একটি দুর্দান্ত টিউটোরিয়াল দেওয়া হয়েছে : এইচটিএমএল 5 রকস টিউটোরিয়াল

আপনি এই এইচটিটিপি-শিরোনামের পতাকাটি প্রেরণের জন্য সার্ভারটি কনফিগার করতে পারলে বিশ্বের আরও ভাল জায়গা হবে!


4
+1 এটি আসলেই দুর্দান্ত, আমার অস্তিত্বের কোনও ধারণা ছিল না! (একটি দ্রষ্টব্য, আপনার উইকির লিঙ্কটি সরাসরি জার্মান সংস্করণে রয়েছে) ব্রাউজার সমর্থনটিতে রুনডাউনটি এখানে রয়েছে
BrianH

4
মনে রাখবেন যে আপনি এটি করা সত্ত্বেও, কোনও পৃষ্ঠায় অনস্ক্র্যাপযুক্ত ব্যবহারকারী ইনপুটটিকে মঞ্জুরি দেওয়া এখনও একটি খারাপ ধারণা। এটি মূলত ব্যবহারকারীকে তারা চাইলেও পৃষ্ঠাটি পরিবর্তন করার অনুমতি দেয়। এমনকি সমস্ত কন্টেন্ট সিকিউরিটি পলিসি (সিএসপি) সেটিংস সর্বাধিকতে সেট করা (ইনলাইন স্ক্রিপ্টস, শৈলীগুলি ইত্যাদি বর্জন করে), ব্যবহারকারী এখনও জিইটি অনুরোধের জন্য চিত্র এসআরসিএস ব্যবহার করে বা ব্যবহারকারীকে ট্রিকিং করে ক্রস-সাইট অনুরোধ জালিয়াতি (সিএসআরএফ) আক্রমণ করতে পারে পোষ্ট অনুরোধের জন্য একটি ফর্ম জমা বোতামে ক্লিক করুন।
আজেদি 32

@ Ajedi32 অবশ্যই আপনার সর্বদা ব্যবহারকারীর ইনপুট স্যানিটাইজ করা উচিত। তবে সিএসপি এমনকি চিত্র বা সিএসএসের মতো জিইটি অনুরোধগুলির জন্য নীতিও নির্ধারণ করতে পারে, এটি কেবল তাদের ব্লক করবে না এমনকি এটি আপনার সার্ভারকে অবহিত করবে!
ফ্যালকো

4
@Falco আমি পড়তে ডক্স , আর আমার বোঝার ছিল আপনি শুধুমাত্র একটি প্রদত্ত ডোমেন, না ডোমেনে উপপৃষ্ঠাগুলিতে একটি নির্দিষ্ট সেটে ঐ অনুরোধের সীমিত করতে পারে। সম্ভবত আপনি যে ডোমেনটি সেট করেছেন সেটি আপনার সাইটের মতোই হবে, এর অর্থ আপনি এখনও সিএসআরএফ আক্রমণে উন্মুক্ত থাকবেন।
আজেদী 32

4
@ ফ্যালকো হ্যাঁ, স্ট্যাক এক্সচেঞ্জ নতুন স্ট্যাক স্নিপেটস বৈশিষ্ট্যটি নিয়ে এটিই করেছিল: ব্লগ.স্ট্যাকওভারফ্লো.কম / ২০১৪ / ০৯ / আপনি যদি সঠিকভাবে ইনপুটটি স্যানিটাইজ করেন তবে একটি পৃথক ডোমেন প্রয়োজন নেই।
আজেদী 32

13

আপনি ইভেন্টটি <script>ব্যবহার করে লোভিত জাভাস্ক্রিপ্টটি ব্লক করতে পারেন 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>

নোট যেটি beforescriptexecuteএইচটিএমএল 5.0 এ সংজ্ঞায়িত হয়েছিল তবে এটি এইচটিএমএল 5.1 এ সরানো হয়েছে। ফায়ারফক্স একমাত্র প্রধান ব্রাউজার যা এটি প্রয়োগ করে।

আপনি যদি আপনার পৃষ্ঠায় কোনও অবিশ্বস্ত গুচ্ছ serোকাচ্ছেন তবে সচেতন হন সেই উপাদানটির ভিতরে থাকা ব্লক করা স্ক্রিপ্টগুলি আরও সুরক্ষা সরবরাহ করে না, কারণ অবিশ্বস্ত এইচটিএমএল স্যান্ডবক্সযুক্ত উপাদানটি বন্ধ করতে পারে, এবং এইভাবে স্ক্রিপ্টটি বাইরে রেখে চালিত হবে।

এবং এটি পছন্দ মতো জিনিসগুলিকে অবরুদ্ধ করবে না <img onerror="javascript:alert('foo')" src="//" />


আশা করা যায় না যে বেচাকেনা কাজ করে। আমার "অবরুদ্ধ" অংশটি দেখতে পারা উচিত নয়, তাই না?
সালমান এ

নিবন্ধন করুন সম্ভবত, আপনার ব্রাউজার beforescriptexecuteইভেন্টটিকে সমর্থন করে না । এটি ফায়ারফক্সে কাজ করে।
ওরিওল

সম্ভবত এটি প্রদত্ত স্নিপেটের সাথে ক্রোমে কাজ করছে না, যদিও আমি দেখতে পাচ্ছি আপনি কেবল স্নিপেটে রূপান্তর করেছেন :-)
মার্ক হার্ট

beforescriptexecuteদেখে মনে হচ্ছে এটি সমর্থিত নয় এবং বেশিরভাগ প্রধান ব্রাউজারগুলি সমর্থন করবে না। বিকাশকারী.মোজিলা.আর.ইন-
ম্যাট পেনিংটন

8

মজার প্রশ্ন, আমি মনে করি এটি সম্ভব নয়। তবে তা থাকলেও মনে হচ্ছে এটি হ্যাক হবে।

যদি সেই ডিভের বিষয়বস্তু অবিশ্বাস্য হয় তবে আপনাকে এইচটিটিপি প্রতিক্রিয়াতে প্রেরণ এবং ব্রাউজারে রেন্ডার করার আগে সার্ভার সাইডের ডেটা এড়ানো দরকার।

আপনি যদি কেবল <script>ট্যাগগুলি সরাতে এবং অন্যান্য এইচটিএমএল ট্যাগগুলিকে অনুমতি দিতে চান তবে কেবল তাদের সামগ্রী থেকে সরিয়ে নিয়ে বাকীটি রেখে দিন।

এক্সএসএস প্রতিরোধের দিকে নজর দিন।

https://www.owasp.org/index.php/XSS_%28 ক্রস_সেসিট স্ক্রিপ্টিং ৯৯৯_প্রেসেশন_চিট_সীট


7

জাভাস্ক্রিপ্টটি "ইনলাইন" কার্যকর করা হয়, যেমন এটি ডিওমে প্রদর্শিত হয় সেই ক্রমে (যদি এটি না হয় তবে আপনি কখনই নিশ্চিত হতে পারবেন না যে আপনি যখন প্রথমবার ব্যবহার করেছিলেন তখন কোনও ভিন্ন স্ক্রিপ্টে সংজ্ঞায়িত কিছু ভেরিয়েবল দৃশ্যমান ছিল) )।

সুতরাং তত্ত্বটির অর্থ এই যে আপনি পৃষ্ঠার শুরুতে (যেমন প্রথম <script>উপাদান) একটি স্ক্রিপ্ট থাকতে পারেন যা DOM এর মাধ্যমে দেখায় <script>এবং আপনার অভ্যন্তরের সমস্ত উপাদান এবং ইভেন্ট হ্যান্ডলারগুলি সরিয়ে দেয় <div>

তবে বাস্তবতা আরও জটিল: ডিওএম এবং স্ক্রিপ্ট লোডিং সংশ্লেষজনকভাবে ঘটে। এর অর্থ হ'ল ব্রাউজারটি কেবল গ্যারান্টি দেয় যে কোনও স্ক্রিপ্ট DOM এর অংশটি দেখতে পাবে যা এর আগে রয়েছে (যেমন আমাদের উদাহরণটিতে এখন পর্যন্ত শিরোনাম)। এর বাইরে কোনও কিছুর গ্যারান্টি নেই (এটি সম্পর্কিত document.write())। সুতরাং আপনি পরবর্তী স্ক্রিপ্ট ট্যাগ দেখতে পারেন বা হতে পারে, আপনি না।

আপনি onloadদস্তাবেজের ইভেন্টটিতে ল্যাচ করতে পারেন - যা নিশ্চিত করে যে আপনি পুরো ডিওএম পেয়েছেন - তবে সেই সময়, দূষিত কোডটি ইতিমধ্যে কার্যকর করা যেতে পারে। অন্যান্য স্ক্রিপ্টগুলি সেখানে স্ক্রিপ্টগুলি যুক্ত করে, ডিওএম-কে ম্যানিপুলেট করে যখন পরিস্থিতি আরও খারাপ হয়। সুতরাং আপনাকেও DOM এর প্রতিটি পরিবর্তনের জন্য পরীক্ষা করতে হবে।

সুতরাং @comls সমাধান (সার্ভারে ফিল্টারিং) একমাত্র সমাধান যা সমস্ত পরিস্থিতিতে কাজ করার জন্য তৈরি করা যেতে পারে।


1

আপনি যদি নিজের ব্রাউজারে জাভাস্ক্রিপ্ট কোড প্রদর্শন করতে চান:

জাভাস্ক্রিপ্ট এবং এইচটিএমএল ব্যবহার করে, আপনাকে জাভাস্ক্রিপ্ট কোড প্রদর্শন করতে এই কোডটি কার্যকর করতে এড়ানো এইচটিএমএল সত্তা ব্যবহার করতে হবে। এখানে আপনি এইচটিএমএল সত্ত্বার তালিকাটি খুঁজে পেতে পারেন:

আপনি যদি কোনও সার্ভার-সাইড স্ক্রিপ্টিং ভাষা (পিএইচপি, এএসপি। নেট, ইত্যাদি) ব্যবহার করছেন তবে সম্ভবত, এমন একটি ফাংশন রয়েছে যা একটি স্ট্রিং থেকে বাঁচতে এবং বিশেষ অক্ষরগুলিকে এইচটিএমএল সত্তায় রূপান্তর করতে পারে। পিএইচপি-তে, আপনি "এইচটিএমএল স্পেশালচার্স ()" বা "এইচটিএমলেটিটিস ()" ব্যবহার করবেন। পরেরটি সমস্ত HTML অক্ষরকে কভার করে।

আপনি যদি নিজের জাভাস্ক্রিপ্ট কোডটি দুর্দান্ত উপায়ে প্রদর্শন করতে চান তবে কোড হাইলাইটারগুলির মধ্যে একটি ব্যবহার করে দেখুন:


1

আমি একটি তত্ত্ব পেয়েছি:

  • একটি noscriptট্যাগের মধ্যে নথির নির্দিষ্ট অংশটি মোড়ানো ।
  • ট্যাগের scriptঅভ্যন্তরে সমস্ত ট্যাগ ফেলে দেওয়ার জন্য ডিওএম ফাংশন ব্যবহার করুন noscriptতার সামগ্রীতে আন-মোড়ক করুন।

ধারণা উদাহরণের প্রমাণ:

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>


ডিভের বিষয়বস্তু যদি অবিশ্বস্ত হয় তবে আমার ধারণা এটি দেওয়া হয়েছে। তারা কেবল <noscript>ট্যাগটি বন্ধ করতে পারে এবং তারপরে তারা কী পছন্দ করে।
কপাল

হ্যাঁ, সঠিক সমাধানটি হ'ল সার্ভার সাইডে সমস্যাটি সমাধান করা। আমি জাভাস্ক্রিপ্টের মাধ্যমে যা করছি তা সার্ভারের পাশেই করা উচিত।
সালমান এ

0

আপনি যদি পরে স্ক্রিপ্ট ট্যাগগুলি আবার সক্ষম করতে চান তবে আমার সমাধানটি ছিল ব্রাউজারের পরিবেশটি ভেঙে দেওয়া যাতে চালানো কোনও স্ক্রিপ্ট মোটামুটি তাড়াতাড়ি ত্রুটি ছুঁড়ে দেয়। তবে এটি সম্পূর্ণ নির্ভরযোগ্য নয়, সুতরাং আপনি এটিকে সুরক্ষা বৈশিষ্ট্য হিসাবে ব্যবহার করতে পারবেন না।

আপনি যদি বিশ্বব্যাপী বৈশিষ্ট্য অ্যাক্সেস করার চেষ্টা করেন তবে Chrome একটি ব্যতিক্রম ছুঁড়ে দেবে।

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

আমি সমস্ত ওভাররাইটেবল বৈশিষ্ট্যগুলিকে ওভাররাইট করছি window, তবে অন্যান্য কার্যকারিতা ভাঙ্গতে আপনি এটি প্রসারিতও করতে পারেন।

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) {}
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.