Kebijakan RegularExpressionProtection

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Apa

Mengekstrak informasi dari pesan (misalnya, Jalur URI, Parameter Kueri, Header, Parameter Formulir, Variabel, Payload XML, atau Payload JSON) dan mengevaluasi konten tersebut terhadap ekspresi reguler yang telah ditentukan sebelumnya. Jika ada ekspresi reguler yang ditentukan bernilai benar, pesan dianggap sebagai ancaman dan ditolak.

Video

Tonton video berikut untuk mempelajari lebih lanjut kebijakan Perlindungan Ekspresi Reguler.

Video Deskripsi
Melindungi dari serangan injeksi SQL (New Edge) Lindungi dari serangan injeksi SQL menggunakan kebijakan Perlindungan Ekspresi Reguler di UI New Edge Experience.
Melindungi dari serangan injeksi SQL (Classic Edge) Lindungi dari serangan injeksi SQL menggunakan kebijakan Perlindungan Ekspresi Reguler di UI Edge Klasik.

Contoh

GitHub

Contoh perlindungan regex di GitHub menunjukkan cara menjebak potensi serangan injeksi SQL yang dikeluarkan melalui parameter kueri. Selain itu, contoh ini menggambarkan praktik terbaik dalam menetapkan status error 400 generik untuk mencegah peretas mendapatkan informasi berguna dari respons.

Perlindungan dari serangan penyertaan JavaScript

<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>

Contoh di atas menggambarkan cara menggunakan kebijakan RegularExpressionProtection untuk mengevaluasi payload JSON untuk serangan penyertaan JavaScript. Secara khusus, konten yang diekstrak oleh <JSONPath>/<Expression> dievaluasi berdasarkan ekspresi reguler di <JSONPath>/<Pattern>.

Jika ekspresi reguler di <JSONPath>/<Pattern> menyertakan karakter yang dicadangkan XML (", &, ', <, atau .), Anda harus mengenkodenya dalam XML sebelum menyertakannya dalam file konfigurasi XML kebijakan. Misalnya, dalam contoh di atas, ekspresi reguler <\s*script\b[^>]*>[^<]+<\s*\/\s*script\s*> telah dienkode XML sebagai &lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*\/\s*script\s*&gt;.

Selain itu, jika ekspresi reguler Anda menyertakan garis miring (/), Anda harus meng-escape karakter tersebut dengan menetapkan atribut <JSONPayload> escapeSlashCharacter ke true.

Pencocokan yang tidak peka huruf besar/kecil

Pencocokan yang tidak peka huruf besar/kecil adalah kasus penggunaan umum. Berikut adalah contoh cara Anda dapat melakukannya dalam ekspresi reguler menggunakan konstruksi (?i). Dalam contoh ini, misalnya, DELETE, delete, dan Delete akan bernilai benar.

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

Tentang kebijakan Perlindungan Ekspresi Reguler

Apigee Edge memungkinkan Anda mengonfigurasi ekspresi reguler yang dapat dievaluasi terhadap traffic API saat runtime untuk mengidentifikasi ancaman tingkat konten umum yang mengikuti pola tertentu.

Ekspresi reguler, atau regex singkatnya, adalah sekumpulan string yang menentukan pola dalam string. Ekspresi reguler memungkinkan konten dievaluasi secara terprogram untuk pola. Ekspresi reguler dapat digunakan, misalnya, untuk mengevaluasi alamat email guna memastikan strukturnya sudah benar. Untuk mengetahui informasi selengkapnya, lihat Ekspresi Reguler di Java Tutorials.

Penggunaan RegularExpressionProtection yang paling umum adalah evaluasi payload JSON dan XML untuk konten berbahaya.

Tidak ada ekspresi reguler yang dapat menghilangkan semua serangan berbasis konten, dan beberapa mekanisme harus digabungkan untuk mengaktifkan pertahanan mendalam. Bagian ini menjelaskan beberapa pola yang direkomendasikan untuk mengecualikan konten.

Contoh pola pengecualian

Ekspresi reguler harus dienkode XML dalam file konfigurasi XML kebijakan.

Nama Regular Expression
Injeksi SQL
[\s]*((delete)|(exec)|(drop\s*table)|(insert)|(shutdown)|(update)|(\bor\b))
Injeksi Server-Side Include
<!--#(include|exec|echo|config|printenv)\s+.*

Dikodekan XML:

&lt;!--#(include|exec|echo|config|printenv)\s+.*
Injeksi Sintaksis Singkatan XPath
(/(@?[\w_?\w:\*]+(\[[^]]+\])*)?)+
Injeksi Sintaksis yang Diperluas XPath
/?(ancestor(-or-self)?|descendant(-or-self)?|following(-sibling))
Injeksi JavaScript
<\s*script\b[^>]*>[^<]+<\s*/\s*script\s*>

