NormalExpressionProtection politikası

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Ne?

Bir iletiden bilgi çıkarır (örneğin, URI Yolu, Sorgu Parametresi, Üstbilgi, Form Parametresi, Değişken, XML Yükü veya JSON Yükü) oluşturur ve bu içeriği önceden tanımlanmış normal ifade eder. Belirtilen herhangi bir normal ifade doğru olarak değerlendirilirse ileti kabul edilir ve reddedilir.

Videolar

Normal İfade Koruması politikası hakkında daha fazla bilgi edinmek için aşağıdaki videoları izleyin.

Video Açıklama
Koruma SQL yerleştirme saldırılarına karşı (Yeni Uç) Normal İfade Koruması politikasını kullanarak SQL yerleştirme saldırılarına karşı koruma sağlayın: yeni deneyim arayüzü hakkında daha fazla bilgi edinin.
Koruma SQL yerleştirme saldırılarına karşı (Klasik Edge) Normal İfade Koruması politikasını kullanarak SQL yerleştirme saldırılarına karşı koruma sağlayın: klasik Edge kullanıcı arayüzünü açın.

Örnekler

GitHub

Normal ifade koruması sample on GitHub, bir web sunucusu üzerinden yapılan olası SQL yerleştirme saldırılarının nasıl sorgu parametresidir. Ayrıca örnek, genel bir 400 hata durumunu kontrol etmenizi sağlar.

JavaScript saldırıya karşı koruma içerir

<RegularExpressionProtection name="JsonPathRegExProtection">
    <DisplayName>Regular Expression Protection 1</DisplayName>
    <Source>request</Source>
    <JSONPayload escapeSlashCharacter="true">
       <JSONPath>
          <Expression>$</Expression>
          <Pattern>&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;
          </Pattern>
          <Pattern>n\s*\\\\\s*slash</Pattern>
          <Pattern>n\s*\/\s*slash</Pattern>
          <Pattern>n\s*\\"\s*quotes</Pattern>
          <Pattern>n\s*\\b\s*space</Pattern>
          <Pattern>n\s*\\f\s*forwardfeed</Pattern>
          <Pattern>n\s*\\n\s*newline</Pattern>
          <Pattern>n\s*\\r\s*carria</Pattern>
          <Pattern>n\s*\\t\s*tab</Pattern>
          <Pattern>n\s*\\uFFFF\s*hex</Pattern>
       </JSONPath>
    </JSONPayload>
 </RegularExpressionProtection>

Yukarıdaki örnek, JavaScript'in JSON yükleri, saldırıları içerir. Daha ayrıntılı olarak belirtmek gerekirse, <JSONPath>/<Expression> <JSONPath>/<Pattern> içinde normal ifade.

Normal ifade <JSONPath>/<Pattern> XML ile ayrılmış karakterler içeriyor (", &, ', < veya .) içeriyorsa politika XML'sine eklemeden önce XML olarak kodlamanız gerekir. yapılandırma dosyası. Örneğin, yukarıdaki örnekte, normal ifade <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> adlı kullanıcı XML olarak kodlanmış: &lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;.

Ayrıca, normal ifadenizde düz eğik çizgi (/) varsa <JSONPayload> escapeSlashCharacter ayarlayarak bunları özelliğini true olarak değiştirin.

Büyük/küçük harfe duyarlı olmayan eşleme

Büyük/küçük harfe duyarlı olmayan eşleştirme yapmak için yaygın bir kullanım alanıdır. Bu örnekte dosyalarınızı bunu (?i) yapısını kullanarak normal ifadede yapabilirsiniz. Burada örneğin DELETE, delete ve Delete doğru olarak değerlendirebilirsiniz.

<Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))</Pattern>

Normal İfade Koruması politikası hakkında

Apigee Edge, kullanabileceğiniz normal ifadeleri aşağıdaki içerik düzeyindeki yaygın tehditleri tespit etmek için çalışma zamanında API trafiğiyle karşılaştırılarak değerlendirilmiştir. bazı kalıplar var.

