সতর্কতা: অনিরাপদ শৈলীর মান url স্যানিটাইজ করা


107

আমি আমার কৌনিক 2 অ্যাপ্লিকেশনে একটি উপাদান টেম্পলেটে একটি ডিআইভির পটভূমি চিত্রটি সেট করতে চাই। তবে আমি আমার কনসোলে নিম্নলিখিত সতর্কতাটি পেয়ে যাচ্ছি এবং আমি পছন্দসই প্রভাব পাচ্ছি না ... অ্যাঙ্গুলার 2 এর সুরক্ষা বিধিনিষেধের কারণে গতিশীল সিএসএস ব্যাকগ্রাউন্ড চিত্রটি ব্লক করা হয়েছে বা আমার এইচটিএমএল টেমপ্লেটটি নষ্ট হয়ে গেছে কিনা তা সম্পর্কে আমি নিশ্চিত।

এটি আমার কনসোলে আমি সতর্কতাটি দেখছি (আমি আমার ইমগ url এতে পরিবর্তন করেছি /img/path/is/correct.png:

সতর্কতা: অনিরাপদ শৈলীর মান url স্যানিটাইজ করা (SafeValue অবশ্যই [সম্পত্তি] = বাইন্ডিং ব্যবহার করতে হবে: /img/path/is/correct.png (দেখুন http://g.co/ng/ সুরক্ষা #xss )) (দেখুন http: // g.co/ng/ সুরক্ষা#xss )।

জিনিসটি হ'ল আমি আমার টেম্পলেটটিতে DomSanitizationServiceইনজুলার 2 ব্যবহার করে যা সারণি করে তা স্যানিটাইজ করি । এখানে আমার এইচটিএমএলটি আমার টেম্পলেটটিতে রয়েছে:

<div>
    <div>
        <div class="header"
             *ngIf="image"
             [style.background-image]="'url(' + image + ')'">
        </div>

        <div class="zone">
            <div>
                <div>
                    <h1 [innerHTML]="header"></h1>
                </div>
                <div class="zone__content">
                    <p
                       *ngFor="let contentSegment of content"
                       [innerHTML]="contentSegment"></p>
                </div>
            </div>
        </div>
    </div>
</div>

এই উপাদানটি এখানে ...

Import {
    DomSanitizationService,
    SafeHtml,
    SafeUrl,
    SafeStyle
} from '@angular/platform-browser';

@Component({
               selector: 'example',
               templateUrl: 'src/content/example.component.html'
           })
export class CardComponent implements OnChanges {

    public header:SafeHtml;
    public content:SafeHtml[];
    public image:SafeStyle;
    public isActive:boolean;
    public isExtended:boolean;

    constructor(private sanitization:DomSanitizationService) {
    }

    ngOnChanges():void {
        map(this.element, this);

        function map(element:Card, instance:CardComponent):void {
            if (element) {
                instance.header = instance.sanitization.bypassSecurityTrustHtml(element.header);

                instance.content = _.map(instance.element.content, (input:string):SafeHtml => {
                    return instance.sanitization.bypassSecurityTrustHtml(input);
                });

                if (element.image) {
                    /* Here is the problem... I have also used bypassSecurityTrustUrl */ 
                    instance.image = instance.sanitization.bypassSecurityTrustStyle(element.image);
                } else {
                    instance.image = null;
                }

            }
        }
    }
}

দয়া করে মনে রাখবেন যে আমি যখন [src] = "চিত্র" ব্যবহার করে কেবলমাত্র টেমপ্লেটের সাথে আবদ্ধ থাকি:

<div *ngIf="image">
    <img [src]="image">
</div>

এবং সমস্ত কিছু imageব্যবহার করে উত্তীর্ণ হয়েছে bypassSecurityTrustUrlযা ভালভাবে কাজ করেছে বলে মনে হচ্ছে ... কেউ কী দেখতে পাচ্ছে যে আমি কী ভুল করছি?


আপনি কি আপনার প্রশ্নের সমাধান পেয়েছেন? আমার ঠিক একই সমস্যা আছে এবং এখনও একটি সমাধান সন্ধান করার চেষ্টা করছি। আগাম ধন্যবাদ!
এসকে

উত্তর:


112

আপনাকে পুরো urlবিবৃতিটি এতে মুড়ে ফেলতে হবে bypassSecurityTrustStyle:

<div class="header" *ngIf="image" [style.background-image]="image"></div>

ধগফদ

this.image = this.sanitization.bypassSecurityTrustStyle(`url(${element.image})`);

অন্যথায় এটি কোনও বৈধ শৈলীর সম্পত্তি হিসাবে দেখা হয় না


1
পিয়েরডুক, যখন পটভূমি-চিত্রটি উপরের মতটি বাইপাস করা হয় তার জন্য জ্ঞানের কোনও শব্দ, কিন্তু তখন কৌণিক 2 নীরবে এটিকে উপেক্ষা করে? আমি একটি নতুন প্রশ্ন পোস্ট করতে পারি তবে আমি মনে করি এটি আপনার উত্তরের পক্ষে মোটামুটি জার্মানি।
ডেভিড ফেফার

@ ডেভিডফেফার কোন কোড না দেখে কোথায় ভুল হয় তা বিচার করা কঠিন :) আমি এই কোডটি সর্বশেষ কৌণিক 2 তে ব্যবহার করি এবং এটি এখনও কাজ করে
চলেছে

1
আমি এটি বের করেছিলাম। স্যানিটাইজেশনকে বাইপাস করার পরে, মানটি অবৈধ হলে, কৌণিক 2 নীরবে এটিকে উপেক্ষা করে।
ডেভিড ফেফার

আপনার এনজিস্টাইল করা উচিত এবং এটি স্যানিটাইজিংয়ের সাথে গোলমাল না করেই কাজ করবে।
yglodt

Angular8 এ আমার জন্য কাজ করেছেন। আমি মনে করি যে স্যানিটাইজিং সবচেয়ে ভাল ... এটি একটি কারণে বিদ্যমান exists @yglodt।
শান হল

67

ব্যবহার করুন <div [ngStyle]="{'background-image':'url('+imageUrl+')'}"></div>এই আমার জন্য সমস্যার সমাধান।


নিরাপদ এবং সহজ।
কেনমোর

আপনার ভাল শব্দ @ কেনমোর জন্য ধন্যবাদ। আমি আনন্দিত যে আমি সাহায্য করতে পারি। চিয়ার্স।
iRedia এবিকাড

@ স্যামি-রজার্সগীক আমি কি ছবি ট্যাগে একই কোডটি লিখতে পারি?
অর্জুন

তুমি আমার দিন বাঁচাও!
VAdaihiep

বাকপটু. ধন্যবাদ.
মাইন্ডসেকট টিম

52

লিনিয়ার-গ্রেডিয়েন্ট সহ পটভূমি চিত্র ( *ngFor)

দেখুন:

<div [style.background-image]="getBackground(trendingEntity.img)" class="trending-content">
</div>

ক্লাস:

import { DomSanitizer, SafeResourceUrl, SafeUrl } from '@angular/platform-browser';

constructor(private _sanitizer: DomSanitizer) {}

getBackground(image) {
    return this._sanitizer.bypassSecurityTrustStyle(`linear-gradient(rgba(29, 29, 29, 0), rgba(16, 16, 23, 0.5)), url(${image})`);
}

1
আপনি আমার দিন বাঁচিয়েছিলেন
থমরাইসেলভম

1
নিখুঁতভাবে কাজ করে :))
অভিজিৎ শ্রীবাস্তব

