API Aturan Keamanan Database Firebase

Aturan: Jenis

.membaca

Memberikan klien akses baca ke lokasi Firebase Realtime Database.

Aturan .read adalah jenis Aturan Keamanan yang memberi klien akses baca ke lokasi Firebase Realtime Database. Misalnya:

 ".read": "auth != null && auth.provider == 'twitter'"

Nilai aturan .read adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran. Aturan .read yang memberikan izin untuk membaca suatu lokasi juga akan mengizinkan pembacaan turunan mana pun dari lokasi tersebut, meskipun turunan tersebut memiliki aturan .read sendiri yang gagal.

Aturan .read memiliki akses ke semua Variabel Aturan Firebase Realtime Database kecuali newData .

.menulis

Memberikan klien akses tulis ke lokasi Firebase Realtime Database.

Aturan .write adalah jenis Aturan Keamanan yang memberikan akses tulis kepada klien ke lokasi Firebase Realtime Database. Misalnya:

".write": "auth != null && auth.token.isAdmin == true"

Nilai aturan .write adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran. Aturan .write yang memberikan izin untuk menulis ke suatu lokasi juga akan mengizinkan penulisan ke turunan mana pun dari lokasi tersebut, meskipun turunan tersebut memiliki aturan .write sendiri yang gagal.

Aturan .write memiliki akses ke semua Variabel Aturan Firebase Realtime Database.

.mengesahkan

Digunakan setelah aturan .write memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan skema tertentu.

Aturan .validate digunakan setelah aturan .write memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan standar tertentu. Selain akses pemberian .write , semua aturan .validate yang relevan harus berhasil sebelum penulisan diizinkan. Misalnya:

".validate": "newData.hasChildren(['name', 'age'])"

Nilai aturan .validate adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran.

Aturan .validate memiliki akses ke semua Variabel Aturan Firebase Realtime Database.

.indexOn

Meningkatkan kinerja kueri dengan memberi tahu Firebase Realtime Database kunci mana yang ingin data Anda diindeks.

Aturan .indexOn memberi tahu server Firebase Realtime Database untuk mengindeks kunci tertentu dalam data Anda guna meningkatkan performa kueri Anda. Misalnya, jika ada database yang berisi kumpulan data dinosaurus, kita dapat meminta Firebase Realtime Database untuk mengoptimalkan kueri, sebelum kueri tersebut dikembalikan dari server, dengan menambahkan aturan ini:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Anda dapat mengetahui informasi selengkapnya tentang aturan .indexOn dengan merujuk ke bagian panduan keamanan tentang pengindeksan data Anda .

Aturan: Variabel

autentik

Variabel yang berisi payload token jika klien diautentikasi, atau null jika klien tidak diautentikasi.

Firebase Realtime Database memungkinkan Anda mengautentikasi dengan mudah ke beberapa penyedia bawaan dan akan menghasilkan token autentikasi untuk penyedia tersebut. Setelah pengguna diautentikasi dengan salah satu penyedia bawaan, variabel autentikasi akan berisi yang berikut:

Bidang Keterangan
provider Metode autentikasi yang digunakan (misalnya "password", "anonymous", "facebook", "github", "google", atau "twitter").
uid ID pengguna unik, dijamin unik di semua penyedia.
token Isi token ID Firebase Auth. Lihat auth.token .

Sebagai contoh, kita dapat memiliki aturan seperti berikut untuk mengizinkan pengguna membuat komentar selama mereka menyimpan ID pengguna mereka dengan komentar tersebut:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

Kami juga bisa membuat aturan seperti berikut untuk memperbolehkan pengguna membuat komentar selama mereka masuk menggunakan Facebook:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && auth.provider == 'facebook'"
    }
  }
}

auth.token

Variabel yang berisi konten token ID Firebase Auth.

Token berisi beberapa atau semua kunci berikut:

Bidang Keterangan
email Alamat email yang terkait dengan akun tersebut, jika ada.
email_verified true jika pengguna telah memverifikasi bahwa mereka memiliki akses ke alamat email . Beberapa penyedia secara otomatis memverifikasi alamat email yang mereka miliki.
phone_number Nomor telepon yang terkait dengan akun tersebut, jika ada.
name Nama tampilan pengguna, jika disetel.
sub UID Firebase pengguna. Ini unik dalam sebuah proyek.
firebase.identities Kamus semua identitas yang terkait dengan akun pengguna ini. Kunci kamus dapat berupa salah satu dari yang berikut: email , phone , google.com , facebook.com , github.com , twitter.com . Nilai kamus adalah rangkaian pengidentifikasi unik untuk setiap penyedia identitas yang terkait dengan akun. Misalnya, auth.token.firebase.identities["google.com"][0] berisi ID pengguna Google pertama yang terkait dengan akun tersebut.
firebase.sign_in_provider Penyedia masuk digunakan untuk mendapatkan token ini. Dapat berupa salah satu string berikut: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant TenantId yang terkait dengan akun, jika ada. misalnya tenant2-m6tyz