Dikodekan XML:

&lt;\s*script\b[^&gt;]*&gt;[^&lt;]+&lt;\s*/\s*script\s*&gt;
Injeksi Pengecualian Java
.*?Exception in thread.*

Menetapkan header Content-Type dalam permintaan dengan payload XML atau JSON

Payload kebijakan Perlindungan Ekspresi Reguler dapat mencakup elemen berikut:

  • Elemen <XMLPayload>: Menentukan bahwa informasi perlu diekstrak dari payload XML dan dievaluasi terhadap ekspresi reguler yang diberikan.

    Jika Anda menggunakan <XMLPayload> dalam kebijakan, header Content-Type permintaan harus berupa jenis konten XML seperti application/xml atau text/xml.

  • Elemen <JSONPayload>: Menentukan bahwa informasi perlu diekstrak dari payload JSON dan dievaluasi terhadap ekspresi reguler yang diberikan.

    Jika Anda menggunakan <JSONPayload> dalam kebijakan, header Content-Type permintaan harus berupa jenis konten JSON seperti application/json.

Biasanya Anda mendesain API untuk menerima XML atau JSON. Namun, mungkin ada skenario saat API menerima keduanya. Kemudian, Anda dapat menentukan kebijakan Perlindungan Ekspresi Reguler yang menggunakan elemen <XMLPayload> dan <JSONPayload>. Hanya satu elemen yang akan berlaku untuk permintaan tertentu berdasarkan nilai header Content-Type.

Referensi elemen

Referensi elemen menjelaskan elemen dan atribut kebijakan RegularExpressionProtection.

<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>

<RegularExpressionProtection> attributes

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

Tabel berikut menjelaskan atribut yang umum untuk semua elemen induk kebijakan:

Atribut Deskripsi Default Ketersediaan
name

Nama internal kebijakan. Nilai atribut name dapat berisi huruf, angka, spasi, tanda hubung, garis bawah, dan titik. Nilai ini tidak boleh melebihi 255 karakter.

Secara opsional, gunakan elemen <DisplayName> untuk memberi label kebijakan di editor proxy UI pengelolaan dengan nama natural language yang berbeda.

T/A Wajib
continueOnError

Tetapkan ke false untuk menampilkan error saat kebijakan gagal. Diharapkan untuk sebagian besar kebijakan.

Setel ke true agar eksekusi alur dapat dilanjutkan bahkan setelah kebijakan gagal.

salah Opsional
enabled

Setel ke true untuk menerapkan kebijakan.

Setel ke false untuk menonaktifkan kebijakan. Kebijakan ini tidak akan ditegakkan meskipun tetap terikat pada alur.

true Opsional
async

Atribut ini tidak digunakan lagi.

salah Tidak digunakan lagi

&lt;DisplayName&gt; elemen

Gunakan selain atribut name untuk memberi label kebijakan di editor proxy UI dengan nama natural language yang berbeda.

<DisplayName>Policy Display Name</DisplayName>
Default

T/A

Jika Anda menghapus elemen ini, nilai atribut name kebijakan akan menjadi data

Ketersediaan Opsional
Jenis String

Elemen <Source>

Menunjukkan pesan dari mana informasi perlu diekstrak.

Jika elemen <Source> tidak ada, nilai defaultnya adalah message. Misalnya, <Source>message</Source>. Jika disetel ke message, kebijakan akan menggunakan pesan permintaan sebagai sumber saat dilampirkan ke alur permintaan. Demikian pula, kebijakan menggunakan pesan respons saat dilampirkan ke alur respons.

Jika pesan sumber tidak dapat diselesaikan atau jika diselesaikan ke jenis non-pesan, kebijakan akan menampilkan error.

<Source>response</Source>
Default: T/A
Kehadiran: Opsional
Jenis: String

Elemen <IgnoreUnresolvedVariables>

Menentukan apakah kebijakan menampilkan error saat menemukan variabel yang tidak dapat diselesaikan.

Jika disetel ke false (default), kebijakan akan menampilkan error saat variabel yang tidak dapat diselesaikan ditemukan. Jika disetel ke true, variabel yang belum diselesaikan akan diperlakukan sebagai string kosong (Null).

<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
Default: false
Kehadiran: Opsional
Jenis: Boolean

Elemen <URIPath>

Menentukan bahwa informasi perlu diekstrak dari jalur URI permintaan dan dievaluasi terhadap ekspresi reguler yang diberikan. Anda harus memberikan setidaknya satu elemen <Pattern> yang menentukan pola ekspresi reguler yang akan dicocokkan.

<URIPath>
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</URIPath>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Elemen <QueryParam>