Normal ifade veya kısaca regex, bir dizi dizedir dize içinde bir kalıp belirten tüm anahtar kelimeleri listeler. Normal ifadeler, içeriğin programatik olarak yardımcı olur. Normal ifadeler, örneğin bir e-posta adresini değerlendirmek için kullanılabilir düzgün yapılandırıldığından emin olun. Daha fazla bilgi için Normal Java Eğiticilerindeki ifadeler.

regexionProtection'ın en yaygın kullanımı, JSON ve XML değerlerinin değerlendirilmesidir. açıklığa kavuşturulmasıdır.

Hiçbir normal ifade tüm içeriğe dayalı saldırıları ortadan kaldıramaz ve birden fazla mekanizma, sağlamak için birleştiriyor. Bu bölümde, projeniz için önerilen bazı kalıplar hariç tutmalısınız.

Hariç tutma örneği desenler

Normal ifadeler, politikanın XML yapılandırma dosyasında XML olarak kodlanmış olmalıdır.

Ad Normal İfade
SQL Yerleştirme
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
Sunucu Tarafı Dahil Etme Ekleme
<!--#(include|exec|echo|config|printenv)\s+.*

XML olarak kodlanmış:

&lt;!--#(include|exec|echo|config|printenv)\s+.*
XPath Kısaltılmış Söz Dizimi Yerleştirme
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+
XPath Genişletilmiş Söz Dizimi Yerleştirme
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling))
JavaScript Yerleştirme
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*>

XML olarak kodlanmış:

&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;
Java İstisna Yerleştirme
.*?Exception in thread.*

XML veya JSON yüküne sahip bir istekteki Content-Type üstbilgisini ayarlama

Normal İfade Koruması politikası yükü şunları içerebilir: öğeler:

  • <XMLPayload> öğesi: Bilgilerin şuradan çıkarılması gerektiğini belirtir: ve sağlanan normal ifadeyle değerlendirilir.

    Politikada <XMLPayload> kullanırsanız İsteğin Content-Type başlığı, şunun gibi bir XML içerik türü olmalıdır: application/xml veya text/xml.

  • <JSONPayload> öğesi: Bilgilerin çıkarılması gerektiğini belirtir oluşturulur ve sağlanan normal ifadeye göre değerlendirilir.

    Politikada <JSONPayload> kullanırsanız İsteğin Content-Type başlığı, şunun gibi bir JSON içerik türü olmalıdır: application/json.

Genellikle API'yi XML veya JSON'u kabul edecek şekilde tasarlarsınız. Ancak bir senaryoda Burada API her ikisini de kabul eder. Ardından bir Normal İfade Koruması politikası tanımlayabilirsiniz. hem <XMLPayload> hem de <JSONPayload> öğelerini kullanır. Content-Type üstbilgisi.

Öğe referansı

Öğe referansı, regexionProtection öğelerini ve özelliklerini açıklar. politikası.

<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">
   <DisplayName>Regular Expression Protection 1</DisplayName>
   <Source>response</Source>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <URIPath>
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </URIPath>
   <QueryParam name="a-query-param">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </QueryParam>
   <Header name="a-header">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </Header>
   <FormParam name="a-form-param">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </FormParam>
   <Variable name="request.content">
     <Pattern>REGEX PATTERN</Pattern>
     <Pattern>REGEX PATTERN</Pattern>
   </Variable>
   <XMLPayload>
     <Namespaces>
       <Namespace prefix="apigee">http://www.apigee.com</Namespace>
     </Namespaces>
     <XPath>
       <Expression>/apigee:Greeting/apigee:User</Expression>
       <Type>string</Type>
       <Pattern>REGEX PATTERN</Pattern>
       <Pattern>REGEX PATTERN</Pattern>
     </XPath>
   </XMLPayload>
   <JSONPayload>
     <JSONPath>
       <Expression>$.store.book[*].author</Expression>
       <Pattern>REGEX PATTERN</Pattern>
       <Pattern>REGEX PATTERN</Pattern>
     </JSONPath>
    </JSONPayload>
</RegularExpressionProtection>

&lt;RegularExpressionProtection&gt; özellikler

<RegularExpressionProtection async="false" continueOnError="false" enabled="true" name="Regular-Expression-Protection-1">

