[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:mobile\u002Fmobile-security-storage":4,"config":211},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":112,"samples":126},"mobile","Mobil","","mobile-security-storage","Mobile Security Storage","tr",75,2400,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,85,88,91,94,97,100,103,106,109],{"key":19,"name":20,"count":11},"fl-dart-async-isolates","Fl Dart Async Isolates",{"key":22,"name":23,"count":11},"fl-dart-language-null-safety","Fl Dart Language Null Safety",{"key":25,"name":26,"count":11},"fl-flutter-persistence-storage","Fl Flutter Persistence Storage",{"key":28,"name":29,"count":11},"fl-flutter-platform-channels-lifecycle","Fl Flutter Platform Channels Lifecycle",{"key":31,"name":32,"count":11},"fl-flutter-rendering-widget-tree","Fl Flutter Rendering Widget Tree",{"key":34,"name":35,"count":11},"fl-flutter-state-management-widgets","Fl Flutter State Management Widgets",{"key":37,"name":38,"count":11},"ios-core-data-swiftdata-persistence","Ios Core Data Swiftdata Persistence",{"key":40,"name":41,"count":11},"ios-lifecycle-background-execution","Ios Lifecycle Background Execution",{"key":43,"name":44,"count":11},"ios-memory-management-arc","Ios Memory Management Arc",{"key":46,"name":47,"count":11},"ios-swift-concurrency-structured","Ios Swift Concurrency Structured",{"key":49,"name":50,"count":11},"ios-swift-type-system-optionals","Ios Swift Type System Optionals",{"key":52,"name":53,"count":11},"ios-swiftui-state-rendering","Ios Swiftui State Rendering",{"key":55,"name":56,"count":11},"kt-android-lifecycle-background-execution","Kt Android Lifecycle Background Execution",{"key":58,"name":59,"count":11},"kt-android-memory-context-leaks","Kt Android Memory Context Leaks",{"key":61,"name":62,"count":11},"kt-android-room-persistence","Kt Android Room Persistence",{"key":64,"name":65,"count":11},"kt-jetpack-compose-state-recomposition","Kt Jetpack Compose State Recomposition",{"key":67,"name":68,"count":11},"kt-kotlin-coroutines-flow","Kt Kotlin Coroutines Flow",{"key":70,"name":71,"count":11},"kt-kotlin-type-system-null-safety","Kt Kotlin Type System Null Safety",{"key":73,"name":74,"count":11},"mobile-distribution-ci","Mobile Distribution Ci",{"key":76,"name":77,"count":11},"mobile-navigation","Mobile Navigation",{"key":79,"name":80,"count":11},"mobile-networking-offline","Mobile Networking Offline",{"key":82,"name":83,"count":11},"mobile-performance-battery","Mobile Performance Battery",{"key":8,"name":9,"count":11},{"key":86,"name":87,"count":11},"mobile-state-data","Mobile State Data",{"key":89,"name":90,"count":11},"mobile-testing-automation","Mobile Testing Automation",{"key":92,"name":93,"count":11},"mobile-ui-lifecycle","Mobile Ui Lifecycle",{"key":95,"name":96,"count":11},"rn-javascript-typescript-fundamentals","Rn Javascript Typescript Fundamentals",{"key":98,"name":99,"count":11},"rn-native-bridge-modules","Rn Native Bridge Modules",{"key":101,"name":102,"count":11},"rn-navigation-lifecycle","Rn Navigation Lifecycle",{"key":104,"name":105,"count":11},"rn-networking-persistence-offline","Rn Networking Persistence Offline",{"key":107,"name":108,"count":11},"rn-performance-rendering","Rn Performance Rendering",{"key":110,"name":111,"count":11},"rn-react-hooks-state-management","Rn React Hooks State Management",[113,117,120,123],{"key":114,"name":115,"count":116},"android-kotlin","Android (Kotlin)",450,{"key":118,"name":119,"count":116},"flutter","Flutter",{"key":121,"name":122,"count":116},"ios-swift","iOS (Swift)",{"key":124,"name":125,"count":116},"react-native","React Native",[127,145,158,172,185,198],{"id":128,"topic":9,"difficulty":129,"body":130,"options":131,"correct_key":136,"explanation":144},"019f677d-2bc3-776c-b0fd-4e773bb08b1f",1,"Mobil bir cihazda \"secure storage\" (güvenli depolama) ile düz bir yerel dosya\u002Fpreferences deposu arasındaki temel fark nedir?",[132,135,138,141],{"key":133,"text":134},"a","Secure storage uygulama kaldırıldığında da kalıcı kalır, düz depolama hiçbir zaman kalmaz",{"key":136,"text":137},"b","Şifrelidir ve işletim sistemi kısıtlar, düz depolama şifresizdir",{"key":139,"text":140},"c","Secure storage yalnızca ücretli geliştirici hesabıyla derlenen uygulamalarda kullanılabilir",{"key":142,"text":143},"d","Secure storage veriyi yalnızca bellekte tutar, diske hiç yazmaz","İşletim sistemi düzeyindeki güvenli depolama veriyi diskte şifreler ve erişimi anahtar yönetimi + uygulama kimliğine bağlar; bu yüzden root\u002Fjailbreak ile dosya taramasıyla okumak çok zordur. Düz preferences dosyası genelde okunabilir düz metin olarak durur.",{"id":146,"topic":9,"difficulty":129,"body":147,"options":148,"correct_key":139,"explanation":157},"019f677d-2bc3-7f24-b656-11b8f42c77c6","Mobil bir cihazda kimlik doğrulama bilgileri saklanırken access token'ı refresh token'dan ayrı tutmak neden önerilir?",[149,151,153,155],{"key":133,"text":150},"Çünkü iki token'ın her zaman farklı bir metin kodlaması kullanması gerekir",{"key":136,"text":152},"Çünkü yalnızca birinin string değer olmasına izin verilir",{"key":139,"text":154},"Refresh token uzun ömürlüdür, sızması çok daha kötüdür",{"key":142,"text":156},"Çünkü mobil işletim sistemleri birden fazla token saklayan uygulamaları reddeder","Refresh token uzun süre boyunca yeni access token üretebildiği için ele geçirilmesi çok daha zararlıdır. Ayrı tutmak, refresh token'a daha sıkı depolama\u002Frotasyon kuralları uygularken access token'ın API çağrılarında daha rahat kullanılmasını sağlar.",{"id":159,"topic":9,"difficulty":160,"body":161,"options":162,"correct_key":133,"explanation":171},"019f677d-2bc4-75ac-b099-02776513eb56",2,"Mobil kimlik doğrulama bağlamında biyometrik bir \"gate\" (kapı) tipik olarak ne için kullanılır?",[163,165,167,169],{"key":133,"text":164},"Zaten saklanan bir sırra erişimi parmak izi\u002Fyüz kontrolüyle kilitlemek",{"key":136,"text":166},"Sunucu tarafı kimlik doğrulamanın tamamen yerini almak, böylece backend kullanıcıyı bir daha hiç doğrulamaz",{"key":139,"text":168},"Kullanıcının şifresini parmak izi desenden üretmek",{"key":142,"text":170},"Ham biyometrik görüntüyü saklanmak üzere backend'e göndermek","Biyometri, zaten saklanan bir şeye erişimi kilitler (ör. cihazda tutulan bir kimlik bilgisinin kilidini açmak) — biyometrik veri cihazda kalır, korunan sır ya da başka bir yere gönderilen veri değildir.",{"id":173,"topic":9,"difficulty":160,"body":174,"options":175,"correct_key":142,"explanation":184},"019f677d-2bc4-7bde-88e9-0488cfd507c6","Bir junior geliştirici kullanıcının oturum token'ını uygulamanın normal (şifresiz) yerel preferences dosyasına düz metin olarak kaydediyor ve \"uygulama sandbox'ı zaten koruyor\" diye düşünüyor. Burada gözden kaçırılan temel risk nedir?",[176,178,180,182],{"key":133,"text":177},"Düz preferences dosyaları hiçbir şekilde string değer tutamaz",{"key":136,"text":179},"Uygulama sandbox'ı her dosyayı otomatik olarak yeniden şifreler, bu yüzden bu aslında güvenlidir",{"key":139,"text":181},"Token bu şekilde saklanırsa anında sona erer",{"key":142,"text":183},"Root\u002Fjailbreak yapılmış cihazda şifresiz dosyalar sandbox dışından okunabilir","Sandbox normal işletim sistemi koşullarında yardımcı olur ama tek tehdit modeli bu değildir: root\u002Fjailbreak yapılmış cihazlar, güvensiz yedekler ya da yükseltilmiş yetkiye sahip zararlı yazılım şifresiz uygulama dosyalarını doğrudan okuyabilir.",{"id":186,"topic":9,"difficulty":129,"body":187,"options":188,"correct_key":136,"explanation":197},"019f677d-2bc5-7456-8c58-4d8a9fc4844d","Kavramsal düzeyde, bir mobil uygulamanın ağ katmanında \"certificate pinning\" (sertifika sabitleme) nedir?",[189,191,193,195],{"key":133,"text":190},"Sunucu yanıt gövdesini çevrimdışı kullanmak üzere diske kaydetmek",{"key":136,"text":192},"Sunucu sertifikasının belirli bir beklenen değerle eşleştiğini doğrulamak",{"key":139,"text":194},"Ağ çağrıları yapmadan önce cihaza fiziksel bir güvenlik anahtarı takmak",{"key":142,"text":196},"Uygulamanın arayüz ekran görüntülerini saklamadan önce şifrelemek","Sertifika sabitleme güveni daraltır: güvenilir bir kök CA'nın imzaladığı herhangi bir sertifika zincirini kabul etmek yerine, uygulama sunucunun sertifikasını\u002Fanahtarını önceden bildiği bir değerle karşılaştırır; bu, bir CA ele geçirilse bile bazı araya girme saldırılarını engeller.",{"id":199,"topic":9,"difficulty":160,"body":200,"options":201,"correct_key":133,"explanation":210},"019f677d-2bc5-7be4-8249-3cd80ccff5c4","Hassas değerlerin (token, şifre) debug\u002Fconsole log ifadelerinde genellikle kaçınılması gereken bir şey olmasının nedeni nedir, bir geliştirme build'inde bile?",[202,204,206,208],{"key":133,"text":203},"Loglar çökme raporlama araçları ya da paylaşılan debug çıktısı tarafından toplanabilir",{"key":136,"text":205},"Log ifadeleri otomatik olarak app store inceleme ekibine gönderilir",{"key":139,"text":207},"Log'da hassas metin görünürse işletim sistemi uygulamayı siler",{"key":142,"text":209},"Bir string değeri loglamak onu depoda kalıcı olarak şifresiz hale getirir","\"Sadece debug\" loglar bile sistem log tamponları, çökme\u002Fanalitik SDK'ları ya da paylaşılan logcat\u002Fconsole çıktısı tarafından toplanabilir; bu yüzden oraya yazılan hassas değerler geliştiricinin korunduğunu sandığı depolama katmanının dışına sızar.",{"fields":212,"seniorities":388,"interview_shapes":389,"locales":394,"oauth":396,"question_count":399,"coach_enabled":400,"jd_match_enabled":400},[213,238,258,275,299,312,331,340,362,369,375,382],{"key":214,"name_tr":215,"name_en":215,"sort":129,"specializations":216},"backend","Backend",[217,220,223,226,229,232,235],{"key":218,"name":219,"field":214},"general","Genel",{"key":221,"name":222,"field":214},"go","Go",{"key":224,"name":225,"field":214},"python","Python",{"key":227,"name":228,"field":214},"java","Java",{"key":230,"name":231,"field":214},"csharp","C#\u002F.NET",{"key":233,"name":234,"field":214},"nodejs","Node.js",{"key":236,"name":237,"field":214},"php","PHP",{"key":239,"name_tr":240,"name_en":240,"sort":160,"specializations":241},"frontend","Frontend",[242,243,246,249,252,255],{"key":218,"name":219,"field":239},{"key":244,"name":245,"field":239},"javascript","JavaScript",{"key":247,"name":248,"field":239},"typescript","TypeScript",{"key":250,"name":251,"field":239},"react","React",{"key":253,"name":254,"field":239},"vue","Vue",{"key":256,"name":257,"field":239},"angular","Angular",{"key":259,"name_tr":260,"name_en":260,"sort":261,"specializations":262},"fullstack","Fullstack",3,[263,264,265,266,267,268,269,270,271,272,273,274],{"key":218,"name":219,"field":259},{"key":221,"name":222,"field":214},{"key":224,"name":225,"field":214},{"key":227,"name":228,"field":214},{"key":230,"name":231,"field":214},{"key":233,"name":234,"field":214},{"key":236,"name":237,"field":214},{"key":244,"name":245,"field":239},{"key":247,"name":248,"field":239},{"key":250,"name":251,"field":239},{"key":253,"name":254,"field":239},{"key":256,"name":257,"field":239},{"key":276,"name_tr":277,"name_en":277,"sort":278,"specializations":279},"devops-cloud","DevOps \u002F Cloud",4,[280,281,284,287,290,293,296],{"key":218,"name":219,"field":276},{"key":282,"name":283,"field":276},"aws","AWS",{"key":285,"name":286,"field":276},"gcp","GCP",{"key":288,"name":289,"field":276},"azure","Azure",{"key":291,"name":292,"field":276},"kubernetes","Kubernetes",{"key":294,"name":295,"field":276},"terraform","Terraform",{"key":297,"name":298,"field":276},"linux","Linux",{"key":300,"name_tr":301,"name_en":301,"sort":302,"specializations":303},"ai-engineer","AI Engineer",5,[304,305,306,309],{"key":218,"name":219,"field":300},{"key":224,"name":225,"field":300},{"key":307,"name":308,"field":300},"llm-rag","LLM\u002FRAG",{"key":310,"name":311,"field":300},"mlops","MLOps",{"key":313,"name_tr":314,"name_en":315,"sort":316,"specializations":317},"database","Veritabanı","Database",6,[318,319,322,325,328],{"key":218,"name":219,"field":313},{"key":320,"name":321,"field":313},"postgresql","PostgreSQL",{"key":323,"name":324,"field":313},"mysql","MySQL",{"key":326,"name":327,"field":313},"mongodb","MongoDB",{"key":329,"name":330,"field":313},"redis","Redis",{"key":5,"name_tr":6,"name_en":332,"sort":333,"specializations":334},"Mobile",7,[335,336,337,338,339],{"key":218,"name":219,"field":5},{"key":121,"name":122,"field":5},{"key":114,"name":115,"field":5},{"key":118,"name":119,"field":5},{"key":124,"name":125,"field":5},{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"security","Güvenlik","Security",8,[346,347,350,353,356,359],{"key":218,"name":219,"field":341},{"key":348,"name":349,"field":341},"appsec","AppSec",{"key":351,"name":352,"field":341},"offensive-pentest","Offensive \u002F Pentest",{"key":354,"name":355,"field":341},"cloud-security","Cloud Security",{"key":357,"name":358,"field":341},"devsecops","DevSecOps",{"key":360,"name":361,"field":341},"blue-team-incident","Blue Team \u002F Incident",{"key":363,"name_tr":364,"name_en":365,"sort":366,"specializations":367},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[368],{"key":218,"name":219,"field":363},{"key":370,"name_tr":371,"name_en":371,"sort":372,"specializations":373},"data-engineer","Data Engineer",10,[374],{"key":218,"name":219,"field":370},{"key":376,"name_tr":377,"name_en":378,"sort":379,"specializations":380},"game-dev","Oyun Geliştirme","Game Development",11,[381],{"key":218,"name":219,"field":376},{"key":383,"name_tr":384,"name_en":384,"sort":385,"specializations":386},"ml-engineer","ML Engineer",12,[387],{"key":218,"name":219,"field":383},[14,15,16],{"junior":390,"mid":392,"senior":393},{"questions":391,"median_sec":3},20,{"questions":391,"median_sec":3},{"questions":391,"median_sec":3},[10,395],"en",[397,398],"google","github",21750,true]