{"id":45643,"date":"2026-11-11T21:02:37","date_gmt":"2026-11-11T18:02:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/"},"modified":"2026-11-11T21:03:00","modified_gmt":"2026-11-11T18:03:00","slug":"uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/","title":{"rendered":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor"},"content":{"rendered":"<h2>\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor<\/h2>\n<p>Bir geli\u015ftirici olarak, \u00fcretim ortam\u0131nda ya\u015fanan sorunlar kadar can s\u0131k\u0131c\u0131 \u00e7ok az \u015fey vard\u0131r. \u00d6zellikle de bu sorun, basit bir yap\u0131land\u0131rma hatas\u0131ndan kaynaklan\u0131yorsa ve uygulaman\u0131z\u0131n temel g\u00fcvenlik katman\u0131n\u0131 etkiliyorsa. Y\u0131llar \u00f6nce, Firebase Firestore g\u00fcvenlik kurallar\u0131m\u0131 yanl\u0131\u015f yap\u0131land\u0131rmam sonucu, \u00f6nemli bir kullan\u0131c\u0131 verisi koleksiyonunun yanl\u0131\u015fl\u0131kla genel eri\u015fime a\u00e7\u0131ld\u0131\u011f\u0131n\u0131 fark etti\u011fimde ya\u015fad\u0131\u011f\u0131m \u015fok, hala d\u00fcn gibi akl\u0131mda. Neyse ki, bu ac\u0131 verici deneyimden b\u00fcy\u00fck bir ders \u00e7\u0131kard\u0131m ve art\u0131k Firebase Em\u00fclat\u00f6r Paketi (Emulator Suite) sayesinde benzer hatalar\u0131n \u00f6n\u00fcne ge\u00e7iyorum. Bu makalede, bu tecr\u00fcbemi payla\u015facak, Firestore g\u00fcvenlik kurallar\u0131n\u0131n \u00f6nemini vurgulayacak ve em\u00fclat\u00f6rlerin geli\u015ftirme s\u00fcrecinizde nas\u0131l vazge\u00e7ilmez bir ara\u00e7 haline gelebilece\u011fini ad\u0131m ad\u0131m a\u00e7\u0131klayaca\u011f\u0131m. Amac\u0131m, sizin de benim ya\u015fad\u0131\u011f\u0131m hatalar\u0131 yapmaman\u0131z i\u00e7in pratik bilgiler ve stratejiler sunmak.<\/p>\n<h2>Firestore G\u00fcvenlik Kurallar\u0131 Neden Bu Kadar Hayati? Temel Kavramlar<\/h2>\n<p>Bulut tabanl\u0131 bir NoSQL veri taban\u0131 olan Google Firestore, uygulamalar\u0131n verilerini depolamak ve senkronize etmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 sunar. Ancak bu g\u00fcc\u00fcn kontrols\u00fcz kullan\u0131lmas\u0131, ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilir. \u0130\u015fte bu noktada Firestore g\u00fcvenlik kurallar\u0131 devreye girer. Bu kurallar, veri taban\u0131n\u0131zdaki verilere kimlerin, ne zaman ve nas\u0131l eri\u015febilece\u011fini belirleyen bir dizi ko\u015fuldur. Temelde, uygulaman\u0131z\u0131n kullan\u0131c\u0131lar\u0131 ile veri taban\u0131 aras\u0131ndaki bir g\u00fcvenlik duvar\u0131 (firewall) g\u00f6revi g\u00f6r\u00fcrler. Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc (data integrity) sa\u011flamak ve hassas bilgileri yetkisiz eri\u015fimden korumak i\u00e7in mutlak suretle do\u011fru yap\u0131land\u0131r\u0131lmalar\u0131 gerekir.<\/p>\n<p>Kurallar, Firebase konsolu \u00fczerinden veya yerel bir dosya (genellikle <code>firestore.rules<\/code>) arac\u0131l\u0131\u011f\u0131yla yaz\u0131l\u0131r. JavaScript benzeri bir syntax (s\u00f6zdizimi) kullan\u0131r ve <code>allow read, write: if &lt;ko\u015ful&gt;;<\/code> format\u0131nda tan\u0131mlan\u0131rlar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n sadece kendi profiline eri\u015fmesini sa\u011flamak i\u00e7in \u015fu t\u00fcr bir kural yaz\u0131labilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nservice cloud.firestore {\n  match \/databases\/{database}\/documents {\n    match \/users\/{userId} {\n      allow read, update, delete: if request.auth.uid == userId;\n      allow create: if request.auth.uid != null;\n    }\n  }\n}\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>\/users\/{userId}<\/code> koleksiyonundaki belgelere yaln\u0131zca kimli\u011fi do\u011frulanm\u0131\u015f (authenticated) ve <code>userId<\/code> de\u011feri kendi UID&#8217;si (benzersiz kullan\u0131c\u0131 kimli\u011fi) ile e\u015fle\u015fen kullan\u0131c\u0131n\u0131n okuma, g\u00fcncelleme ve silme izni oldu\u011fu belirtilmi\u015ftir. Yeni bir kullan\u0131c\u0131 olu\u015fturma izni ise herhangi bir kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131ya verilmi\u015ftir. Bu basit kural bile, kullan\u0131c\u0131lar\u0131n birbirlerinin verilerini g\u00f6rmesini veya de\u011fi\u015ftirmesini engeller. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda kurallar \u00e7ok daha karma\u015f\u0131k hale gelebilir. Koleksiyon gruplar\u0131 (collection groups), i\u00e7 i\u00e7e ge\u00e7mi\u015f alt koleksiyonlar (subcollections) ve farkl\u0131 rol tabanl\u0131 eri\u015fim kontrolleri (role-based access control) gibi durumlar, kural yaz\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f bir kural\u0131n potansiyel sonu\u00e7lar\u0131 olduk\u00e7a a\u011f\u0131rd\u0131r. En hafif senaryoda, uygulaman\u0131zda beklenmedik hatalar veya veri eri\u015fim sorunlar\u0131 ya\u015fanabilir. En k\u00f6t\u00fc senaryoda ise, hassas kullan\u0131c\u0131 verileri (e-posta adresleri, ki\u015fisel bilgiler, finansal veriler) yetkisiz ki\u015filerin eline ge\u00e7ebilir veya veri taban\u0131n\u0131z spam i\u00e7eriklerle doldurulabilir. Bu t\u00fcr g\u00fcvenlik ihlalleri, hem kullan\u0131c\u0131 g\u00fcvenini zedeler hem de yasal sorumluluklar do\u011furabilir. Dolay\u0131s\u0131yla, Firestore g\u00fcvenlik kurallar\u0131n\u0131 sadece birer &#8220;ayr\u0131nt\u0131&#8221; olarak g\u00f6rmek yerine, uygulaman\u0131z\u0131n temel g\u00fcvenlik mimarisinin ayr\u0131lmaz bir par\u00e7as\u0131 olarak ele almak elzemdir. Bu kurallar\u0131n do\u011fru bir \u015fekilde test edilmesi ve do\u011frulanmas\u0131, \u00fcretim ortam\u0131na da\u011f\u0131t\u0131mdan \u00f6nce kritik bir ad\u0131md\u0131r.<\/p>\n<h2>Ger\u00e7ek Bir Senaryo: \u00dcretimde K\u0131r\u0131lan Kurallar\u0131n Hikayesi ve Sonu\u00e7lar\u0131<\/h2>\n<p>Y\u0131llar \u00f6nce geli\u015ftirdi\u011fimiz bir sosyal medya uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n kendi g\u00f6nderilerini ve yorumlar\u0131n\u0131 y\u00f6netebildi\u011fi, ancak di\u011fer kullan\u0131c\u0131lar\u0131n g\u00f6nderilerine sadece okuma eri\u015fimi oldu\u011fu bir yap\u0131 vard\u0131. \u0130lk ba\u015fta, kurallar olduk\u00e7a basitti ve bu temel senaryoyu kaps\u0131yordu. Ancak uygulama b\u00fcy\u00fcd\u00fck\u00e7e ve yeni \u00f6zellikler eklendik\u00e7e, kurallar da karma\u015f\u0131kla\u015fmaya ba\u015flad\u0131. Bir g\u00fcn, kullan\u0131c\u0131lar\u0131n &#8220;taslak&#8221; g\u00f6nderiler olu\u015fturabilece\u011fi ve bunlar\u0131 daha sonra yay\u0131nlayabilece\u011fi yeni bir \u00f6zellik eklemeye karar verdik. Bu taslaklar\u0131n, kullan\u0131c\u0131 yay\u0131nlamadan \u00f6nce sadece g\u00f6nderinin sahibi taraf\u0131ndan g\u00f6r\u00fclebilmesi gerekiyordu.<\/p>\n<p>Yeni \u00f6zelli\u011fi devreye al\u0131rken, mevcut <code>\/posts\/{postId}<\/code> koleksiyonuna ek olarak <code>\/posts\/{postId}\/drafts\/{draftId}<\/code> \u015feklinde bir alt koleksiyon yap\u0131s\u0131 kulland\u0131k. G\u00fcvenlik kurallar\u0131n\u0131 g\u00fcncellerken, taslaklara eri\u015fimi k\u0131s\u0131tlamak i\u00e7in \u015f\u00f6yle bir kural eklemeyi planlad\u0131k:<\/p>\n<div class=\"code-container\">\n<pre><code>\nmatch \/posts\/{postId} {\n  allow read: if true; \/\/ Herkes g\u00f6nderileri okuyabilir\n  allow write: if request.auth.uid == resource.data.authorId; \/\/ Sadece yazar yazabilir\n\n  match \/drafts\/{draftId} {\n    allow read, write: if request.auth.uid == get(\/databases\/$(database)\/documents\/posts\/$(postId)).data.authorId;\n  }\n}\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Ancak, bir anl\u0131k dikkatsizlik veya aceleyle, taslaklar i\u00e7in yaz\u0131lan kuralda <code>get()<\/code> fonksiyonunu kullan\u0131rken path&#8217;i yanl\u0131\u015f yazd\u0131\u011f\u0131m\u0131 veya <code>request.auth.uid<\/code> kontrol\u00fcn\u00fc hatal\u0131 yapt\u0131\u011f\u0131m\u0131 fark etmedim. Hatta daha k\u00f6t\u00fcs\u00fc, o d\u00f6nemde kapsaml\u0131 bir yerel test altyap\u0131m\u0131z yoktu. K\u00fc\u00e7\u00fck de\u011fi\u015fikliklerin \u00fcretimde sorun yaratmayaca\u011f\u0131 yan\u0131lg\u0131s\u0131na kap\u0131larak, bu kural\u0131 do\u011frudan \u00fcretim ortam\u0131na da\u011f\u0131tt\u0131m. Her \u015fey yolunda g\u00f6r\u00fcn\u00fcyordu, ta ki birka\u00e7 g\u00fcn sonra beklenmedik bir durumla kar\u015f\u0131la\u015fana kadar.<\/p>\n<p>Bir kullan\u0131c\u0131, kendi taslak g\u00f6nderisini silmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda bir hata ald\u0131\u011f\u0131n\u0131 bildirdi. \u0130lk ba\u015fta, bunun bir uygulama katman\u0131 hatas\u0131 oldu\u011funu d\u00fc\u015f\u00fcnd\u00fck. Ancak loglar\u0131 inceledi\u011fimizde, kullan\u0131c\u0131n\u0131n &#8220;izin reddedildi&#8221; (permission denied) hatas\u0131 ald\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. Daha da k\u00f6t\u00fcs\u00fc, ba\u015fka bir kullan\u0131c\u0131, arkada\u015f\u0131n\u0131n hen\u00fcz yay\u0131nlamad\u0131\u011f\u0131 bir tasla\u011f\u0131 uygulama i\u00e7inde g\u00f6rebildi\u011fini iddia etti. \u0130\u015fte o an buz gibi bir ter bo\u015fald\u0131 aln\u0131mdan. Kurallar\u0131 kontrol etti\u011fimde, taslaklara eri\u015fim kural\u0131n\u0131n asl\u0131nda olmas\u0131 gerekti\u011fi gibi \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131, hatta baz\u0131 durumlarda hi\u00e7 kimsenin eri\u015femedi\u011fini, baz\u0131 durumlarda ise herkesin eri\u015febildi\u011fini fark ettim. Yanl\u0131\u015fl\u0131kla ya <code>allow read: if true;<\/code> kural\u0131n\u0131 taslaklara da uygulam\u0131\u015f ya da <code>get()<\/code> fonksiyonuyla yap\u0131lan yazar kontrol\u00fcnde bir hata yapm\u0131\u015ft\u0131m.<\/p>\n<p>Bu durum, veri s\u0131z\u0131nt\u0131s\u0131 (data leak) potansiyeli ta\u015f\u0131yan ciddi bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131yd\u0131. Hemen m\u00fcdahale ederek kurallar\u0131 d\u00fczelttik ve acil bir yama (hotfix) da\u011f\u0131tt\u0131k. Neyse ki, herhangi bir k\u00f6t\u00fc niyetli kullan\u0131m veya geni\u015f \u00e7apl\u0131 veri s\u0131z\u0131nt\u0131s\u0131 ya\u015fanmad\u0131. Ancak bu olay, ekibe ve bana, g\u00fcvenlik kurallar\u0131n\u0131n ne kadar kritik oldu\u011funu ve bunlar\u0131n \u00fcretim \u00f6ncesinde ne kadar titizlikle test edilmesi gerekti\u011fini \u00e7ok ac\u0131 bir \u015fekilde \u00f6\u011fretti. Bu tecr\u00fcbe, Firebase Em\u00fclat\u00f6r Paketi gibi ara\u00e7lar\u0131n geli\u015ftirme s\u00fcrecimize entegre edilmesinin ne kadar hayati oldu\u011funu anlamam\u0131z\u0131 sa\u011flad\u0131. Bir daha asla, bir g\u00fcvenlik kural\u0131n\u0131 yerel olarak test etmeden do\u011frudan \u00fcretim ortam\u0131na g\u00f6ndermeme karar\u0131 ald\u0131k. Bu olay, asl\u0131nda bir felaketin e\u015fi\u011finden d\u00f6nmekle kalmay\u0131p, g\u00fcvenlik testleri konusunda t\u00fcm ekibin zihniyetini de\u011fi\u015ftiren bir d\u00f6n\u00fcm noktas\u0131 oldu.<\/p>\n<h2>Firebase Em\u00fclat\u00f6r Paketi: Yerel Geli\u015ftirmenin ve Testin Yeni Y\u00fcz\u00fc<\/h2>\n<p>\u00dcretim ortam\u0131nda ya\u015fanan o talihsiz olaydan sonra, benzer hatalar\u0131 \u00f6nlemek i\u00e7in daha sa\u011flam bir geli\u015ftirme ve test s\u00fcrecine ihtiyac\u0131m\u0131z oldu\u011fu a\u015fikard\u0131. \u0130\u015fte bu noktada Firebase Em\u00fclat\u00f6r Paketi (Firebase Emulator Suite) imdad\u0131m\u0131za yeti\u015fti. Firebase Em\u00fclat\u00f6r Paketi, Firebase hizmetlerinin yerel bir s\u00fcr\u00fcm\u00fcn\u00fc bilgisayar\u0131n\u0131zda \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131yan bir ara\u00e7 setidir. Bu sayede, uygulaman\u0131z\u0131 ger\u00e7ek Firebase projelerinize ba\u011flanmadan, tamamen izole (isolated) bir ortamda geli\u015ftirebilir, test edebilir ve hata ay\u0131klayabilirsiniz (debug).<\/p>\n<p>Em\u00fclat\u00f6r Paketi, sadece Firestore i\u00e7in de\u011fil, ayn\u0131 zamanda Authentication, Cloud Functions, Hosting, Realtime Database, Pub\/Sub ve Storage gibi bir\u00e7ok Firebase hizmeti i\u00e7in de yerel em\u00fclat\u00f6rler sunar. Bu, t\u00fcm uygulaman\u0131z\u0131n yerel ortamda, ger\u00e7ek bir Firebase projesi gibi davranan bir sim\u00fclasyon \u00fczerinde \u00e7al\u0131\u015fabilece\u011fi anlam\u0131na gelir. \u00d6zellikle Firestore em\u00fclat\u00f6r\u00fc, g\u00fcvenlik kurallar\u0131n\u0131z\u0131 ger\u00e7ek zamanl\u0131 olarak test etmek i\u00e7in paha bi\u00e7ilmez bir yetenek sunar.<\/p>\n<p>Em\u00fclat\u00f6r kullanman\u0131n ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>\u0130zolasyon ve G\u00fcvenlik:<\/strong> Ger\u00e7ek veri taban\u0131n\u0131za veya kimlik do\u011frulama sisteminize ba\u011flanmad\u0131\u011f\u0131n\u0131z i\u00e7in, geli\u015ftirme s\u0131ras\u0131nda yanl\u0131\u015fl\u0131kla \u00fcretim verilerinizi bozma veya hassas bilgilere eri\u015fme riskiniz ortadan kalkar. Tamamen izole bir ortamda \u00e7al\u0131\u015f\u0131rs\u0131n\u0131z.<\/li>\n<li><strong>H\u0131z ve Verimlilik:<\/strong> Bulut hizmetlerine her istek g\u00f6nderildi\u011finde ya\u015fanan gecikmeleri ortadan kald\u0131r\u0131r. Yerel ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z i\u00e7in i\u015flemler \u00e7ok daha h\u0131zl\u0131 ger\u00e7ekle\u015fir, bu da geli\u015ftirme ve test d\u00f6ng\u00fclerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>Maliyet Tasarrufu:<\/strong> Bulut hizmetlerini kullanmad\u0131\u011f\u0131n\u0131z i\u00e7in, geli\u015ftirme ve test a\u015famalar\u0131nda Firebase faturalar\u0131n\u0131zda \u00f6nemli bir d\u00fc\u015f\u00fc\u015f olur. \u00d6zellikle yo\u011fun test senaryolar\u0131nda bu durum b\u00fcy\u00fck bir avantaj sa\u011flar.<\/li>\n<li><strong>\u00c7evrimd\u0131\u015f\u0131 Geli\u015ftirme:<\/strong> \u0130nternet ba\u011flant\u0131n\u0131z olmasa bile uygulaman\u0131z\u0131 geli\u015ftirmeye ve test etmeye devam edebilirsiniz. Bu, \u00f6zellikle seyahat ederken veya ba\u011flant\u0131 sorunlar\u0131 ya\u015fad\u0131\u011f\u0131n\u0131zda b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar.<\/li>\n<li><strong>Tekrarlanabilirlik:<\/strong> Em\u00fclat\u00f6rler, her zaman ayn\u0131 ba\u015flang\u0131\u00e7 durumunu sa\u011flayarak testlerin tekrarlanabilirli\u011fini (reproducibility) garanti eder. Bu, hata ay\u0131klamay\u0131 ve test senaryolar\u0131n\u0131 standartla\u015ft\u0131rmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenlik Kurallar\u0131 Testi:<\/strong> En \u00f6nemlisi, g\u00fcvenlik kurallar\u0131n\u0131z\u0131n bekledi\u011finiz gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in g\u00fc\u00e7l\u00fc bir test ortam\u0131 sunar. Kurallar\u0131n\u0131z\u0131 yazarken veya de\u011fi\u015ftirirken, an\u0131nda geri bildirim alarak hatalar\u0131 \u00fcretim ortam\u0131na ula\u015fmadan \u00f6nce yakalaman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Em\u00fclat\u00f6r Paketi, Firebase CLI (Command Line Interface) arac\u0131l\u0131\u011f\u0131yla kolayca kurulur ve y\u00f6netilir. Projenizin k\u00f6k dizininde basit komutlarla em\u00fclat\u00f6rleri ba\u015flatabilir, verileri s\u0131f\u0131rlayabilir ve testlerinizi \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu sayede, g\u00fcvenlik kurallar\u0131n\u0131z\u0131n her senaryoda do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in kapsaml\u0131 bir test stratejisi olu\u015fturmak m\u00fcmk\u00fcn hale gelir. Em\u00fclat\u00f6rler, modern Firebase geli\u015ftirme s\u00fcrecinin temel ta\u015flar\u0131ndan biri haline gelmi\u015ftir ve benim gibi \u00fcretimde kural ihlali ya\u015fam\u0131\u015f herkes i\u00e7in adeta bir kurtar\u0131c\u0131d\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m: Firestore Em\u00fclat\u00f6r\u00fc ile G\u00fcvenlik Kurallar\u0131n\u0131 Nas\u0131l Test Edersiniz?<\/h2>\n<p>Firebase Em\u00fclat\u00f6r Paketi&#8217;ni kullanmaya ba\u015flamak ve Firestore g\u00fcvenlik kurallar\u0131n\u0131z\u0131 etkin bir \u015fekilde test etmek olduk\u00e7a basittir. \u0130\u015fte ad\u0131m ad\u0131m nas\u0131l yapaca\u011f\u0131n\u0131z:<\/p>\n<h3>1. Firebase CLI Kurulumu ve Proje Ba\u015flatma<\/h3>\n<p>\u00d6ncelikle, Firebase Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc&#8217;n\u00fcn (CLI) kurulu oldu\u011fundan emin olun. Kurulu de\u011filse, Node.js y\u00fckl\u00fc bir sistemde \u015fu komutla kurabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\nnpm install -g firebase-tools\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Ard\u0131ndan, projenizin k\u00f6k dizininde Firebase&#8217;i ba\u015flat\u0131n ve em\u00fclat\u00f6rleri yap\u0131land\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfirebase init\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu komut, size hangi Firebase hizmetlerini kullanmak istedi\u011finizi soracakt\u0131r. Em\u00fclat\u00f6r Paketi i\u00e7in &#8220;Emulators&#8221; se\u00e7ene\u011fini i\u015faretleyin. Daha sonra hangi em\u00fclat\u00f6rleri kurmak istedi\u011finizi sordu\u011funda &#8220;Firestore&#8221; ve &#8220;Functions&#8221; (e\u011fer Cloud Functions kullan\u0131yorsan\u0131z) gibi ilgili hizmetleri se\u00e7in. Ayr\u0131ca, Firestore g\u00fcvenlik kurallar\u0131n\u0131z\u0131n dosya yolu (genellikle <code>firestore.rules<\/code>) ve Firestore indekslerinizin dosya yolu (genellikle <code>firestore.indexes.json<\/code>) hakk\u0131nda bilgi istenecektir.<\/p>\n<h3>2. Em\u00fclat\u00f6rleri Ba\u015flatma<\/h3>\n<p>Yap\u0131land\u0131rma tamamland\u0131ktan sonra, em\u00fclat\u00f6rleri ba\u015flatmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfirebase emulators:start\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu komut, se\u00e7ti\u011finiz t\u00fcm em\u00fclat\u00f6rleri yerel makinenizde belirli portlarda (\u00f6rne\u011fin, Firestore i\u00e7in 8080) \u00e7al\u0131\u015ft\u0131racakt\u0131r. Ayr\u0131ca, em\u00fclat\u00f6rlerin durumunu ve veri taban\u0131n\u0131 g\u00f6rsel olarak inceleyebilece\u011finiz bir Em\u00fclat\u00f6r UI (kullan\u0131c\u0131 aray\u00fcz\u00fc) de ba\u015flat\u0131l\u0131r. Bu aray\u00fcze genellikle <code>http:\/\/localhost:4000<\/code> adresinden eri\u015febilirsiniz.<\/p>\n<h3>3. G\u00fcvenlik Kurallar\u0131n\u0131 Test Etme<\/h3>\n<p>\u015eimdi en kritik k\u0131sma geldik: g\u00fcvenlik kurallar\u0131n\u0131 programatik olarak test etmek. Firebase, \u00f6zellikle g\u00fcvenlik kurallar\u0131 testi i\u00e7in <code>@firebase\/testing<\/code> k\u00fct\u00fcphanesini sa\u011flar. Bu k\u00fct\u00fcphane, kimli\u011fi do\u011frulanm\u0131\u015f veya do\u011frulanmam\u0131\u015f kullan\u0131c\u0131lar gibi farkl\u0131 ba\u011flamlarda Firestore&#8217;a eri\u015fimi sim\u00fcle etmenizi sa\u011flar.<\/p>\n<p>\u00d6rnek bir test senaryosu olu\u015ftural\u0131m. Diyelim ki <code>\/users\/{userId}<\/code> koleksiyonunda, bir kullan\u0131c\u0131n\u0131n sadece kendi belgesini okuyabilece\u011fi bir kural\u0131n\u0131z var:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ firestore.rules\nservice cloud.firestore {\n  match \/databases\/{database}\/documents {\n    match \/users\/{userId} {\n      allow read: if request.auth.uid == userId;\n      allow write: if request.auth.uid == userId;\n    }\n  }\n}\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu kural\u0131 test etmek i\u00e7in Node.js tabanl\u0131 bir test dosyas\u0131 (\u00f6rne\u011fin, Mocha veya Jest ile) olu\u015fturabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ test\/firestore.test.js\nconst firebase = require(\"@firebase\/testing\");\nconst fs = require(\"fs\");\n\nconst projectId = \"test-project\";\nconst rules = fs.readFileSync(\"firestore.rules\", \"utf8\");\n\ndescribe(\"Firestore G\u00fcvenlik Kurallar\u0131\", () => {\n  let db;\n\n  \/\/ Her testten \u00f6nce em\u00fclat\u00f6r\u00fc s\u0131f\u0131rla ve kurallar\u0131 y\u00fckle\n  beforeEach(async () => {\n    db = firebase.initializeTestEnvironment({ projectId });\n    await db.loadFirestoreRules({ rules });\n  });\n\n  \/\/ Her testten sonra t\u00fcm uygulamalar\u0131 temizle\n  afterEach(async () => {\n    await db.clearFirestore();\n    await Promise.all(firebase.apps().map(app => app.delete()));\n  });\n\n  it(\"Kullan\u0131c\u0131 kendi profilini okuyabilmeli\", async () => {\n    const userId = \"alice\";\n    const docRef = db.authenticatedRequest({ uid: userId }).collection(\"users\").doc(userId);\n    await firebase.assertSucceeds(docRef.get());\n  });\n\n  it(\"Kullan\u0131c\u0131 ba\u015fkas\u0131n\u0131n profilini okuyamamal\u0131\", async () => {\n    const aliceId = \"alice\";\n    const bobId = \"bob\";\n    const docRef = db.authenticatedRequest({ uid: aliceId }).collection(\"users\").doc(bobId);\n    await firebase.assertFails(docRef.get());\n  });\n\n  it(\"Kimli\u011fi do\u011frulanmam\u0131\u015f kullan\u0131c\u0131 hi\u00e7bir profili okuyamamal\u0131\", async () => {\n    const docRef = db.unauthenticatedRequest().collection(\"users\").doc(\"anyUser\");\n    await firebase.assertFails(docRef.get());\n  });\n\n  it(\"Kullan\u0131c\u0131 kendi profilini g\u00fcncelleyebilmeli\", async () => {\n    const userId = \"alice\";\n    const docRef = db.authenticatedRequest({ uid: userId }).collection(\"users\").doc(userId);\n    await firebase.assertSucceeds(docRef.set({ name: \"Alice Updated\" }));\n  });\n\n  it(\"Kullan\u0131c\u0131 ba\u015fkas\u0131n\u0131n profilini g\u00fcncelleyememeli\", async () => {\n    const aliceId = \"alice\";\n    const bobId = \"bob\";\n    const docRef = db.authenticatedRequest({ uid: aliceId }).collection(\"users\").doc(bobId);\n    await firebase.assertFails(docRef.set({ name: \"Bob Updated\" }));\n  });\n});\n      <\/code><\/pre>\n<\/p><\/div>\n<p>Bu test kodunda, <code>firebase.initializeTestEnvironment<\/code> ile bir test ortam\u0131 olu\u015fturulur. <code>db.loadFirestoreRules<\/code> ile <code>firestore.rules<\/code> dosyas\u0131ndaki kurallar em\u00fclat\u00f6re y\u00fcklenir. <code>db.authenticatedRequest({ uid: userId })<\/code> ile belirli bir kullan\u0131c\u0131 olarak kimlik do\u011frulamas\u0131 yap\u0131lm\u0131\u015f bir istek sim\u00fcle edilirken, <code>db.unauthenticatedRequest()<\/code> ile kimli\u011fi do\u011frulanmam\u0131\u015f bir istek sim\u00fcle edilir. <code>firebase.assertSucceeds()<\/code> bir i\u015flemin ba\u015far\u0131l\u0131 olmas\u0131 gerekti\u011fini, <code>firebase.assertFails()<\/code> ise ba\u015far\u0131s\u0131z olmas\u0131 gerekti\u011fini do\u011frular. Bu sayede, her kural\u0131n beklenen davran\u0131\u015f\u0131n\u0131 test edebilirsiniz. Bu t\u00fcr otomatik testler, \u00fcretimde ya\u015fanabilecek g\u00fcvenlik ihlallerini \u00e7ok daha erken a\u015famada tespit etmenizi sa\u011flar.<\/p>\n<h2>Geli\u015fmi\u015f Stratejiler: Em\u00fclat\u00f6rleri CI\/CD S\u00fcre\u00e7lerine Entegre Etmek<\/h2>\n<p>Firebase Em\u00fclat\u00f6r Paketi&#8217;ni kullanmak, yerel geli\u015ftirme ortam\u0131n\u0131zda g\u00fcvenlik kurallar\u0131n\u0131z\u0131 test etmek i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ancak ger\u00e7ek bir profesyonel geli\u015ftirme s\u00fcrecinde, bu testleri otomatikle\u015ftirilmi\u015f bir Continuous Integration\/Continuous Deployment (CI\/CD) (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) hatt\u0131na entegre etmek hayati \u00f6neme sahiptir. Bu, her kod de\u011fi\u015fikli\u011finde g\u00fcvenlik kurallar\u0131n\u0131z\u0131n otomatik olarak test edilmesini ve potansiyel sorunlar\u0131n \u00fcretim ortam\u0131na ula\u015fmadan \u00f6nce tespit edilmesini sa\u011flar.<\/p>\n<h3>CI\/CD Entegrasyonu Ad\u0131mlar\u0131:<\/h3>\n<ol>\n<li><strong>Test Ortam\u0131 Kurulumu:<\/strong> CI\/CD hatt\u0131n\u0131zda, testlerin \u00e7al\u0131\u015faca\u011f\u0131 bir ortam (\u00f6rne\u011fin, bir Docker konteyneri veya sanal makine) olu\u015fturman\u0131z gerekir. Bu ortamda Node.js ve Firebase CLI&#8217;nin kurulu oldu\u011fundan emin olun.<\/li>\n<li><strong>Em\u00fclat\u00f6rleri Ba\u015flatma:<\/strong> Test komut dosyalar\u0131n\u0131zdan \u00f6nce, Firebase Em\u00fclat\u00f6rlerini ba\u015flatan bir ad\u0131m ekleyin. Genellikle <code>firebase emulators:start --only firestore --silent<\/code> gibi bir komut kullan\u0131l\u0131r. <code>--silent<\/code> bayra\u011f\u0131, gereksiz \u00e7\u0131kt\u0131y\u0131 engellerken, <code>--only firestore<\/code> sadece Firestore em\u00fclat\u00f6r\u00fcn\u00fc ba\u015flatarak kaynak kullan\u0131m\u0131n\u0131 optimize eder. Em\u00fclat\u00f6rlerin tamamen ba\u015flamas\u0131 i\u00e7in k\u0131sa bir gecikme (\u00f6rne\u011fin, 5-10 saniye) eklemek iyi bir uygulamad\u0131r.<\/li>\n<li><strong>Testleri \u00c7al\u0131\u015ft\u0131rma:<\/strong> Em\u00fclat\u00f6rler ba\u015flad\u0131ktan sonra, g\u00fcvenlik kurallar\u0131 testlerinizi \u00e7al\u0131\u015ft\u0131ran komutu (\u00f6rne\u011fin, <code>npm test<\/code> veya <code>jest<\/code>) tetikleyin. Bu testler, daha \u00f6nce bahsetti\u011fimiz <code>@firebase\/testing<\/code> k\u00fct\u00fcphanesini kullanarak Firestore em\u00fclat\u00f6r\u00fcne ba\u011flanacak ve kurallar\u0131n\u0131z\u0131 \u00e7e\u015fitli senaryolarda do\u011frulayacakt\u0131r.<\/li>\n<li><strong>Em\u00fclat\u00f6rleri Kapatma:<\/strong> Testler tamamland\u0131ktan sonra, kaynaklar\u0131 serbest b\u0131rakmak i\u00e7in em\u00fclat\u00f6rleri kapatmay\u0131 unutmay\u0131n. Bu genellikle <code>firebase emulators:exec \"your_test_command\"<\/code> \u015feklinde yap\u0131l\u0131r. <code>firebase emulators:exec<\/code> komutu, belirtilen komutu \u00e7al\u0131\u015ft\u0131r\u0131r ve tamamland\u0131\u011f\u0131nda em\u00fclat\u00f6rleri otomatik olarak kapat\u0131r.<\/li>\n<li><strong>Raporlama ve Bildirim:<\/strong> Test sonu\u00e7lar\u0131n\u0131 CI\/CD arac\u0131n\u0131z\u0131n anlayabilece\u011fi bir formatta (\u00f6rne\u011fin, JUnit XML) raporlay\u0131n. Testler ba\u015far\u0131s\u0131z olursa, geli\u015ftiricilere otomatik bildirimler g\u00f6nderilmesini sa\u011flay\u0131n.<\/li>\n<\/ol>\n<p>Bu entegrasyon sayesinde, her kod g\u00f6nderme (commit) veya birle\u015ftirme iste\u011fi (pull request) \u00fczerinde g\u00fcvenlik kurallar\u0131n\u0131z\u0131n otomatik olarak denetlenmesini sa\u011flars\u0131n\u0131z. Bu, manuel test s\u00fcre\u00e7lerinin atlanmas\u0131ndan kaynaklanabilecek hatalar\u0131n \u00f6n\u00fcne ge\u00e7er ve ekibin g\u00fcvenlik konusunda daha proaktif olmas\u0131n\u0131 te\u015fvik eder.<\/p>\n<h3>Karma\u015f\u0131k Kurallar\u0131 Test Etme \u0130pu\u00e7lar\u0131:<\/h3>\n<ul>\n<li><strong>Kimlik Do\u011frulama Ba\u011flamlar\u0131n\u0131 Taklit Etme:<\/strong> <code>request.auth<\/code> nesnesini kullanarak farkl\u0131 kullan\u0131c\u0131 rolleri (y\u00f6netici, standart kullan\u0131c\u0131, misafir) veya kimlik do\u011frulama y\u00f6ntemleri (e-posta\/\u015fifre, Google) i\u00e7in senaryolar olu\u015fturun.<\/li>\n<li><strong><code>get()<\/code> ve <code>exists()<\/code> Fonksiyonlar\u0131n\u0131 Test Etme:<\/strong> Ba\u015fka bir belgeye veya koleksiyona ba\u011f\u0131ml\u0131 olan kurallar\u0131 (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n belirli bir gruba \u00fcye olup olmad\u0131\u011f\u0131n\u0131 kontrol eden kurallar) dikkatlice test edin. <code>firebase.assertSucceeds()<\/code> ve <code>firebase.assertFails()<\/code> ile bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n do\u011fru \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n.<\/li>\n<li><strong>Koleksiyon Gruplar\u0131n\u0131 Test Etme:<\/strong> <code>match \/{path=**}\/myCollection\/{docId}<\/code> gibi koleksiyon grubu kurallar\u0131n\u0131 test ederken, farkl\u0131 \u00fcst koleksiyon yap\u0131lar\u0131 i\u00e7inde bu kurallar\u0131n nas\u0131l davrand\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<li><strong>Veri Do\u011frulama Kurallar\u0131:<\/strong> <code>resource.data<\/code> nesnesini kullanarak, bir belgeye yaz\u0131lan verinin belirli bir \u015femaya (schema) veya boyuta uygun olup olmad\u0131\u011f\u0131n\u0131 do\u011frulayan kurallar\u0131 test edin. \u00d6rne\u011fin, bir g\u00f6nderinin ba\u015fl\u0131\u011f\u0131n\u0131n maksimum 100 karakter olmas\u0131n\u0131 sa\u011flayan bir kural\u0131 test edebilirsiniz.<\/li>\n<\/ul>\n<p>Em\u00fclat\u00f6rlerin CI\/CD s\u00fcre\u00e7lerine entegrasyonu, sadece g\u00fcvenlik kurallar\u0131n\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 art\u0131rmakla kalmaz, ayn\u0131 zamanda geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 art\u0131r\u0131r ve ekiplerinize \u00fcretim ortam\u0131na daha g\u00fcvenle da\u011f\u0131t\u0131m yapma yetene\u011fi kazand\u0131r\u0131r. Bu, modern bulut tabanl\u0131 uygulama geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7: G\u00fcvenli Uygulamalar i\u00e7in Em\u00fclat\u00f6r Odakl\u0131 Geli\u015ftirme<\/h2>\n<p>\u00dcretim ortam\u0131nda Firestore g\u00fcvenlik kurallar\u0131n\u0131 yanl\u0131\u015f yap\u0131land\u0131rma deneyimim, her geli\u015ftiricinin kar\u015f\u0131la\u015fabilece\u011fi, ancak do\u011fru ara\u00e7lar ve s\u00fcre\u00e7lerle kolayca \u00f6nlenebilecek bir hatayd\u0131. Bu ac\u0131 tecr\u00fcbe, Firebase Em\u00fclat\u00f6r Paketi&#8217;nin geli\u015ftirme s\u00fcrecimizdeki \u00f6nemini derinden anlamam\u0131z\u0131 sa\u011flad\u0131. Art\u0131k, g\u00fcvenlik kurallar\u0131n\u0131 yazarken veya g\u00fcncellerken, em\u00fclat\u00f6rler \u00fczerinde kapsaml\u0131 testler yapmadan tek bir sat\u0131r kodu bile \u00fcretim ortam\u0131na g\u00f6ndermiyoruz. Bu yakla\u015f\u0131m, sadece olas\u0131 veri ihlallerini engellemekle kalm\u0131yor, ayn\u0131 zamanda geli\u015ftirme h\u0131z\u0131m\u0131z\u0131 art\u0131r\u0131yor ve ekibimizin yaz\u0131l\u0131mlar\u0131na olan g\u00fcvenini peki\u015ftiriyor.<\/p>\n<p>Firebase Em\u00fclat\u00f6r Paketi, yerel geli\u015ftirme ortam\u0131nda Firebase hizmetlerini taklit ederek, geli\u015ftiricilere izole, h\u0131zl\u0131 ve maliyet etkin bir test alan\u0131 sunar. \u00d6zellikle Firestore g\u00fcvenlik kurallar\u0131 i\u00e7in sundu\u011fu programatik test yetenekleri, karma\u015f\u0131k kural setlerinin bile g\u00fcvenilir bir \u015fekilde do\u011frulanmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. CI\/CD s\u00fcre\u00e7lerine entegre edildi\u011finde ise, her kod de\u011fi\u015fikli\u011finde otomatik g\u00fcvenlik denetimi sa\u011flayarak, potansiyel zafiyetlerin \u00e7ok erken a\u015famalarda tespit edilmesini garanti eder. Bu, reaktif (tepki veren) bir yakla\u015f\u0131mdan proaktif (\u00f6nleyici) bir yakla\u015f\u0131ma ge\u00e7i\u015f anlam\u0131na gelir ki, modern yaz\u0131l\u0131m geli\u015ftirme pratiklerinde bu kritik bir ad\u0131md\u0131r.<\/p>\n<p>Sonu\u00e7 olarak, e\u011fer Firebase kullan\u0131yorsan\u0131z ve hen\u00fcz Em\u00fclat\u00f6r Paketi&#8217;ni geli\u015ftirme i\u015f ak\u0131\u015f\u0131n\u0131za entegre etmediyseniz, bunu ertelemeyin. Bir g\u00fcvenlik ihlali, uygulaman\u0131z\u0131n itibar\u0131na ve kullan\u0131c\u0131 g\u00fcvenine onar\u0131lamaz zararlar verebilir. Em\u00fclat\u00f6rler, bu t\u00fcr riskleri minimize etmenin ve daha sa\u011flam, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar geli\u015ftirmenin anahtar\u0131d\u0131r. Unutmay\u0131n, en iyi g\u00fcvenlik, \u00fcretimde sorunlar\u0131 \u00e7\u00f6zmek de\u011fil, sorunlar\u0131n hi\u00e7 olu\u015fmamas\u0131n\u0131 sa\u011flamakt\u0131r. Em\u00fclat\u00f6rler, tam da bu felsefeyi benimsemenize yard\u0131mc\u0131 olacak g\u00fc\u00e7l\u00fc bir m\u00fcttefiktir.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>1. Firebase Em\u00fclat\u00f6r Paketi kullanmak zorunlu mu?<\/h3>\n<p>Teknik olarak zorunlu de\u011fildir, ancak g\u00fc\u00e7l\u00fc bir \u015fekilde tavsiye edilir. \u00dcretim ortam\u0131nda g\u00fcvenlik ihlallerini \u00f6nlemek, geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcrmek ve daha h\u0131zl\u0131 test d\u00f6ng\u00fcleri sa\u011flamak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda em\u00fclat\u00f6rs\u00fcz geli\u015ftirme yapmak riskli ve verimsizdir.<\/p>\n<h3>2. Mevcut bir Firebase projesini em\u00fclat\u00f6rlere nas\u0131l ta\u015f\u0131r\u0131m?<\/h3>\n<p>Projenizin k\u00f6k dizininde <code>firebase init<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak em\u00fclat\u00f6rleri yap\u0131land\u0131rabilirsiniz. Mevcut Firestore kurallar\u0131n\u0131z (<code>firestore.rules<\/code>) ve indeksleriniz (<code>firestore.indexes.json<\/code>) otomatik olarak alg\u0131lanacakt\u0131r. Daha sonra uygulaman\u0131z\u0131n Firebase SDK&#8217;s\u0131n\u0131 em\u00fclat\u00f6rlere ba\u011flanacak \u015fekilde yap\u0131land\u0131rman\u0131z gerekir (\u00f6rne\u011fin, web i\u00e7in <code>firebase.firestore().useEmulator(\"localhost\", 8080)<\/code>).<\/p>\n<h3>3. Em\u00fclat\u00f6r testleri ger\u00e7ek performans\u0131 yans\u0131t\u0131r m\u0131?<\/h3>\n<p>Em\u00fclat\u00f6rler, hizmetlerin davran\u0131\u015flar\u0131n\u0131 taklit eder, ancak performans a\u00e7\u0131s\u0131ndan ger\u00e7ek bulut ortam\u0131yla birebir ayn\u0131 de\u011fildir. Yerel ortamda \u00e7al\u0131\u015ft\u0131klar\u0131 i\u00e7in genellikle daha h\u0131zl\u0131d\u0131rlar. Performans testleri i\u00e7in ger\u00e7ek bulut ortam\u0131n\u0131 kullanman\u0131z daha do\u011fru sonu\u00e7lar verecektir. Ancak g\u00fcvenlik kurallar\u0131n\u0131n do\u011frulu\u011fu ve i\u015flevsellik testleri i\u00e7in son derece g\u00fcvenilirdirler.<\/p>\n<h3>4. Sadece Firestore i\u00e7in mi em\u00fclat\u00f6r var?<\/h3>\n<p>Hay\u0131r, Firebase Em\u00fclat\u00f6r Paketi; Authentication, Cloud Functions, Hosting, Realtime Database, Pub\/Sub ve Storage gibi bir\u00e7ok Firebase hizmeti i\u00e7in em\u00fclat\u00f6rler i\u00e7erir. Bu sayede uygulaman\u0131z\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 yerel ortamda test edebilirsiniz.<\/p>\n<h3>5. Em\u00fclat\u00f6r kullan\u0131rken dikkat etmem gerekenler nelerdir?<\/h3>\n<ul>\n<li>Em\u00fclat\u00f6rlerin do\u011fru portlarda \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve uygulaman\u0131z\u0131n bu portlara ba\u011fland\u0131\u011f\u0131ndan emin olun.<\/li>\n<li>Her test d\u00f6ng\u00fcs\u00fcnden \u00f6nce em\u00fclat\u00f6r verilerini temizlemek (<code>db.clearFirestore()<\/code>) testlerin tekrarlanabilirli\u011fini sa\u011flar.<\/li>\n<li>Ger\u00e7ek Firebase projenize yanl\u0131\u015fl\u0131kla ba\u011flanmad\u0131\u011f\u0131n\u0131zdan emin olmak i\u00e7in ortam de\u011fi\u015fkenlerini veya yap\u0131land\u0131rma dosyalar\u0131n\u0131 dikkatlice y\u00f6netin.<\/li>\n<li>Em\u00fclat\u00f6rler en son Firebase \u00f6zelliklerini desteklemekte gecikebilir, bu nedenle Firebase s\u00fcr\u00fcm notlar\u0131n\u0131 takip edin.<\/li>\n<\/ul>\n<p>#Firebase #Firestore #G\u00fcvenlikKurallar\u0131 #WebGeli\u015ftirme #Em\u00fclat\u00f6r<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/firestore-security-rules-emulator-demo\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/firestore-security-rules-emulator-demo<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Bir geli\u015ftirici olarak, \u00fcretim ortam\u0131nda ya\u015fanan sorunlar kadar can s\u0131k\u0131c\u0131 \u00e7ok az \u015fey vard\u0131r.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-45643","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor\" \/>\n<meta property=\"og:description\" content=\"Bir geli\u015ftirici olarak, \u00fcretim ortam\u0131nda ya\u015fanan sorunlar kadar can s\u0131k\u0131c\u0131 \u00e7ok az \u015fey vard\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-11T18:02:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-11T18:03:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor\",\"datePublished\":\"2026-11-11T18:02:37+00:00\",\"dateModified\":\"2026-11-11T18:03:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\"},\"wordCount\":3603,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\",\"name\":\"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-11-11T18:02:37+00:00\",\"dateModified\":\"2026-11-11T18:03:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/","og_locale":"tr_TR","og_type":"article","og_title":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor","og_description":"Bir geli\u015ftirici olarak, \u00fcretim ortam\u0131nda ya\u015fanan sorunlar kadar can s\u0131k\u0131c\u0131 \u00e7ok az \u015fey vard\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-11-11T18:02:37+00:00","article_modified_time":"2026-11-11T18:03:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor","datePublished":"2026-11-11T18:02:37+00:00","dateModified":"2026-11-11T18:03:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/"},"wordCount":3603,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/","url":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/","name":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-11-11T18:02:37+00:00","dateModified":"2026-11-11T18:03:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/uretimde-firestore-kurallarini-ihlal-ettim-simdi-emulator-kurtariyor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u00dcretimde Firestore Kurallar\u0131n\u0131 \u0130hlal Ettim: \u015eimdi Em\u00fclat\u00f6r Kurtar\u0131yor"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=45643"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45643\/revisions"}],"predecessor-version":[{"id":45644,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45643\/revisions\/45644"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=45643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=45643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=45643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}