Jika menggunakan autentikasi khusus, auth.token juga berisi klaim khusus apa pun yang ditentukan oleh pengembang.

Semua nilai ini dapat digunakan dalam aturan. Misalnya, untuk membatasi akses ke akun Google yang dikaitkan dengan alamat gmail.com, kita dapat menambahkan aturan:

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

Untuk kelengkapan, kolom berikut juga disertakan, dalam auth.token , namun sepertinya tidak berguna untuk aturan.

Bidang Keterangan
iss Penerbit token.
aud Penonton untuk token tersebut.
auth_time Terakhir kali pengguna mengautentikasi dengan kredensial menggunakan perangkat yang menerima token.
iat Waktu saat token dikeluarkan.
exp Waktu kadaluwarsa token.

$lokasi

Variabel yang dapat digunakan untuk mereferensikan kunci $location yang digunakan sebelumnya dalam struktur aturan.

Ketika Anda memiliki $location dalam struktur aturan Anda, Anda dapat menggunakan variabel $ yang cocok dalam ekspresi aturan Anda untuk mendapatkan nama anak sebenarnya yang sedang dibaca atau ditulis. Jadi misalkan kita ingin memberi setiap pengguna akses baca dan tulis ke lokasi /users/<user> mereka masing-masing. Kita bisa menggunakan:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "auth.uid === $user",
        ".write": "auth.uid === $user"
      }
    }
  }
}

Ketika klien mencoba mengakses /users/barney , lokasi default $user akan cocok dengan $user yang sama dengan "barney". Jadi aturan .read akan memeriksa apakah auth.uid === 'barney' . Akibatnya, pembacaan /users/barney hanya akan berhasil jika klien diautentikasi dengan nama "barney".

Sekarang

Berisi jumlah milidetik sejak zaman Unix menurut server Firebase Realtime Database.

Variabel now berisi jumlah milidetik sejak zaman UNIX menurut server Firebase Realtime Database. Misalnya, Anda dapat menggunakan ini untuk memvalidasi bahwa waktu yang created pengguna tidak pernah disetel ke waktu di masa mendatang:

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

akar

RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda.

Variabel root memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda. Anda dapat menggunakan ini untuk membaca data apa pun di database Anda dalam ekspresi aturan Anda. Misalnya, jika kita ingin memperbolehkan pengguna membaca /comments hanya jika /users/<id>/active mereka disetel ke true, kita dapat menggunakan:

{
  "rules": {
    "comments": {
      ".read": "root.child('users').child(auth.uid).child('active').val() == true"
    }
  }
}

Kemudian, jika /users/barney/active berisi nilai true, pengguna yang diautentikasi dengan uid "barney" dapat menulis ke node /comments .

data

RuleDataSnapshot yang sesuai dengan data saat ini di Firebase Realtime Database di lokasi aturan yang sedang dijalankan.

Variabel data memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di lokasi database dari aturan yang sedang dijalankan (sebagai lawan dari root, yang memberi Anda data untuk root database Anda).

Jadi misalnya, jika Anda ingin mengizinkan klien mengakses /users/<user> jika /users/<user>/public disetel ke true, Anda dapat menggunakan:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

Variabel data tersedia dalam aturan .read , .write , dan .validate .

Data baru

RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diperbolehkan.

Untuk aturan .write dan .validate , variabel newData memberi Anda RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diizinkan (ini adalah "penggabungan" data yang sudah ada ditambah data baru yang sedang ditulis). Jadi jika Anda ingin memastikan bahwa setiap pengguna memiliki nama dan usia, Anda dapat menggunakan:

{
  "rules": {
    "users": {
      "$user": {
        ".read": true,
        ".write": true,
        ".validate": "newData.hasChildren(['name', 'age'])"
      }
    }
  }
}

Karena newData menggabungkan data yang ada dan data baru, ia berperilaku baik bahkan untuk pembaruan "sebagian". Misalnya:

var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();