Aşağıdaki tabloda tüm politika üst öğelerinde ortak olan özellikler açıklanmaktadır:

Özellik Açıklama Varsayılan Varlık
name

Politikanın dahili adı. name özelliğinin değeri Harf, sayı, boşluk, kısa çizgi, alt çizgi ve nokta içermelidir. Bu değer, 255 karakteri aşmalıdır.

İsteğe bağlı olarak, politikayı<DisplayName> yönetim arayüzü proxy düzenleyicisinde farklı bir doğal dil adı kullanabilir.

Yok Zorunlu
continueOnError

Bir politika başarısız olduğunda hata döndürmesi için false olarak ayarlayın. Bu beklenen bir durumdur çoğu politika için geçerli olur.

Akış yürütmenin bir politikadan sonra bile devam etmesi için true olarak ayarlayın başarısız olur.

false İsteğe bağlı
enabled

Politikayı uygulamak için true olarak ayarlayın.

Politikayı devre dışı bırakmak için false değerine ayarlayın. Bu politika, bir akışa bağlı kalsa bile uygulanır.

true İsteğe bağlı
async

Bu özelliğin desteği sonlandırıldı.

false Kullanımdan kaldırıldı

&lt;DisplayName&gt; öğe

Politikayı name özelliğine ek olarak farklı bir doğal dil adına sahip yönetim arayüzü proxy düzenleyicisi.

<DisplayName>Policy Display Name</DisplayName>
Varsayılan

Yok

Bu öğeyi çıkarırsanız politikanın name özelliğinin değeri: kullanılır.

Varlık İsteğe bağlı
Tür Dize

&lt;Source&gt; öğe

Bilgilerin çıkarılması gereken mesajı belirtir.

<Source> öğesi atlanırsa değer varsayılan olarak message. Örneğin, <Source>message</Source>. Şuna ayarlandığında message, politika bir isteğe eklendiğinde kaynak olarak istek mesajını kullanır akışı sağlar. Benzer şekilde politika, yanıt akışına eklendiğinde yanıt mesajını kullanır.

Kaynak mesaj çözümlenemezse veya mesaj olmayan bir türe dönüşürse politika hata döndürür.

<Source>response</Source>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

&lt;IgnoreUnresolvedVariables&gt; öğe

Politikanın çözülemez.

false (varsayılan) değerine ayarlanırsa politika, çözülemeyen bir değişkeniyle karşılaşıldı. true olarak ayarlanırsa çözümlenmemiş değişken boş olarak değerlendirilir dize (boş).

<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Varsayılan: false
Bulunma: İsteğe bağlı
Tür: Boole

&lt;URIPath&gt; öğe

Bilgilerin istek URI yolundan çıkarılması ve değerlendirilmesi gerektiğini belirtir karşılaştırılması gerekir. En az bir tane sağlamalısınız Eşleşecek bir normal ifade kalıbı belirten <Pattern> öğesi.

<URIPath>
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</URIPath>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

&lt;QueryParam&gt; öğe

İstek sorgu parametresinden bilginin çıkarılması gerektiğini ve değerlendirilen normal ifadelerdir. En az bir tane sağlamalısınız Eşleşecek bir normal ifade kalıbı belirten <Pattern> öğesi.

<QueryParam name="a-query-param">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</QueryParam>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

Özellikler

Özellik Açıklama Varsayılan Varlık
ad için bilgi ayıklanması gereken istek sorgu parametresinin adı normal ifadelerle karşılaştırarak değerlendirmelisiniz. Yok Zorunlu

&lt;Header&gt; öğe

İstek ve yanıt başlıklarından ve değerlendirilen normal ifadelerdir. En az bir tane sağlamalısınız Eşleşecek bir normal ifade kalıbı belirten <Pattern> öğesi.

<Header name="a-header">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</Header>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

Özellikler

Özellik Açıklama Varsayılan Varlık
ad

Bilgilerin çıkarılması gereken istek ve yanıt başlığının adı kullanılan normal ifadelere göre derecelendirilir.

Yok Zorunlu

&lt;FormParam&gt; öğe