Menentukan bahwa informasi perlu diekstrak dari parameter kueri permintaan dan dievaluasi terhadap ekspresi reguler yang diberikan. Anda harus memberikan setidaknya satu elemen <Pattern> yang menentukan pola ekspresi reguler yang akan dicocokkan.

<QueryParam name="a-query-param">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</QueryParam>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Atribut

Atribut Deskripsi Default Ketersediaan
nama Nama parameter kueri permintaan yang informasinya perlu diekstrak untuk evaluasi terhadap ekspresi reguler yang diberikan. T/A Wajib

Elemen <Header>

Menentukan bahwa informasi perlu diekstrak dari header permintaan dan respons serta dievaluasi terhadap ekspresi reguler yang diberikan. Anda harus memberikan setidaknya satu elemen <Pattern> yang menentukan pola ekspresi reguler yang akan dicocokkan.

<Header name="a-header">
  <Pattern>REGEX PATTERN</Pattern>
  <Pattern>REGEX PATTERN</Pattern>
</Header>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Atribut

Atribut Deskripsi Default Ketersediaan
nama

Nama header permintaan dan respons yang informasinya perlu diekstrak untuk dievaluasi berdasarkan ekspresi reguler yang diberikan.

T/A Wajib

Elemen <FormParam>

Menentukan bahwa informasi perlu diekstrak dari parameter formulir permintaan dan dievaluasi terhadap ekspresi reguler yang diberikan. Anda harus memberikan setidaknya satu elemen <Pattern> yang menentukan pola ekspresi reguler yang akan dicocokkan.

<FormParam name="a-form-param">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</FormParam>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Atribut

Atribut Deskripsi Default Ketersediaan
nama

Nama parameter formulir permintaan yang informasinya perlu diekstrak untuk evaluasi terhadap ekspresi reguler yang diberikan.

T/A Wajib

Elemen <Variable>

Menentukan bahwa informasi perlu diekstrak dari variabel yang diberikan dan dievaluasi terhadap ekspresi reguler yang diberikan.

<Variable name="request.content">
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</Variable>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Atribut

Atribut Deskripsi Default Ketersediaan
nama

Nama variabel yang informasinya perlu diekstrak untuk evaluasi terhadap ekspresi reguler yang diberikan.

T/A Wajib

Elemen <XMLPayload>

Menentukan bahwa informasi perlu diekstrak dari payload XML dan dievaluasi terhadap ekspresi reguler yang diberikan.

<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>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Elemen <XMLPayload>/<Namespaces>

Menentukan namespace yang akan digunakan dalam evaluasi XPath.

<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>
Default: T/A
Kehadiran: Opsional
Jenis: String

Elemen <XMLPayload>/<Namespaces>/<Namespace>

Menentukan setiap namespace yang akan digunakan dalam evaluasi XPath.
<Namespaces>
   <Namespace prefix="apigee">http://www.apigee.com</Namespace>
</Namespaces>
Default: T/A
Kehadiran: Opsional
Jenis: String

Atribut

Atribut Deskripsi Default Ketersediaan
awalan

Menyediakan awalan untuk membantu memenuhi syarat namespace tertentu.

T/A Wajib

Elemen <XMLPayload>/<XPath>

Menentukan XPath yang akan dievaluasi.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

<XMLPayload>/<XPath>/<Expression> element

Menentukan ekspresi XPath yang ditentukan untuk variabel. Hanya ekspresi XPath 1.0 yang didukung. Misalnya, <Expression>/company/employee[@age>=$request.header.age]</Expression> mengekstrak detail karyawan yang usianya lebih besar dari atau sama dengan nilai yang ditentukan dalam request.header.age.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Default: T/A
Kehadiran: Opsional
Jenis: String

<XMLPayload>/<XPath>/<Type> element

Menentukan jenis data.
<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Default: string
Kehadiran: Opsional
Jenis: String
Nilai yang valid:

String. Nilai yang valid mencakup string, boolean, int, long, float, double, dan nodeset.

<XMLPayload>/<XPath>/<Pattern> element