Variabel newData tidak tersedia dalam aturan .read karena tidak ada data baru yang ditulis. Anda sebaiknya menggunakan data saja.

RuleDataSnapshot: Metode

val()

Mendapatkan nilai primitif ( string , number , boolean , atau null ) dari RuleDataSnapshot ini.

Nilai Pengembalian : ( String , Number , Boolean , Null ) - Nilai primitif dari RuleDataSnapshot ini .

Berbeda dengan DataSnapshot.val() , memanggil val() pada RuleDataSnapshot yang memiliki data anak tidak akan mengembalikan objek yang berisi anak tersebut. Ini malah akan mengembalikan nilai penjaga khusus. Hal ini memastikan peraturan selalu dapat beroperasi dengan sangat efisien.

Sebagai konsekuensinya, Anda harus selalu menggunakan child() untuk mengakses anak-anak (misalnya data.child('name').val() , bukan data.val().name ).

Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.

".read": "data.child('isReadable').val() == true"

anak()

Mendapatkan RuleDataSnapshot untuk lokasi di jalur relatif yang ditentukan.

Argumen : childPath String - Jalur relatif ke lokasi data anak.

Nilai Pengembalian : RuleDataSnapshot - RuleDataSnapshot untuk lokasi anak.

Jalur relatif dapat berupa nama anak sederhana (misalnya 'fred') atau jalur yang dipisahkan garis miring (misalnya 'fred/nama/pertama'). Jika lokasi anak tidak memiliki data, RuleDataSnapshot kosong akan dikembalikan.

Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.

".read": "data.child('isReadable').val() == true"

induk()

Mendapatkan RuleDataSnapshot untuk lokasi induk.

Nilai Pengembalian : RuleDataSnapshot - RuleDataSnapshot untuk lokasi induk.

Jika instance ini merujuk ke root Firebase Realtime Database Anda, instance tersebut tidak memiliki induk, dan parent() akan gagal, sehingga menyebabkan ekspresi aturan saat ini dilewati (sebagai kegagalan).

Contoh ini hanya mengizinkan pembacaan jika saudara isReadable disetel ke true.

".read": "data.parent().child('isReadable').val() == true"

hasChild(childPath)

Mengembalikan nilai benar jika anak yang ditentukan ada.

Argumen : childPath String - Jalur relatif ke lokasi calon anak.

Nilai Pengembalian : Boolean - true jika data ada di jalur anak yang ditentukan; jika tidak, false .

Contoh ini hanya mengizinkan penulisan data jika berisi "nama" anak.

".validate": "newData.hasChild('name')"

hasChildren([anak-anak])

Memeriksa keberadaan anak-anak.

Argumen : Array children opsional - Array kunci anak yang semuanya harus ada.

Nilai Pengembalian : Boolean - true jika anak (yang ditentukan) ada; jika tidak, false .

Jika tidak ada argumen yang diberikan, argumen tersebut akan mengembalikan nilai true jika RuleDataSnapshot memiliki turunan. Jika array nama anak disediakan, array tersebut akan mengembalikan nilai true hanya jika semua anak yang ditentukan ada di RuleDataSnapshot .

Contoh ini hanya mengizinkan penulisan data jika berisi satu atau lebih turunan.

".validate": "newData.hasChildren()"

Contoh ini hanya memperbolehkan penulisan data jika berisi "nama" dan "umur" anak.

".validate": "newData.hasChildren(['name', 'age'])"

ada()

Mengembalikan nilai benar jika RuleDataSnapshot ini berisi data apa pun.

Nilai Pengembalian : Boolean - true jika RuleDataSnapshot berisi data apa pun; jika tidak, false .

Fungsi yang ada mengembalikan nilai true jika RuleDataSnapshot ini berisi data apa pun. Ini murni fungsi kenyamanan karena data.exists() setara dengan data.val() != null .

Contoh ini mengizinkan penulisan di lokasi ini selama tidak ada data.

".write": "!data.exists()"

dapatkan Prioritas()

Mendapatkan prioritas data dalam RuleDataSnapshot .

Nilai Pengembalian : ( String , Number , Null ) - Prioritas data dalam RuleDataSnapshot ini.

Contoh ini memastikan bahwa data baru yang ditulis memiliki prioritas

".validate": "newData.getPriority() != null"

isNumber()

Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai numerik.

Nilai Pengembalian : Boolean - true jika datanya numerik; jika tidak, false .

Contoh ini memastikan bahwa data baru yang ditulis memiliki "usia" anak dengan nilai numerik.