Bilgilerin istek formu parametresinden çıkarılması ve değerlendirilmesi gerektiğini belirtir karşılaştırılması gerekir. En az bir tane sağlamalısınız Eşleşecek bir normal ifade kalıbı belirten <Pattern> öğesi.

<FormParam name="a-form-param">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</FormParam>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

Özellikler

Özellik Açıklama Varsayılan Varlık
ad

için bilgi ayıklanması gereken istek formu parametresinin adı normal ifadelerle karşılaştırarak değerlendirmelisiniz.

Yok Zorunlu

&lt;Variable&gt; öğe

Bilgilerin belirtilen değişkenden çıkarılması ve bu değişkene göre değerlendirilmesi gerektiğini belirtir verilen normal ifadelerdir.

<Variable name="request.content">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</Variable>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

Özellikler

Özellik Açıklama Varsayılan Varlık
ad

Değerlendirme için bilginin ayıklanması gereken değişkenin adı karşılaştırılması gerekir.

Yok Zorunlu

&lt;XMLPayload&gt; öğe

Bilgilerin bir XML yükünden çıkarılması ve normal ifadelerin olduğu anlamına gelir.

<XMLPayload>
   <Namespaces>
      <Namespace prefix="apigee">http://www.apigee.com</Namespace>
   </Namespaces>
   <XPath>
      <Expression>/apigee:Greeting/apigee:User</Expression>
      <Type>string</Type>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </XPath>
</XMLPayload>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

&lt;XMLPayload&gt;/&lt;Namespaces&gt; öğe

XPath değerlendirmesinde kullanılacak ad alanlarını belirtir.

<XMLPayload>
   <Namespaces>
      <Namespace prefix="apigee">http://www.apigee.com</Namespace>
   </Namespaces>
   <XPath>
      <Expression>/apigee:Greeting/apigee:User</Expression>
      <Type>string</Type>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </XPath>
</XMLPayload>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

&lt;XMLPayload&gt;/&lt;Namespaces&gt;/&lt;Namespace&gt; öğe

Her ad alanını veya XPath değerlendirmesinde kullanılır.
<Namespaces>
   <Namespace prefix="apigee">http://www.apigee.com</Namespace>
</Namespaces>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

Özellikler

Özellik Açıklama Varsayılan Varlık
önek

Belirli bir ad alanının nitelenmesine yardımcı olmak için bir ön ek sağlar.

Yok Zorunlu

&lt;XMLPayload&gt;/&lt;XPath&gt; öğe

XPath'i belirtir olması gerekir.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

&lt;XMLPayload&gt;/&lt;XPath&gt;/&lt;Expression&gt; öğe

Değişken için tanımlanan XPath ifadesini belirtir. Yalnızca XPath 1.0 ifadeleri desteklenir. Örneğin, <Expression>/company/employee[@age>=$request.header.age]</Expression>. yaşı request.header.age.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

&lt;XMLPayload&gt;/&lt;XPath&gt;/&lt;Type&gt; öğe

Veri türünü belirtir.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Varsayılan: dize
Bulunma: İsteğe bağlı
Tür: Dize
Geçerli değerler:

Dize. Geçerli değerler şunlardır: string, boolean, int, long, float, double ve nodeset.

&lt;XMLPayload&gt;/&lt;XPath&gt;/&lt;Pattern&gt; öğe

Normal ifade modelini tanımlar. Bir normal ifade <Pattern> öğeniz XML'de ayrılmış karakterler içeriyor (", &, ', < veya .) eklemeden önce XML olarak kodlamanız gerekir.

<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Varsayılan: Yok
Bulunma: Zorunlu
Tür: Dize

&lt;JSONPayload&gt; öğe

Bilgilerin bir JSON yükünden çıkarılması ve normal ifadelerin olduğu anlamına gelir.

<JSONPayload>
   <JSONPath>
      <Expression>$.store.book[*].author</Expression>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </JSONPath>
</JSONPayload>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Yok

Özellikler

Özellik Açıklama Varsayılan Varlık
escapeSlashCharacter

Normal satırdaki eğik çizgi (/) karakterlerinden kurtulmak için true olarak ayarlayın <JSONPath>/<Pattern> içinde yer alan ifadeler.