Menentukan pola ekspresi reguler. Jika ekspresi reguler dalam elemen<Pattern> Anda menyertakan karakter yang dicadangkan XML (", &, ', <, atau .), Anda harus mengenkodenya dalam XML sebelum menyertakannya.

<XPath>
   <Expression>/apigee:Greeting/apigee:User</Expression>
   <Type>string</Type>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</XPath>
Default: T/A
Kehadiran: Wajib
Jenis: String

Elemen <JSONPayload>

Menentukan bahwa informasi perlu diekstrak dari payload JSON dan dievaluasi terhadap ekspresi reguler yang diberikan.

<JSONPayload>
   <JSONPath>
      <Expression>$.store.book[*].author</Expression>
      <Pattern>REGEX PATTERN</Pattern>
      <Pattern>REGEX PATTERN</Pattern>
   </JSONPath>
</JSONPayload>
Default: T/A
Kehadiran: Opsional
Jenis: T/A

Atribut

Atribut Deskripsi Default Ketersediaan
escapeSlashCharacter

Setel ke true untuk meng-escape karakter garis miring (/) dalam ekspresi reguler di <JSONPath>/<Pattern>.

true Opsional

Elemen <JSONPayload>/<JSONPath>/<Expression>

Menentukan ekspresi JSONPath yang ditentukan untuk variabel.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
Default: T/A
Kehadiran: Opsional
Jenis: String

<JSONPayload>/<JSONPath>/<Pattern> element

Menentukan pola ekspresi reguler. Jika ekspresi reguler dalam elemen <Pattern> Anda menyertakan karakter yang dicadangkan XML (", &, ', <, atau .), Anda harus mengenkodenya dengan XML sebelum menyertakannya.

<JSONPath>
   <Expression>$.store.book[*].author</Expression>
   <Pattern>REGEX PATTERN</Pattern>
   <Pattern>REGEX PATTERN</Pattern>
</JSONPath>
Default: T/A
Kehadiran: Wajib
Jenis: String

Referensi error

Bagian ini menjelaskan kode dan pesan error yang ditampilkan, serta variabel kesalahan yang ditetapkan oleh Edge saat kebijakan ini memicu error. Informasi ini penting untuk diketahui apakah Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Jika ingin menangkap error dan melaporkan error kustom Anda sendiri, tetapkan atribut continueOnError="true" pada elemen root kebijakan. Untuk mempelajari lebih lanjut, lihat Hal yang perlu Anda ketahui tentang error kebijakan dan Menangani kesalahan.

Error yang ditampilkan dari kebijakan Edge mengikuti format yang konsisten seperti yang dijelaskan dalam Referensi kode error.

Error runtime

Error ini dapat terjadi saat kebijakan dieksekusi.

Kode Error Pesan
ExecutionFailed Gagal menjalankan RegularExpressionProtection StepDefinition {0}. Alasan: {1}
InstantiationFailed Gagal membuat instance RegularExpressionProtection StepDefinition {0}
NonMessageVariable Variabel {0} tidak menghasilkan Pesan
SourceMessageNotAvailable {0} tidak tersedia untuk RegularExpressionProtection StepDefinition {1}
ThreatDetected Ancaman Ekspresi Reguler Terdeteksi di {0}: ekspresi reguler: {1} input: {2}
VariableResolutionFailed Gagal me-resolve variabel {0}

Error saat deployment

Kode Error Pesan Perbaiki
CannotBeConvertedToNodeset RegularExpressionProtection {0}: Hasil xpath {1} tidak dapat dikonversi ke nodeset. Konteks {2}
DuplicatePrefix RegularExpressionProtection {0}: Awalan duplikat {1}
EmptyJSONPathExpression RegularExpressionProtection {0}: Ekspresi JSONPath kosong
EmptyXPathExpression RegularExpressionProtection {0}: Ekspresi XPath kosong
InvalidRegularExpression RegularExpressionProtection {0}: Ekspresi Reguler Tidak Valid {1}, Konteks {2}
JSONPathCompilationFailed RegularExpressionProtection {0}: Gagal mengompilasi jsonpath {1}. Konteks {2}
NONEmptyPrefixMappedToEmptyURI RegularExpressionProtection {0}: Awalan tidak kosong {1} tidak dapat dipetakan ke uri kosong
NoPatternsToEnforce RegularExpressionProtection {0}: Tidak ada pola untuk diterapkan di {1}
NothingToEnforce RegularExpressionProtection {0}: setidaknya salah satu dari URIPath, QueryParam, Header, FormParam, XMLPayload, JSONPayload bersifat wajib
XPathCompilationFailed RegularExpressionProtection {0}: Gagal mengompilasi xpath {1}. Konteks {2}

Variabel kesalahan

Variabel ini ditetapkan saat kebijakan ini memicu error. Untuk informasi selengkapnya, lihat Yang perlu Anda ketahui tentang error kebijakan.

Variabel Dari mana Contoh
fault.name="fault_name" fault_name adalah nama kesalahan, seperti yang tercantum pada tabel di atas. fault.name Matches "ThreatDetected"
regularexpressionprotection.policy_name.failed policy_name adalah nama kebijakan yang ditentukan pengguna yang menampilkan kesalahan. regularexpressionprotection.Regular-Expressions-Protection-1.failed = true

Skema

Topik terkait

Kebijakan perlindungan terhadap Ancaman JSON

Kebijakan Perlindungan dari Ancaman XML