".validate": "newData.child('age').isNumber()"

isString()

Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai string.

Nilai Pengembalian : Boolean - true jika datanya berupa String ; jika tidak, false .

Contoh ini memastikan bahwa data baru yang ditulis memiliki "nama" anak dengan nilai string.

".validate": "newData.child('name').isString()

isBoolean()

Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai boolean.

Nilai Pengembalian : Boolean - true jika datanya adalah Boolean ; jika tidak, false .

Contoh ini memastikan bahwa data baru yang ditulis memiliki anak "aktif" dengan nilai boolean.

".validate": "newData.child('active').isBoolean()"

Tali: Properti

panjang

Mengembalikan panjang string.

Return Value : Number - Jumlah karakter dalam string.

Contoh ini memerlukan string minimal 10 karakter.

".validate": "newData.isString() && newData.val().length >= 10"

Tali: Metode

berisi (substring)

Mengembalikan nilai benar jika string berisi substring yang ditentukan.

Argumen : substring String - Substring yang harus dicari.

Nilai Pengembalian : Boolean - true jika string berisi substring yang ditentukan; jika tidak, false .

Contoh ini memerlukan data berupa string yang berisi "@".

".validate": "newData.isString() && newData.val().contains('@')"

dimulaiDengan(substring)

Mengembalikan nilai benar jika string dimulai dengan substring yang ditentukan.

Argumen : substring String - Substring yang harus dicari di awal.

Nilai Pengembalian : Boolean - true jika string berisi substring yang ditentukan; jika tidak, false .

Contoh ini mengizinkan akses baca jika auth.token.identifier dimulai dengan "internal-"

".read": "auth.token.identifier.beginsWith('internal-')"

berakhirDengan(substring)

Mengembalikan nilai benar jika string diakhiri dengan substring yang ditentukan.

Argumen : substring String - Substring yang harus dicari di akhir.

Nilai Pengembalian : Boolean - true jika string diakhiri dengan substring yang ditentukan; jika tidak, false .

Contoh ini mengizinkan akses baca jika auth.token.identifier diakhiri dengan "@company.com"

".read": "auth.token.identifier.endsWith('@company.com')"

ganti(substring, penggantian)

Mengembalikan salinan string dengan semua contoh substring tertentu diganti dengan string pengganti yang ditentukan.

Argumen : substring String - Substring yang harus dicari. replacement String - Sebuah string untuk menggantikan substring.

Nilai Pengembalian : String - String baru setelah mengganti substring dengan pengganti.

Metode replace() sedikit berbeda dari metode replace() JavaScript karena metode ini menggantikan semua instance dari substring tertentu dengan string pengganti yang ditentukan, bukan hanya instance pertama.

Karena titik tidak diperbolehkan dalam kunci, kita perlu meng-escape string dengan titik sebelum menyimpannya. Contohnya adalah dengan alamat email. Asumsikan kita memiliki daftar alamat email yang masuk daftar putih di node /whitelist/ kita:

{
 "user": {
   "$uid": {
     "email": <email>
   }
 },
 "whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
}

Kita dapat membuat aturan yang hanya mengizinkan pengguna untuk ditambahkan jika email mereka ada di node /whitelist/ :

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "true",
        ".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
      }
    }
  }
}

ke Huruf Kecil()

Mengembalikan salinan string yang dikonversi ke huruf kecil.

Nilai Pengembalian : String - String diubah menjadi huruf kecil.

Contoh ini memungkinkan akses baca jika auth.token.identifier karena semua huruf kecil ada di bawah /users .

".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"

ke Huruf Besar()

Mengembalikan salinan string yang dikonversi ke huruf besar.

Nilai Pengembalian : String - String diubah menjadi huruf besar.

Contoh ini memungkinkan akses baca jika auth.token.identifier karena semua huruf besar ada di bawah /users .

".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"

cocok (regex)

Mengembalikan nilai benar jika string cocok dengan literal ekspresi reguler yang ditentukan.

Nilai Pengembalian : Boolean - true jika string cocok dengan literal ekspresi reguler, regex; jika tidak, false .

Lihat dokumentasi aturan regex selengkapnya.

Operator

+ (tambahkan)

Digunakan untuk menambahkan variabel atau untuk penggabungan string.

Contoh berikut memastikan bahwa nilai baru menambah nilai yang sudah ada sebanyak satu. Ini berguna untuk mengimplementasikan penghitung:

".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"

- (meniadakan atau mengurangi)