@ অভিজিৎস্রীবাস্তব আমি thumbnailMediumIcon = this.sanitizer.bypassSecurityTrustUrl(ইউআরএল ({{থাম্বনেইল}) লিখেছি )এবং [style.backgroundImage]="thumbnailMediumIcon"। আপনি কোন কৌনিক সংস্করণ ব্যবহার করেছেন? আমি ব্যাকগ্রাউন্ড-ইমেজ চেষ্টা করেছি। এটি কি এখনও কাজ করছে? আমি অন্য পদ্ধতির পছন্দ না?
এমটিজেড

1
@ অভিজিৎস্রীবাস্তব ধন্যবাদ! আমার ভুল, আমি thumbnailURL- এর পরিবর্তে একটি ব্লব ( ) পাস করেছি
এমটিজেড

1
getBackgroundভিউয়ের অভ্যন্তরে কল করার জন্য এটি প্রস্তাবিত নয় , কারণ bypassSecurityTrustStyleপ্রত্যেকবার অ্যাংুলারকে ভিউ রিফ্রেশ করার সময় কল করতে হয়। এটি ভিতরে কনসোল.লগ যুক্ত করে পরীক্ষা করুন getBackgroundএবং আপনি দেখতে পাবেন যে প্রতিটি ক্লিক বা ব্যবহারকারীর স্ক্রোল ইভেন্টে ফাংশনটি কল করা হয়েছে
মার্সিন

9

Angular2: ব্যবহারের জন্য এই সহজ পাইপটি পরীক্ষা করুন

  1. মধ্যে SafePipeকোড, প্রতিস্থাপন DomSanitizationServiceসঙ্গেDomSanitizer

  2. SafePipeযদি আপনার প্রদানNgModule

  3. <div [style.background-image]="'url(' + your_property + ')' | safe: 'style'"></div>


8

Https://angular.io/api/platform-browser/DomSanitizer এর ডকগুলির উপর ভিত্তি করে , এটি করার সঠিক উপায়টি স্যানিটাইজ ব্যবহার করা বলে মনে হচ্ছে। কমপক্ষে কৌণিক 7 এ (এটি আগে থেকে পরিবর্তিত হয়েছে কিনা তা জানেন না)। এটি আমার পক্ষে কাজ করেছে:

import { Component, OnInit, Input, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

constructor(
    private sanitizer: DomSanitizer
) { }

this.sanitizer.sanitize(SecurityContext.STYLE, 'url(' + this.image + ')');

সিকিউরিটি কনটেক্সট, https://angular.io/api/core/SecurityContext দেখুন । মূলত এটি কেবল এই এনাম:

enum SecurityContext {
  NONE: 0
  HTML: 1
  STYLE: 2
  SCRIPT: 3
  URL: 4
  RESOURCE_URL: 5
}

1
এটি সর্বশেষতম উত্তর answer এটিও সংক্ষিপ্ত করা যেতে পারে:this.sanitizer.bypassSecurityTrustStyle(`url('${this.image} ')`);
জাহেমা

@ জাহেমা আমি বিশ্বাস করি না যে এটি সরবরাহ করা উত্তরের সমান। bypassSecurityTrustStyleসুরক্ষা sanitize(SecurityContext.STYLE, style)জোরদার করার সময় সুরক্ষা উপেক্ষা করে । আমি sanitizeউপযুক্ত সঙ্গে ব্যবহার করার সুপারিশ করব SecurityContext
অস্কার

@ জাহেমা এমন bypassSecurityTrustStyleএকটি বস্তু প্রদান করে যা অ্যাক্সেস করা যায় না (অন্তত আমি এটি করতে পারি না) [ngStyle]sanitize(SecurityContext.STYLE, style)পরিবর্তে একটি সরল স্ট্রিং ফেরত।
আলেকজান্ডার ফিঙ্ক

@ অস্কার আমি সম্মত তবে কোনও কারণে এটি সব পরিস্থিতিতেই প্রত্যাশার মতো কার্যকর হয় না। bypassSecurityTrustStyleএটি জোর করে নিষ্ঠুর হয়।
জাহেমা

6

Ang. ইনগুলার Image এ চিত্র ট্যাগে গতিশীল url যুক্ত করার সময় আমি একই সমস্যা পেয়েছি I আমি অনেকগুলি অনুসন্ধান করে এই সমাধানটি পেয়েছি।

প্রথমে উপাদান ফাইলটিতে কোড লিখুন।

constructor(private sanitizer: DomSanitizer) {}
public getSantizeUrl(url : string) {
    return this.sanitizer.bypassSecurityTrustUrl(url);
}

এখন আপনার এইচটিএমএল ইমেজ ট্যাগে আপনি এটি লিখতে পারেন।

<img class="image-holder" [src]=getSantizeUrl(item.imageUrl) />

আপনি আইটেম.ইমিজআরএল পরিবর্তে আপনার প্রয়োজন অনুযায়ী লিখতে পারেন

আমি এই সাইট থেকে একটি রেফারেন্স পেয়েছি। গতিশীল url । আশা করি এই সমাধান আপনাকে সহায়তা করবে :)


এটি চিত্রগুলির জন্য কাজ করে, তবে প্রশ্নটি ইউআরএল স্টাইলের বিষয়ে ছিল, ব্যাকগ্রাউন্ড চিত্র হিসাবে ব্যবহার করা হয়েছিল, যা এই উত্তরটি সম্পর্কিত নয়
আমিররেজা

3

কেবলমাত্র স্যানিটাইজড কিছু থাকলে এই সতর্কতাটি মুদ্রণের জন্য একটি উন্মুক্ত সমস্যা রয়েছে: https://github.com/angular/angular/pull/10272

যখন কিছুই স্যানিটাইজ করা হয়নি তখন এই সতর্কতাটি মুদ্রিত হয় তখন আমি বিশদে পড়িনি।


3
যারা এখানে আসতে পারে তাদের জন্য: এই সমস্যাটি সমাধান করা হয়েছে। এটি কেবলমাত্র সতর্কতাটি প্রিন্ট করে যদি এটি সমস্ত সময় নয় এইচটিএমএল স্যানিটাইজ করে।
ফ্লেমসডিউ

আমি জানতে চেয়েছিলাম এটা করা কি ভুল অনুশীলন? আমি কি এই সতর্কতাটি না পাওয়ার চেষ্টা করব?
অমৃত

আপনি ব্যবহারকারীদের সরবরাহিত সামগ্রীতে এটি প্রয়োগ করার সময় খুব সতর্ক হওয়া উচিত (যেমন কোনও ইনপুট ক্ষেত্রের পাঠ্য বা কোনও ডেটাবেস থেকে লোড হওয়া ব্যবহারকারী সামগ্রী বা আপনি নিয়ন্ত্রণ করেন না এমন অন্যান্য উত্স। এইভাবে আপনি কৌণিককে বলেন যে সহজাত অনিরাপদ সামগ্রী হিসাবে বিবেচিত হওয়া উচিত । trustworty এটা সম্পূর্ণই জরিমানা যদিও এটা স্ট্যাটিক কন্টেন্ট জন্য ব্যবহার করতে যে আপনি নিয়ন্ত্রণ আছে, ধ্রুবক মত, বিভিন্ন পরিবেশের বিল্ড সময়ে গৃহীত, মান শুধুমাত্র যেমন নিরাপদ মান থেকে হিসাব।
গুন্টার Zöchbauer

1

যে কেউ ইতিমধ্যে সতর্কবাণীটি আপনাকে যা করতে পরামর্শ দেয় সেভাবে যা করছে, অ্যাঙ্গুলার 5 এ আপগ্রেড করার আগে আমাকে টেমপ্লেটগুলিতে ব্যবহার SafeStyleকরার stringআগে আমার প্রকারের মানচিত্র তৈরি করতে হয়েছিল। কৌণিক 5 পরে, এখন আর এটি হয় না। এর image: SafeStyleপরিবর্তে আমার মডেলগুলি পরিবর্তন করতে হয়েছিল image: string। আমি ইতিমধ্যে [style.background-image]সম্পত্তির বাইন্ডিংটি ব্যবহার করে পুরো url এ সুরক্ষা বাইপাস করেছিলাম ।

আশা করি এটি কাউকে সাহায্য করবে।


0

যেহেতু অ্যাঙ্গুলার কোনও উত্সর্গীকৃত স্যানিটাইজিং লাইব্রেরি নয়, কোনও ঝুঁকি না নেওয়ার জন্য সন্দেহজনক বিষয়বস্তুর প্রতি এটি অত্যধিক alousর্ষান্বিত। আপনি কোনও ডেডিকেটেড লাইব্রেরিতে স্যানিটাইজিং প্রতিনিধিত্ব করতে পারেন, উদাহরণস্বরূপ - DOMPurify। এখানে কৌণিক দিয়ে সহজেই ডোমপুরিফাই ব্যবহার করতে আমি তৈরি করেছি একটি মোড়কের লাইব্রেরি।

https://github.com/TinkoffCreditSystems/ng-dompurify

এটিতে এইচটিএমএলকে ঘোষণাযুক্তভাবে স্যানিটাইজ করার জন্য একটি পাইপ রয়েছে:

<div [innerHtml]="value | dompurify"></div>

একটি জিনিস মনে রাখতে হবে, ডুমামপুরিফাই এইচটিএমএল / এসভিজি স্যানিটাইজ করার জন্য দুর্দান্ত তবে সিএসএস নয়। সুতরাং আপনি সিএসএস হ্যান্ডেল করতে অ্যাঙ্গুলারের সিএসএস স্যানিটাইজার সরবরাহ করতে পারেন:

import {NgModule, ɵ_sanitizeStyle} from '@angular/core';
import {SANITIZE_STYLE} from '@tinkoff/ng-dompurify';

@NgModule({
    // ...
    providers: [
        {
            provide: SANITIZE_STYLE,
            useValue: ɵ_sanitizeStyle,
        },
    ],
    // ...
})
export class AppModule {}

এটি অভ্যন্তরীণ - হেনস ɵউপসর্গ, তবে কৌণিক দল যেমনভাবে তাদের নিজস্ব প্যাকেজগুলিতে এটি ব্যবহার করে।


-1

আমার ক্ষেত্রে, আমি ডিসপ্লে উপাদানটি পাওয়ার আগে চিত্রটির URL পেয়েছিলাম এবং এটি ব্যাকগ্রাউন্ড চিত্র হিসাবে ব্যবহার করতে চাই তাই সেই URL টি ব্যবহার করার জন্য আমাকে কৌনিকটি বলতে হবে যে এটি নিরাপদ এবং ব্যবহার করা যেতে পারে।

.Ts ফাইলে

userImage: SafeStyle;
ngOnInit(){
    this.userImage = this.sanitizer.bypassSecurityTrustStyle('url(' + sessionStorage.getItem("IMAGE") + ')');
}

.Html ফাইলে

<div mat-card-avatar class="nav-header-image" [style.background-image]="userImage"></div>

এটি ব্যাখ্যা করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন এবং এটি যে কারও বিদ্যমান উত্তরগুলির চেয়ে ভাল উত্তর কেন তা নোট করুন।
ড্রাগনসেপ্টস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.