true İsteğe bağlı

&lt;JSONPayload&gt;/&lt;JSONPath&gt;/&lt;Expression&gt; öğe

Değişken için tanımlanan JSONPath ifadesini belirtir.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

&lt;JSONPayload&gt;/&lt;JSONPath&gt;/&lt;Pattern&gt; öğe

Normal ifade modelini tanımlar. <Pattern> öğesi XML ile ayrılmış karakterler içeriyor (", &, ', < veya .), eklemeden önce XML olarak kodlamanız gerekir.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
Varsayılan: Yok
Bulunma: Zorunlu
Tür: Dize

Hata referansı

Bu bölümde, bu politika bir hatayı tetiklediğinde Edge tarafından ayarlanan hata kodları, döndürülen mesajlar ve hata değişkenleri açıklanmaktadır. Hataları ele almak için hata kuralları geliştirip geliştirmediğinizi bilmek önemlidir. Bir hatayı yakalamak ve kendi özel hatanızı oluşturmak istiyorsanız politika kök öğesinde continueOnError="true" özelliğini ayarlayın. Daha fazla bilgi için Politika hataları hakkında bilmeniz gerekenler ve Hataları işleme bölümlerine bakın.

Edge politikalarından döndürülen hatalar, Hata kodu referansı bölümünde açıklanan tutarlı bir biçimde olur.

Çalışma zamanı hataları

Politika yürütüldüğünde bu hatalar ortaya çıkabilir.

Hata Kodu Message
ExecutionFailed NormalExpressionProtection Adım Tanımı {0} yürütülemedi. Neden: {1}
InstantiationFailed regularExpressionProtection StepDefinition {0} örneklendirmesi başarısız oldu
NonMessageVariable {0} değişkeni bir Mesaj oluşturmuyor
SourceMessageNotAvailable {0} iletisi, RegularExpressionProtection StepDefinition için kullanılamıyor {1}
ThreatDetected {0} içinde Normal İfade Tehdidi Algılandı: normal ifade: {1} giriş: {2}
VariableResolutionFailed {0} değişkeni çözümlenemedi

Dağıtım hataları

Hata Kodu Message Düzelt
CannotBeConvertedToNodeset RegularExpressionProtection {0}: xpath {1} işleminin sonucu düğüm kümesine dönüştürülemez. Bağlam {2}
DuplicatePrefix RegularExpressionProtection {0}: Yinelenen ön ek {1}
EmptyJSONPathExpression NormalExpressionProtection {0}: Boş JSONPath ifadesi
EmptyXPathExpression NormalExpressionProtection {0}: Boş XPath ifadesi
InvalidRegularExpression RegularExpressionProtection {0}: Geçersiz Normal İfade {1}, Bağlam {2}
JSONPathCompilationFailed NormalExpressionProtection {0}: jsonpath {1} derlenemedi. Bağlam {2}
NONBlankPrefixMappedToBlankURI NormalExpressionProtection {0}: Boş olmayan ön ek {1}, boş uri ile eşlenemez
NoPatternsToEnforce NormalExpressionProtection {0}: {1} içinde zorunlu kılınacak kalıp yoktur
NothingToEnforce RegularExpressionProtection {0}: URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload'un en az biri zorunludur
XPathCompilationFailed NormalExpressionProtection {0}: xpath {1} derlenemedi. Bağlam {2}

Hata değişkenleri

Bu değişkenler, bu politika bir hatayı tetiklediğinde ayarlanır. Daha fazla bilgi için Politika hataları hakkında bilmeniz gerekenler bölümüne bakın.

Değişkenler Konum Örnek
fault.name="fault_name" fault_name, yukarıdaki tabloda listelenen hatanın adıdır. fault.name Matches "ThreatDetected"
regularexpressionprotection.policy_name.failed policy_name, hataya neden olan politikanın kullanıcı tarafından belirtilen adıdır. regularexpressionprotection.Regular-Expressions-Protection-1.failed = true

Şemalar

İlgili konular

JSON Tehdidi Koruma politikası

XML Tehdidi Koruma politikası