Digunakan untuk meniadakan nilai atau mengurangi dua nilai dalam ekspresi aturan.

Aturan validasi ini memeriksa apakah nilai baru adalah kebalikan dari nilai turunan di lokasi:

".validate": "newData.val() === -(data.child('quantity').val())"

Contoh berikut menggunakan pengurangan untuk memastikan bahwa hanya pesan dari sepuluh menit terakhir yang dapat dibaca:

".read": "newData.child('timestamp').val() > (now - 600000)"

* (kalikan)

Digunakan untuk mengalikan variabel dalam ekspresi aturan.

Aturan validasi ini memeriksa apakah nilai baru sama dengan produk harga dan kuantitas (dua nilai yang ada):

".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"

/ (membagi)

Digunakan untuk membagi variabel dalam ekspresi aturan.

Dalam contoh berikut, aturan validasi memastikan bahwa data yang disimpan adalah rata-rata dari total data yang disimpan di tempat lain:

".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"

% (modulus)

Digunakan untuk mencari sisa pembagian satu variabel dengan variabel lain dalam ekspresi aturan.

Aturan ini memvalidasi bahwa hanya bilangan genap yang dapat ditulis:

".validate": "newData.val() % 2 === 0"

=== (sama dengan)

Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan memiliki tipe dan nilai yang sama.

Aturan berikut menggunakan operator === untuk memberikan akses tulis hanya kepada pemilik akun pengguna. Uid pengguna harus sama persis dengan kunci ( $user_id ) agar aturan dapat dievaluasi menjadi benar.

"users": {
  ".write": "$user_id === auth.uid"
}

!== (tidak sama)

Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan tidak sama.

Aturan baca berikut memastikan bahwa hanya pengguna yang masuk yang dapat membaca data:

".read": "auth !== null"

&& (DAN)

Mengevaluasi menjadi benar jika kedua operan benar. Digunakan untuk mengevaluasi beberapa kondisi dalam ekspresi aturan.

Aturan validasi berikut memeriksa apakah data baru berupa string yang kurang dari 100 karakter:

".validate": "newData.isString() && newData.val().length < 100"

|| (ATAU)

Mengevaluasi menjadi benar jika salah satu operan dalam ekspresi aturan benar.

Pada contoh ini kita bisa menulis selama data lama atau data baru belum ada. Dengan kata lain, kita dapat menulis jika kita menghapus atau membuat data, namun tidak memperbarui data.

".write": "!data.exists() || !newData.exists()"

! (BUKAN)

Mengevaluasi menjadi benar jika operan tunggalnya salah. Dalam ekspresi aturan, ! Operator sering digunakan untuk melihat apakah data telah ditulis ke suatu lokasi.

Aturan berikut hanya mengizinkan akses tulis jika tidak ada data di lokasi yang ditentukan:

".write": "!data.exists()"

> (lebih besar dari)

Digunakan untuk memeriksa apakah suatu nilai lebih besar dari nilai lain dalam ekspresi aturan.

Aturan validasi ini memeriksa bahwa string yang ditulis bukanlah string kosong:

".validate": "newData.isString() && newData.val().length > 0"

< (kurang dari)

Digunakan untuk memeriksa apakah suatu nilai lebih kecil dari nilai lain dalam ekspresi aturan.

Aturan validasi ini memeriksa apakah string kurang dari 20 karakter:

".validate": "newData.isString() && newData.val().length < 20"

>= (lebih besar atau sama dengan)

Digunakan untuk memeriksa apakah suatu nilai lebih besar atau sama dengan nilai lain dalam ekspresi aturan.

Aturan validasi ini memeriksa bahwa string yang ditulis bukanlah string kosong:

".validate": "newData.isString() && newData.val().length >= 1"

<= (kurang dari atau sama dengan)

Digunakan untuk memeriksa apakah suatu nilai kurang dari atau sama dengan nilai lain dalam ekspresi aturan.

Aturan validasi ini memastikan bahwa data baru tidak dapat ditambahkan di masa mendatang:

".validate": "newData.val() <= now"

? (operator terner)

Digunakan untuk mengevaluasi ekspresi aturan bersyarat.

Operator ternary mengambil tiga operan. Operan sebelum ? adalah kondisinya. Jika kondisi bernilai benar, operan kedua akan dievaluasi. Jika kondisinya salah, operan ketiga akan dievaluasi.

Untuk aturan validasi berikut, nilai baru dapat berupa angka atau boolean. Jika berupa angka, maka harus lebih besar dari 0.

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"