{"id":42663,"date":"2026-06-18T21:10:14","date_gmt":"2026-06-18T18:10:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/"},"modified":"2026-06-18T21:10:35","modified_gmt":"2026-06-18T18:10:35","slug":"pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/","title":{"rendered":"Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek"},"content":{"rendered":"<h2>Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek<\/h2>\n<p>Web uygulamalar\u0131ndan mobil uygulamalara, masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131ndan API&#8217;lere kadar, neredeyse her yaz\u0131l\u0131m sisteminin kullan\u0131c\u0131dan girdi almas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r. Ancak bu girdilere k\u00f6r\u00fc k\u00f6r\u00fcne g\u00fcvenmek, uygulaman\u0131z i\u00e7in felaketle sonu\u00e7lanabilecek g\u00fcvenlik a\u00e7\u0131klar\u0131, veri bozulmalar\u0131 ve k\u00f6t\u00fc kullan\u0131c\u0131 deneyimleri yaratabilir. Peki, Python ile sa\u011flam ve g\u00fcvenilir bir &#8220;do\u011frulama kap\u0131s\u0131&#8221; in\u015fa ederek bu riskleri nas\u0131l bertaraf edebiliriz?<\/p>\n<h2>Neden Kullan\u0131c\u0131 Giri\u015fini Asla Do\u011frudan Kabul Etmemelisiniz?<\/h2>\n<p>Kullan\u0131c\u0131 girdisi, bir yaz\u0131l\u0131m sistemine d\u0131\u015far\u0131dan gelen her t\u00fcrl\u00fc veridir. Bu, bir web formundaki metin kutusu, bir API \u00e7a\u011fr\u0131s\u0131ndaki JSON y\u00fck\u00fc, hatta bir dosya y\u00fcklemesi bile olabilir. Bu girdilerin her biri, potansiyel bir tehdit veya sorun kayna\u011f\u0131d\u0131r. Uygulaman\u0131z\u0131n g\u00fcvenlik duvar\u0131, kullan\u0131c\u0131dan gelen verilere kar\u015f\u0131 her zaman tetikte olmal\u0131d\u0131r. Bu, sadece k\u00f6t\u00fc niyetli sald\u0131rganlar\u0131 engellemekle kalmaz, ayn\u0131 zamanda yanl\u0131\u015fl\u0131kla girilen hatal\u0131 verilerin sisteminize zarar vermesini de \u00f6nler.<\/p>\n<p>G\u00fcvenilmeyen kullan\u0131c\u0131 girdisi, bir dizi ciddi probleme yol a\u00e7abilir. En bilinen risklerden biri, <strong>SQL Enjeksiyonu (SQL Injection)<\/strong>&#8216;dur. Sald\u0131rganlar, veritaban\u0131 sorgular\u0131n\u0131za k\u00f6t\u00fc ama\u00e7l\u0131 kod par\u00e7ac\u0131klar\u0131 ekleyerek hassas verilere eri\u015febilir, de\u011fi\u015ftirebilir veya silebilirler. \u00d6rne\u011fin, bir giri\u015f formuna kullan\u0131c\u0131 ad\u0131 yerine <code>' OR '1'='1<\/code> gibi bir ifade girerek, \u015fifre kontrol\u00fcn\u00fc atlay\u0131p sisteme izinsiz giri\u015f yapabilirler. Benzer \u015fekilde, <strong>Siteler Aras\u0131 Komut Dosyas\u0131 \u00c7al\u0131\u015ft\u0131rma (Cross-Site Scripting &#8211; XSS)<\/strong> sald\u0131r\u0131lar\u0131, sald\u0131rganlar\u0131n kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131lar\u0131nda k\u00f6t\u00fc ama\u00e7l\u0131 JavaScript kodlar\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r. Bu, \u00e7erez h\u0131rs\u0131zl\u0131\u011f\u0131na, oturum ka\u00e7\u0131rmaya veya kullan\u0131c\u0131lar\u0131 k\u00f6t\u00fc ama\u00e7l\u0131 sitelere y\u00f6nlendirmeye neden olabilir. Bu t\u00fcr sald\u0131r\u0131lar, genellikle kullan\u0131c\u0131dan al\u0131nan ve yeterince temizlenmeden (sanitize edilmeden) veya do\u011frulanmadan (validate edilmeden) do\u011frudan HTML i\u00e7eri\u011fine yerle\u015ftirilen girdiler arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir.<\/p>\n<p>G\u00fcvenlik risklerinin yan\u0131 s\u0131ra, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc (data integrity) de b\u00fcy\u00fck bir endi\u015fe kayna\u011f\u0131d\u0131r. E\u011fer bir ya\u015f alan\u0131 i\u00e7in say\u0131sal bir de\u011fer beklerken metinsel bir girdi al\u0131rsan\u0131z, bu durum uygulaman\u0131zda \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131na (runtime errors) yol a\u00e7abilir. Veritaban\u0131n\u0131za yanl\u0131\u015f formatta veya ge\u00e7ersiz aral\u0131kta veriler kaydedilmesi, ileride raporlama, analiz veya di\u011fer i\u015f s\u00fcre\u00e7lerinde ciddi tutars\u0131zl\u0131klara neden olabilir. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcn fiyat\u0131na negatif bir de\u011fer girilmesi, envanter y\u00f6netimini veya finansal raporlar\u0131 tamamen bozabilir. Bu t\u00fcr durumlar, sadece teknik sorunlar yaratmakla kalmaz, ayn\u0131 zamanda i\u015f s\u00fcre\u00e7lerinizi aksatarak maddi kay\u0131plara ve m\u00fc\u015fteri memnuniyetsizli\u011fine yol a\u00e7abilir. Bu nedenle, kullan\u0131c\u0131 girdisini sadece g\u00fcvenlik a\u00e7\u0131s\u0131ndan de\u011fil, ayn\u0131 zamanda sistemin genel sa\u011fl\u0131\u011f\u0131 ve veri kalitesi a\u00e7\u0131s\u0131ndan da titizlikle do\u011frulamak hayati \u00f6neme sahiptir.<\/p>\n<h2>Veri Do\u011frulama (Data Validation) Nedir ve Neden Hayati \u00d6nem Ta\u015f\u0131r?<\/h2>\n<p>Veri do\u011frulama, bir yaz\u0131l\u0131m sistemine giren verilerin belirli kurallara, standartlara veya k\u0131s\u0131tlamalara uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol etme s\u00fcrecidir. Basit\u00e7e ifade etmek gerekirse, sisteminize giren her bir veri par\u00e7as\u0131n\u0131n &#8220;ge\u00e7erli&#8221; olup olmad\u0131\u011f\u0131n\u0131 anlamakt\u0131r. Bu &#8220;ge\u00e7erlilik&#8221;, verinin t\u00fcr\u00fcnden (say\u0131, metin, tarih vb.) de\u011fer aral\u0131\u011f\u0131na, format\u0131ndan (e-posta adresi, telefon numaras\u0131) i\u015f mant\u0131\u011f\u0131na (bir \u00fcr\u00fcn\u00fcn fiyat\u0131 negatif olamaz) kadar geni\u015f bir yelpazeyi kapsayabilir. Do\u011frulama, uygulaman\u0131z\u0131n kalitesi, g\u00fcvenli\u011fi ve kararl\u0131l\u0131\u011f\u0131 i\u00e7in birincil savunma hatt\u0131d\u0131r.<\/p>\n<p>Do\u011frulama, sadece k\u00f6t\u00fc niyetli sald\u0131r\u0131lar\u0131 engellemekle kalmaz, ayn\u0131 zamanda istem d\u0131\u015f\u0131 hatalar\u0131 da yakalar. Bir kullan\u0131c\u0131 yanl\u0131\u015fl\u0131kla bir metin alan\u0131na say\u0131sal bir de\u011fer girmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131nda veya bir tarih alan\u0131na ge\u00e7ersiz bir tarih format\u0131 girdi\u011finde, do\u011frulama mekanizmas\u0131 devreye girerek bu hatay\u0131 tespit eder ve kullan\u0131c\u0131ya anlaml\u0131 bir geri bildirim sunar. Bu, hem uygulaman\u0131n \u00e7\u00f6kmesini engeller hem de kullan\u0131c\u0131 deneyimini iyile\u015ftirir. Kullan\u0131c\u0131lar, hatalar\u0131n\u0131 an\u0131nda g\u00f6r\u00fcp d\u00fczeltebildiklerinde, uygulamay\u0131 daha verimli ve sorunsuz bir \u015fekilde kullanabilirler.<\/p>\n<p>Veri do\u011frulaman\u0131n temel faydalar\u0131n\u0131 \u015fu \u015fekilde \u00f6zetleyebiliriz:<\/p>\n<ul>\n<li><strong>G\u00fcvenlik:<\/strong> SQL Enjeksiyonu, XSS gibi sald\u0131r\u0131lar\u0131 \u00f6nleyerek uygulaman\u0131z\u0131 ve verilerinizi korur.<\/li>\n<li><strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> Veritaban\u0131n\u0131za yaln\u0131zca do\u011fru ve tutarl\u0131 verilerin kaydedilmesini sa\u011flar, bu da raporlama ve analiz s\u00fcre\u00e7lerinin g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/li>\n<li><strong>Uygulama Kararl\u0131l\u0131\u011f\u0131:<\/strong> Ge\u00e7ersiz girdilerden kaynaklanan \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 ve \u00e7\u00f6kmeleri minimize eder.<\/li>\n<li><strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Kullan\u0131c\u0131lara hatalar\u0131 hakk\u0131nda an\u0131nda geri bildirim sa\u011flayarak, veri giri\u015fini kolayla\u015ft\u0131r\u0131r ve hayal k\u0131r\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>\u0130\u015f Mant\u0131\u011f\u0131 Uyumlulu\u011fu:<\/strong> \u0130\u015f kurallar\u0131n\u0131z\u0131n (\u00f6rne\u011fin, &#8220;ya\u015f 18&#8217;den k\u00fc\u00e7\u00fck olamaz&#8221; veya &#8220;sipari\u015f miktar\u0131 0&#8217;dan b\u00fcy\u00fck olmal\u0131&#8221;) sistem taraf\u0131ndan do\u011fru bir \u015fekilde uygulanmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Bir &#8220;do\u011frulama kap\u0131s\u0131&#8221; in\u015fa etmek, uygulaman\u0131z\u0131n her giri\u015f noktas\u0131nda bu kontrolleri sistematik bir \u015fekilde uygulaman\u0131z anlam\u0131na gelir. Bu kap\u0131, gelen t\u00fcm verileri titizlikle inceler, ge\u00e7erli olanlar\u0131 i\u00e7eri al\u0131r ve ge\u00e7ersiz olanlar\u0131 reddederek uygun hata mesajlar\u0131 ile geri \u00e7evirir. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n temelinden itibaren sa\u011flam ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Python&#8217;da Temel Do\u011frulama Teknikleri: Basit Giri\u015fleri Nas\u0131l G\u00fcvenli Hale Getiririz?<\/h2>\n<p>Python, kullan\u0131c\u0131 girdilerini do\u011frulamak i\u00e7in \u00e7e\u015fitli yerle\u015fik (built-in) fonksiyonlar ve y\u00f6ntemler sunar. Bu temel teknikler, karma\u015f\u0131k do\u011frulama k\u00fct\u00fcphanelerine ge\u00e7meden \u00f6nce uygulayabilece\u011finiz ilk savunma hatt\u0131n\u0131 olu\u015fturur. Basit kontrollerle ba\u015flayarak, uygulaman\u0131z\u0131n g\u00fcvenlik seviyesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz.<\/p>\n<p><strong>1. T\u00fcr Kontrol\u00fc (Type Checking):<\/strong> Python&#8217;da bir de\u011fi\u015fkenin beklenen t\u00fcrde olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in <code>isinstance()<\/code> fonksiyonunu kullanabilirsiniz. Bu, \u00f6zellikle bir API&#8217;den veya bir formdan gelen verilerin do\u011fru veri tipinde oldu\u011fundan emin olmak i\u00e7in \u00f6nemlidir.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndef dogrula_yas(yas_girisi):\n    if not isinstance(yas_girisi, int):\n        raise TypeError(\"Ya\u015f de\u011feri bir tam say\u0131 olmal\u0131d\u0131r.\")\n    if yas_girisi < 0 or yas_girisi > 120:\n        raise ValueError(\"Ya\u015f 0 ile 120 aras\u0131nda olmal\u0131d\u0131r.\")\n    return yas_girisi\n\ntry:\n    gecerli_yas = dogrula_yas(30)\n    print(f\"Ge\u00e7erli ya\u015f: {gecerli_yas}\")\n    # gecersiz_yas = dogrula_yas(\"otuz\") # TypeError f\u0131rlat\u0131r\n    # gecersiz_yas_aralik = dogrula_yas(150) # ValueError f\u0131rlat\u0131r\nexcept (TypeError, ValueError) as e:\n    print(f\"Hata: {e}\")\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnekte, <code>dogrula_yas<\/code> fonksiyonu hem t\u00fcr kontrol\u00fc hem de de\u011fer aral\u0131\u011f\u0131 kontrol\u00fc yaparak ya\u015f girdisinin ge\u00e7erlili\u011fini denetler.<\/p>\n<p><strong>2. Metin \u0130\u015fleme ve Temizleme (String Manipulation and Sanitization):<\/strong> Kullan\u0131c\u0131dan gelen metin girdileri genellikle bo\u015fluklar, b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf tutars\u0131zl\u0131klar\u0131 veya \u00f6zel karakterler i\u00e7erebilir. Python&#8217;\u0131n string metotlar\u0131 bu t\u00fcr sorunlar\u0131 gidermek i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<ul>\n<li><code>strip()<\/code>: Bir metnin ba\u015f\u0131ndaki ve sonundaki bo\u015fluklar\u0131 kald\u0131r\u0131r.<\/li>\n<li><code>lower()<\/code> \/ <code>upper()<\/code>: Metni tamamen k\u00fc\u00e7\u00fck veya b\u00fcy\u00fck harfe d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, bu da kar\u015f\u0131la\u015ft\u0131rmalar\u0131 tutarl\u0131 hale getirir.<\/li>\n<li><code>isdigit()<\/code> \/ <code>isalpha()<\/code> \/ <code>isalnum()<\/code>: Bir metnin sadece rakamlardan, harflerden veya hem harf hem de rakamlardan olu\u015fup olu\u015fmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<\/ul>\n<div class=\"code-container\">\n<pre><code>\ndef dogrula_kullanici_adi(kullanici_adi_girisi):\n    kullanici_adi_temiz = kullanici_adi_girisi.strip().lower()\n    if not kullanici_adi_temiz.isalnum():\n        raise ValueError(\"Kullan\u0131c\u0131 ad\u0131 sadece harf ve rakam i\u00e7ermelidir.\")\n    if len(kullanici_adi_temiz) < 3 or len(kullanici_adi_temiz) > 20:\n        raise ValueError(\"Kullan\u0131c\u0131 ad\u0131 3 ile 20 karakter aras\u0131nda olmal\u0131d\u0131r.\")\n    return kullanici_adi_temiz\n\ntry:\n    gecerli_ad = dogrula_kullanici_adi(\"  Mehmet123  \")\n    print(f\"Ge\u00e7erli kullan\u0131c\u0131 ad\u0131: {gecerli_ad}\")\n    # gecersiz_ad_karakter = dogrula_kullanici_adi(\"Ali@\") # ValueError f\u0131rlat\u0131r\n    # gecersiz_ad_uzunluk = dogrula_kullanici_adi(\"a\") # ValueError f\u0131rlat\u0131r\nexcept ValueError as e:\n    print(f\"Hata: {e}\")\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnek, kullan\u0131c\u0131 ad\u0131n\u0131 temizler, sadece alfan\u00fcmerik karakterlerden olu\u015fup olu\u015fmad\u0131\u011f\u0131n\u0131 ve belirli bir uzunluk aral\u0131\u011f\u0131nda olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu t\u00fcr basit kontroller, bir\u00e7ok yayg\u0131n hatay\u0131 ve g\u00fcvenlik zafiyetini \u00f6nlemek i\u00e7in yeterli olabilir. Ancak daha karma\u015f\u0131k desenler ve formatlar i\u00e7in d\u00fczenli ifadelere (Regex) ihtiyac\u0131m\u0131z olacakt\u0131r.<\/p>\n<h3>Regex (D\u00fczenli \u0130fadeler) ile G\u00fc\u00e7l\u00fc Do\u011frulama: Karma\u015f\u0131k Desenleri Nas\u0131l Yakalar\u0131z?<\/h3>\n<p>Basit string metotlar\u0131 belirli durumlar i\u00e7in yeterli olsa da, e-posta adresleri, telefon numaralar\u0131, g\u00fc\u00e7l\u00fc \u015fifreler veya belirli bir formatta \u00fcr\u00fcn kodlar\u0131 gibi karma\u015f\u0131k desenlere sahip girdileri do\u011frulamak i\u00e7in D\u00fczenli \u0130fadeler (Regular Expressions &#8211; Regex) vazge\u00e7ilmez bir ara\u00e7t\u0131r. Python&#8217;\u0131n yerle\u015fik <code>re<\/code> mod\u00fcl\u00fc, regex kullan\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Regex, metin i\u00e7inde belirli arama desenlerini tan\u0131mlaman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc bir dildir. Bir desen tan\u0131mlad\u0131ktan sonra, bir metnin bu desene uyup uymad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz. \u0130\u015fte baz\u0131 yayg\u0131n kullan\u0131m senaryolar\u0131:<\/p>\n<ul>\n<li><strong>E-posta Adresi Do\u011frulama:<\/strong> E-posta adreslerinin belirli bir format\u0131 vard\u0131r (kullan\u0131c\u0131@alanad\u0131.uzant\u0131). Regex ile bu format\u0131 kolayca kontrol edebilirsiniz.<\/li>\n<li><strong>Telefon Numaras\u0131 Do\u011frulama:<\/strong> \u00dclke kodlar\u0131, alan kodlar\u0131 ve abone numaralar\u0131n\u0131 i\u00e7eren \u00e7e\u015fitli telefon numaras\u0131 formatlar\u0131n\u0131 do\u011frulayabilirsiniz.<\/li>\n<li><strong>G\u00fc\u00e7l\u00fc \u015eifre Politikalar\u0131:<\/strong> \u015eifrelerin en az bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve bir \u00f6zel karakter i\u00e7ermesi gibi karma\u015f\u0131k kurallar\u0131 Regex ile tan\u0131mlayabilirsiniz.<\/li>\n<li><strong>URL Do\u011frulama:<\/strong> Bir metnin ge\u00e7erli bir URL format\u0131nda olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.<\/li>\n<\/ul>\n<p>\u00d6rnek olarak, bir e-posta adresi do\u011frulama fonksiyonu olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport re\n\ndef dogrula_eposta(eposta_girisi):\n    # Basit bir e-posta regex deseni\n    # Daha kapsaml\u0131 desenler i\u00e7in internetten ara\u015ft\u0131rma yap\u0131labilir.\n    eposta_deseni = r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"\n    \n    if not re.match(eposta_deseni, eposta_girisi):\n        raise ValueError(\"Ge\u00e7ersiz e-posta adresi format\u0131.\")\n    return eposta_girisi\n\ntry:\n    gecerli_eposta = dogrula_eposta(\"ornek@domain.com\")\n    print(f\"Ge\u00e7erli e-posta: {gecerli_eposta}\")\n    \n    # gecersiz_eposta_1 = dogrula_eposta(\"ornekdomain.com\") # ValueError f\u0131rlat\u0131r\n    # gecersiz_eposta_2 = dogrula_eposta(\"ornek@domain\") # ValueError f\u0131rlat\u0131r\nexcept ValueError as e:\n    print(f\"Hata: {e}\")\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda <code>re.match()<\/code> fonksiyonu, metnin ba\u015flang\u0131c\u0131ndan itibaren desenle e\u015fle\u015fip e\u015fle\u015fmedi\u011fini kontrol eder. E\u011fer e\u015fle\u015fme yoksa, bir <code>ValueError<\/code> f\u0131rlat\u0131l\u0131r. Regex desenleri ilk bak\u0131\u015fta karma\u015f\u0131k g\u00f6r\u00fcnebilir, ancak pratikle ve \u00e7evrimi\u00e7i ara\u00e7larla (\u00f6rne\u011fin, regex101.com) kolayca \u00f6\u011frenilebilir ve test edilebilirler. \u00d6rne\u011fin, bir \u015fifrenin en az 8 karakter uzunlu\u011funda olmas\u0131n\u0131, bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve bir \u00f6zel karakter i\u00e7ermesini gerektiren daha karma\u015f\u0131k bir senaryo i\u00e7in \u015f\u00f6yle bir desen kullan\u0131labilir: <code>\"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$\"<\/code>. Bu t\u00fcr desenler, g\u00fcvenlik politikalar\u0131n\u0131z\u0131 kullan\u0131c\u0131 girdilerine yans\u0131tman\u0131n etkili bir yoludur.<\/p>\n<h2>Harici K\u00fct\u00fcphanelerle Do\u011frulama: Daha G\u00fc\u00e7l\u00fc ve Esnek \u00c7\u00f6z\u00fcmler M\u00fcmk\u00fcn m\u00fc?<\/h2>\n<p>Python&#8217;\u0131n yerle\u015fik \u00f6zellikleri ve Regex, bir\u00e7ok do\u011frulama ihtiyac\u0131n\u0131 kar\u015f\u0131layabilirken, daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda, \u00f6zellikle yap\u0131land\u0131r\u0131lm\u0131\u015f verilerle (JSON, form verileri) \u00e7al\u0131\u015f\u0131rken, harici do\u011frulama k\u00fct\u00fcphaneleri i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirebilir ve daha g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunabilir. Bu k\u00fct\u00fcphaneler, genellikle veri \u015femalar\u0131n\u0131 tan\u0131mlaman\u0131za, otomatik hata mesajlar\u0131 \u00fcretmenize ve karma\u015f\u0131k i\u00e7 i\u00e7e ge\u00e7mi\u015f veri yap\u0131lar\u0131n\u0131 kolayca do\u011frulaman\u0131za olanak tan\u0131r.<\/p>\n<p>Piyasada bir\u00e7ok pop\u00fcler Python do\u011frulama k\u00fct\u00fcphanesi bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>Pydantic:<\/strong> Veri do\u011frulama ve ayarlar y\u00f6netimi i\u00e7in modern, Python type hints (t\u00fcr ipu\u00e7lar\u0131) tabanl\u0131 bir k\u00fct\u00fcphanedir. H\u0131zl\u0131, esnek ve kullan\u0131m\u0131 kolayd\u0131r. \u00d6zellikle FastAPI gibi modern web framework&#8217;lerinde yayg\u0131n olarak kullan\u0131l\u0131r.<\/li>\n<li><strong>Marshmallow:<\/strong> Nesneleri seri hale getirmek (serialize) ve seri hale getirilmi\u015f verileri geri d\u00f6n\u00fc\u015ft\u00fcrmek (deserialize) i\u00e7in kullan\u0131lan bir k\u00fct\u00fcphanedir. Do\u011frulama, bu s\u00fcrecin bir par\u00e7as\u0131 olarak do\u011fal bir \u015fekilde entegre edilmi\u015ftir.<\/li>\n<li><strong>Cerberus:<\/strong> Esnek ve hafif bir do\u011frulama k\u00fct\u00fcphanesidir. Do\u011frulama kurallar\u0131n\u0131 bir Python s\u00f6zl\u00fc\u011f\u00fc (dictionary) olarak tan\u0131mlaman\u0131za izin verir.<\/li>\n<\/ul>\n<p>Bu k\u00fct\u00fcphaneler aras\u0131nda \u00f6zellikle <strong>Pydantic<\/strong>, Python geli\u015ftiricileri aras\u0131nda pop\u00fclerli\u011fi h\u0131zla artan bir se\u00e7enektir. T\u00fcr ipu\u00e7lar\u0131n\u0131 kullanarak veri modellerinizi tan\u0131mlaman\u0131za ve bu modellerin otomatik olarak do\u011frulanmas\u0131n\u0131 sa\u011flaman\u0131za olanak tan\u0131r. Hatal\u0131 veri geldi\u011finde, Pydantic detayl\u0131 hata mesajlar\u0131 ile birlikte bir <code>ValidationError<\/code> f\u0131rlat\u0131r.<\/p>\n<p>\u015eimdi Pydantic kullanarak bir kullan\u0131c\u0131 kay\u0131t formunu (ad, e-posta, ya\u015f, \u015fifre) nas\u0131l do\u011frulayaca\u011f\u0131m\u0131za dair bir \u00f6rnek inceleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom pydantic import BaseModel, Field, EmailStr, ValidationError\nfrom typing import Optional\n\n# Pydantic'i y\u00fcklemek i\u00e7in: pip install pydantic\n\nclass KullaniciKayitFormu(BaseModel):\n    ad: str = Field(min_length=2, max_length=50, description=\"Kullan\u0131c\u0131n\u0131n ad\u0131\")\n    soyad: str = Field(min_length=2, max_length=50, description=\"Kullan\u0131c\u0131n\u0131n soyad\u0131\")\n    eposta: EmailStr = Field(description=\"Kullan\u0131c\u0131n\u0131n ge\u00e7erli e-posta adresi\")\n    yas: int = Field(ge=18, le=120, description=\"Kullan\u0131c\u0131n\u0131n ya\u015f\u0131, 18 ile 120 aras\u0131nda olmal\u0131\")\n    sifre: str = Field(min_length=8, description=\"En az 8 karakterli g\u00fcvenli bir \u015fifre\")\n    telefon: Optional[str] = Field(default=None, regex=r\"^\\+?\\d{10,15}$\", description=\"Telefon numaras\u0131 (iste\u011fe ba\u011fl\u0131)\")\n\n# \u00d6rnek kullan\u0131m\nveri = {\n    \"ad\": \"Ay\u015fe\",\n    \"soyad\": \"Y\u0131lmaz\",\n    \"eposta\": \"ayse.yilmaz@ornek.com\",\n    \"yas\": 25,\n    \"sifre\": \"GucluSifre123!\",\n    \"telefon\": \"+905321234567\"\n}\n\ntry:\n    kullanici = KullaniciKayitFormu(**veri)\n    print(\"Kullan\u0131c\u0131 verileri ba\u015far\u0131yla do\u011fruland\u0131:\")\n    print(kullanici.model_dump_json(indent=2)) # Pydantic v2'de to_json yerine model_dump_json kullan\u0131l\u0131r\nexcept ValidationError as e:\n    print(\"Do\u011frulama hatas\u0131:\")\n    print(e.json(indent=2)) # Pydantic v2'de .json() metodu kullan\u0131l\u0131r\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>KullaniciKayitFormu<\/code> ad\u0131nda bir Pydantic modeli tan\u0131mlad\u0131k. Her alan i\u00e7in veri tipi (<code>str<\/code>, <code>int<\/code>, <code>EmailStr<\/code>), minimum\/maksimum uzunluk (<code>min_length<\/code>, <code>max_length<\/code>), de\u011fer aral\u0131\u011f\u0131 (<code>ge<\/code> &#8211; greater than or equal, <code>le<\/code> &#8211; less than or equal) ve hatta Regex desenleri (<code>regex<\/code>) gibi do\u011frulama kurallar\u0131n\u0131 belirledik. <code>EmailStr<\/code> gibi \u00f6zel Pydantic tipleri, e-posta format\u0131n\u0131 otomatik olarak do\u011frular. Veri, bu modele uygun de\u011filse, Pydantic detayl\u0131 bir <code>ValidationError<\/code> f\u0131rlat\u0131r. Bu, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k veri yap\u0131lar\u0131yla \u00e7al\u0131\u015f\u0131rken hem kod tekrar\u0131n\u0131 azalt\u0131r hem de do\u011frulama mant\u0131\u011f\u0131n\u0131 merkezi bir yerde tutarak y\u00f6netimi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve Vaka Analizi: Bir Web Uygulamas\u0131nda Do\u011frulama Kap\u0131s\u0131 Nas\u0131l Kurulur?<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendi\u011fimiz do\u011frulama tekniklerini ger\u00e7ek bir web uygulamas\u0131 senaryosunda nas\u0131l bir araya getirece\u011fimizi inceleyelim. Diyelim ki bir e-ticaret platformunda yeni bir \u00fcr\u00fcn ekleme i\u015flevselli\u011fi geli\u015ftiriyorsunuz. \u00dcr\u00fcn bilgileri (ad, a\u00e7\u0131klama, fiyat, stok adedi, kategori) kullan\u0131c\u0131dan bir form arac\u0131l\u0131\u011f\u0131yla al\u0131nacak. Bu verilerin g\u00fcvenli ve do\u011fru bir \u015fekilde i\u015flenmesi kritik \u00f6neme sahiptir.<\/p>\n<p>Bu senaryoda bir &#8220;do\u011frulama kap\u0131s\u0131&#8221; in\u015fa etmek i\u00e7in Pydantic gibi bir k\u00fct\u00fcphane kullanmak, hem kodun okunabilirli\u011fini art\u0131racak hem de do\u011frulama s\u00fcrecini standartla\u015ft\u0131racakt\u0131r. Ayr\u0131ca, olas\u0131 hatalar\u0131 y\u00f6netmek i\u00e7in \u00f6zel bir hata i\u015fleme mekanizmas\u0131 da ekleyece\u011fiz.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom pydantic import BaseModel, Field, ValidationError\nfrom typing import Optional\n\n# Pydantic modeli ile \u00fcr\u00fcn veri \u015femas\u0131n\u0131 tan\u0131mlayal\u0131m\nclass UrunEklemeFormu(BaseModel):\n    urun_adi: str = Field(min_length=3, max_length=100, description=\"\u00dcr\u00fcn\u00fcn ad\u0131\")\n    aciklama: Optional[str] = Field(default=None, max_length=500, description=\"\u00dcr\u00fcn\u00fcn detayl\u0131 a\u00e7\u0131klamas\u0131\")\n    fiyat: float = Field(gt=0, description=\"\u00dcr\u00fcn\u00fcn fiyat\u0131, s\u0131f\u0131rdan b\u00fcy\u00fck olmal\u0131\")\n    stok_adedi: int = Field(ge=0, description=\"\u00dcr\u00fcn\u00fcn stok adedi, s\u0131f\u0131r veya daha b\u00fcy\u00fck olmal\u0131\")\n    kategori: str = Field(min_length=2, max_length=50, description=\"\u00dcr\u00fcn\u00fcn kategorisi\")\n    barkod: Optional[str] = Field(default=None, regex=r\"^\\d{12,13}$\", description=\"\u00dcr\u00fcn\u00fcn 12 veya 13 haneli barkodu\")\n\n# Bir web uygulamas\u0131ndan (\u00f6rne\u011fin Flask veya Django'dan) geldi\u011fini varsayd\u0131\u011f\u0131m\u0131z giri\u015f verisi\ndef urun_ekle(urun_verisi: dict):\n    try:\n        # Pydantic modeli ile veriyi do\u011frula ve parse et\n        gecerli_urun = UrunEklemeFormu(**urun_verisi)\n        \n        # Do\u011frulama ba\u015far\u0131l\u0131 ise, veritaban\u0131na kaydetme veya ba\u015fka i\u015flemler yap\n        print(f\"\u00dcr\u00fcn '{gecerli_urun.urun_adi}' ba\u015far\u0131yla do\u011fruland\u0131 ve i\u015fleniyor.\")\n        # Burada veritaban\u0131na kaydetme, stok g\u00fcncelleme vb. i\u015flemler yap\u0131labilir.\n        return {\"mesaj\": \"\u00dcr\u00fcn ba\u015far\u0131yla eklendi\", \"urun\": gecerli_urun.model_dump()}\n    except ValidationError as e:\n        # Do\u011frulama hatas\u0131 durumunda, detayl\u0131 hata mesajlar\u0131n\u0131 d\u00f6nd\u00fcr\n        print(\"\u00dcr\u00fcn ekleme do\u011frulama hatas\u0131:\")\n        return {\"hata\": \"Do\u011frulama ba\u015far\u0131s\u0131z\", \"detaylar\": e.errors()}\n    except Exception as e:\n        # Di\u011fer beklenmedik hatalar\n        print(f\"Beklenmedik bir hata olu\u015ftu: {e}\")\n        return {\"hata\": \"Sunucu hatas\u0131\", \"detaylar\": str(e)}\n\n# \u00d6rnek kullan\u0131m senaryolar\u0131\nprint(\"--- Ge\u00e7erli \u00dcr\u00fcn Ekleme ---\")\ngecerli_veri = {\n    \"urun_adi\": \"Ak\u0131ll\u0131 Telefon X\",\n    \"aciklama\": \"Son teknoloji \u00f6zelliklere sahip ak\u0131ll\u0131 telefon.\",\n    \"fiyat\": 999.99,\n    \"stok_adedi\": 150,\n    \"kategori\": \"Elektronik\",\n    \"barkod\": \"1234567890123\"\n}\nsonuc = urun_ekle(gecerli_veri)\nprint(sonuc)\n\nprint(\"\\n--- Ge\u00e7ersiz Fiyat ile \u00dcr\u00fcn Ekleme ---\")\ngecersiz_fiyat_veri = {\n    \"urun_adi\": \"Ak\u0131ll\u0131 Telefon Y\",\n    \"aciklama\": \"Yeni model ak\u0131ll\u0131 telefon.\",\n    \"fiyat\": -100.00, # Ge\u00e7ersiz fiyat\n    \"stok_adedi\": 50,\n    \"kategori\": \"Elektronik\"\n}\nsonuc_fiyat_hatasi = urun_ekle(gecersiz_fiyat_veri)\nprint(sonuc_fiyat_hatasi)\n\nprint(\"\\n--- Eksik Alan ile \u00dcr\u00fcn Ekleme ---\")\neksik_alan_veri = {\n    \"urun_adi\": \"Ak\u0131ll\u0131 Saat Z\",\n    \"fiyat\": 299.99,\n    # \"stok_adedi\" eksik\n    \"kategori\": \"Giyilebilir Teknoloji\"\n}\nsonuc_eksik_alan_hatasi = urun_ekle(eksik_alan_veri)\nprint(sonuc_eksik_alan_hatasi)\n\nprint(\"\\n--- Ge\u00e7ersiz Barkod ile \u00dcr\u00fcn Ekleme ---\")\ngecersiz_barkod_veri = {\n    \"urun_adi\": \"Bluetooth Kulakl\u0131k\",\n    \"fiyat\": 149.99,\n    \"stok_adedi\": 200,\n    \"kategori\": \"Aksesuar\",\n    \"barkod\": \"ABC123456789\" # Ge\u00e7ersiz barkod format\u0131\n}\nsonuc_barkod_hatasi = urun_ekle(gecersiz_barkod_veri)\nprint(sonuc_barkod_hatasi)\n  <\/code><\/pre>\n<\/div>\n<p>Bu vaka analizinde, <code>UrunEklemeFormu<\/code> Pydantic modeli, gelen JSON veya form verilerini otomatik olarak do\u011frular. Fiyat\u0131n s\u0131f\u0131rdan b\u00fcy\u00fck olmas\u0131, stok adedinin s\u0131f\u0131r veya daha fazla olmas\u0131, \u00fcr\u00fcn ad\u0131n\u0131n belirli bir uzunlukta olmas\u0131 gibi i\u015f kurallar\u0131 burada tan\u0131mlan\u0131r. E\u011fer gelen veri bu kurallara uymazsa, Pydantic bir <code>ValidationError<\/code> f\u0131rlat\u0131r ve biz de bu hatay\u0131 yakalayarak kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r bir hata mesaj\u0131 d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu yakla\u015f\u0131m, hem uygulaman\u0131n g\u00fcvenli\u011fini art\u0131r\u0131r hem de veri kalitesini garanti alt\u0131na al\u0131r. Her bir giri\u015f noktas\u0131nda bu t\u00fcr bir do\u011frulama kap\u0131s\u0131 kurmak, uygulaman\u0131z\u0131 d\u0131\u015f tehditlere ve hatal\u0131 verilere kar\u015f\u0131 \u00e7ok daha diren\u00e7li hale getirecektir.<\/p>\n<h2>\u0130leri D\u00fczey Do\u011frulama Stratejileri ve \u0130pu\u00e7lar\u0131: G\u00fcvenlik ve Performans \u0130\u00e7in Ne Yapmal\u0131y\u0131z?<\/h2>\n<p>Temel do\u011frulama teknikleri ve k\u00fct\u00fcphanelerle sa\u011flam bir zemin olu\u015fturduktan sonra, uygulaman\u0131z\u0131n do\u011frulama kap\u0131s\u0131n\u0131 daha da g\u00fc\u00e7lendirmek i\u00e7in ileri d\u00fczey stratejilere ve \u00f6nemli ipu\u00e7lar\u0131na g\u00f6z atabiliriz. Bu yakla\u015f\u0131mlar, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve kritik uygulamalarda g\u00fcvenlik, performans ve s\u00fcrd\u00fcr\u00fclebilirlik a\u00e7\u0131s\u0131ndan fark yarat\u0131r.<\/p>\n<p><strong>1. \u00d6zel Do\u011frulay\u0131c\u0131lar (Custom Validators) ve \u0130\u015f Mant\u0131\u011f\u0131:<\/strong> Bazen standart k\u00fct\u00fcphane veya Regex kurallar\u0131, uygulaman\u0131z\u0131n benzersiz i\u015f mant\u0131\u011f\u0131n\u0131 kar\u015f\u0131lamayabilir. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn indirimli fiyat\u0131n\u0131n her zaman orijinal fiyattan d\u00fc\u015f\u00fck olmas\u0131 gerekti\u011fini veya bir kullan\u0131c\u0131n\u0131n sadece belirli bir ya\u015f aral\u0131\u011f\u0131ndaki \u00fcr\u00fcnleri sat\u0131n alabilece\u011fini do\u011frulamak isteyebilirsiniz. Pydantic gibi k\u00fct\u00fcphaneler, modellere \u00f6zel do\u011frulay\u0131c\u0131 metotlar eklemenize olanak tan\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom pydantic import BaseModel, ValidationError, Field, validator\n\nclass IndirimliUrun(BaseModel):\n    urun_adi: str\n    normal_fiyat: float = Field(gt=0)\n    indirimli_fiyat: float = Field(gt=0)\n\n    @validator('indirimli_fiyat')\n    def indirimli_fiyat_normal_fiyattan_dusuk_olmali(cls, v, values):\n        if 'normal_fiyat' in values and v >= values['normal_fiyat']:\n            raise ValueError('\u0130ndirimli fiyat normal fiyattan d\u00fc\u015f\u00fck olmal\u0131d\u0131r.')\n        return v\n\ntry:\n    # Gecerli durum\n    urun1 = IndirimliUrun(urun_adi=\"Laptop\", normal_fiyat=1000.0, indirimli_fiyat=800.0)\n    print(f\"Ge\u00e7erli \u00fcr\u00fcn: {urun1}\")\n    \n    # Ge\u00e7ersiz durum\n    # urun2 = IndirimliUrun(urun_adi=\"Klavye\", normal_fiyat=200.0, indirimli_fiyat=250.0) # ValueError f\u0131rlat\u0131r\nexcept ValidationError as e:\n    print(f\"Hata: {e}\")\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>@validator<\/code> dekorat\u00f6r\u00fc ile <code>indirimli_fiyat<\/code> alan\u0131na \u00f6zel bir do\u011frulama kural\u0131 ekledik. Bu, daha karma\u015f\u0131k i\u015f kurallar\u0131n\u0131 do\u011frudan veri modelinize entegre etmenizi sa\u011flar.<\/p>\n<p><strong>2. Sunucu Tarafl\u0131 (Server-Side) ve \u0130stemci Tarafl\u0131 (Client-Side) Do\u011frulama Ayr\u0131m\u0131:<\/strong> Web uygulamalar\u0131nda genellikle hem istemci taraf\u0131nda (taray\u0131c\u0131da JavaScript ile) hem de sunucu taraf\u0131nda (Python ile) do\u011frulama yap\u0131l\u0131r. \u0130stemci tarafl\u0131 do\u011frulama, kullan\u0131c\u0131ya an\u0131nda geri bildirim sa\u011flayarak kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve sunucu y\u00fck\u00fcn\u00fc azalt\u0131r. Ancak, g\u00fcvenlik a\u00e7\u0131s\u0131ndan <strong>asla sadece istemci tarafl\u0131 do\u011frulamaya g\u00fcvenmemelisiniz.<\/strong> \u0130stemci tarafl\u0131 do\u011frulama kolayca atlat\u0131labilir. T\u00fcm kritik do\u011frulama mant\u0131\u011f\u0131 her zaman sunucu taraf\u0131nda uygulanmal\u0131d\u0131r.<\/p>\n<p><strong>3. Do\u011frulama ve Temizleme (Sanitization) Fark\u0131:<\/strong> Do\u011frulama, verinin ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol ederken, temizleme (sanitization) veriyi g\u00fcvenli ve kullan\u0131labilir hale getirmek i\u00e7in de\u011fi\u015ftirme i\u015flemidir. \u00d6rne\u011fin, HTML etiketlerini bir metinden kald\u0131rmak veya \u00f6zel karakterleri ka\u00e7\u0131\u015f dizilerine (escape sequences) d\u00f6n\u00fc\u015ft\u00fcrmek temizleme i\u015flemidir. G\u00fcvenlik a\u00e7\u0131s\u0131ndan, kullan\u0131c\u0131 girdisini veritaban\u0131na kaydetmeden veya bir web sayfas\u0131nda g\u00f6stermeden \u00f6nce hem do\u011frulamal\u0131 hem de uygun \u015fekilde temizlemelisiniz. \u00d6zellikle XSS sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in temizleme \u00e7ok \u00f6nemlidir. Python&#8217;da <code>bleach<\/code> veya <code>html.escape<\/code> gibi k\u00fct\u00fcphaneler\/fonksiyonlar temizleme i\u00e7in kullan\u0131labilir.<\/p>\n<p><strong>4. Uluslararas\u0131la\u015ft\u0131rma (Internationalization &#8211; i18n) ve Yerelle\u015ftirme (Localization &#8211; l10n) \u0130\u00e7in Do\u011frulama:<\/strong> Uygulaman\u0131z farkl\u0131 co\u011frafi b\u00f6lgelerden kullan\u0131c\u0131lar\u0131 hedefliyorsa, do\u011frulama kurallar\u0131n\u0131z\u0131n bu farkl\u0131l\u0131klar\u0131 dikkate almas\u0131 gerekir. Telefon numaras\u0131 formatlar\u0131, tarih formatlar\u0131, para birimi sembolleri ve hatta isimlerin karakter setleri \u00fclkeden \u00fclkeye de\u011fi\u015febilir. Bu durumlar i\u00e7in, do\u011frulama kurallar\u0131n\u0131z\u0131 esnek tutmal\u0131 ve gerekti\u011finde yerel standartlara uyarlayabilmelisiniz. \u00d6rne\u011fin, farkl\u0131 \u00fclke kodlar\u0131na sahip telefon numaralar\u0131n\u0131 do\u011frulamak i\u00e7in daha esnek Regex desenleri kullanmak veya farkl\u0131 tarih formatlar\u0131n\u0131 i\u015fleyebilen k\u00fct\u00fcphanelerden faydalanmak gerekebilir.<\/p>\n<p><strong>5. Performans Etkisi:<\/strong> B\u00fcy\u00fck veri k\u00fcmeleri \u00fczerinde yo\u011fun do\u011frulama i\u015flemleri yapmak, uygulaman\u0131z\u0131n performans\u0131n\u0131 etkileyebilir. \u00d6zellikle API&#8217;ler arac\u0131l\u0131\u011f\u0131yla b\u00fcy\u00fck JSON y\u00fcklerini i\u015flerken, do\u011frulama mant\u0131\u011f\u0131n\u0131z\u0131n verimli oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Pydantic gibi k\u00fct\u00fcphaneler C tabanl\u0131 Rust k\u00fct\u00fcphaneleri (\u00f6rne\u011fin <code>pydantic-core<\/code>) kullanarak y\u00fcksek performans sunar. Ancak, \u00f6zel do\u011frulay\u0131c\u0131lar yazarken veya \u00e7ok say\u0131da Regex deseni uygularken performans\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. Gereksiz veya a\u015f\u0131r\u0131 karma\u015f\u0131k do\u011frulama ad\u0131mlar\u0131ndan ka\u00e7\u0131nmak, performans\u0131 optimize etmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Bu ileri d\u00fczey stratejiler, do\u011frulama kap\u0131n\u0131z\u0131 sadece g\u00fcvenli de\u011fil, ayn\u0131 zamanda esnek, performansl\u0131 ve geni\u015fletilebilir hale getirerek, uygulaman\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131na katk\u0131da bulunur.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Kullan\u0131c\u0131 girdisine g\u00fcvenmek, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda yap\u0131lan en b\u00fcy\u00fck hatalardan biridir ve uygulaman\u0131z i\u00e7in ciddi g\u00fcvenlik, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc ve kararl\u0131l\u0131k sorunlar\u0131na yol a\u00e7abilir. Python ile bir &#8220;do\u011frulama kap\u0131s\u0131&#8221; in\u015fa etmek, bu risklere kar\u015f\u0131 en etkili savunma mekanizmalar\u0131ndan biridir. Basit t\u00fcr kontrollerinden Regex&#8217;in g\u00fcc\u00fcne, Pydantic gibi geli\u015fmi\u015f k\u00fct\u00fcphanelerin sundu\u011fu \u015fema tabanl\u0131 do\u011frulama \u00e7\u00f6z\u00fcmlerine kadar bir\u00e7ok ara\u00e7 ve teknikle, kullan\u0131c\u0131dan gelen verileri titizlikle inceleyebilir ve yaln\u0131zca ge\u00e7erli olanlar\u0131n sisteminize girmesine izin verebilirsiniz.<\/p>\n<p>Bu makalede, veri do\u011frulaman\u0131n neden hayati \u00f6nem ta\u015f\u0131d\u0131\u011f\u0131n\u0131, Python&#8217;da temel do\u011frulama tekniklerini, Regex ile karma\u015f\u0131k desenleri nas\u0131l yakalayaca\u011f\u0131m\u0131z\u0131, Pydantic gibi harici k\u00fct\u00fcphanelerle daha g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler geli\u015ftirmeyi ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu teknikleri nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frendik. Ayr\u0131ca, \u00f6zel do\u011frulay\u0131c\u0131lar, istemci\/sunucu taraf\u0131 do\u011frulama ayr\u0131m\u0131, temizleme kavram\u0131 ve performans ipu\u00e7lar\u0131 gibi ileri d\u00fczey stratejilere de de\u011findik. Unutmay\u0131n, g\u00fcvenli bir uygulama, her zaman g\u00fcvenli veri giri\u015finden ba\u015flar. Do\u011frulama kap\u0131n\u0131z\u0131 sa\u011flam in\u015fa ederek, uygulaman\u0131z\u0131n gelece\u011fini g\u00fcvence alt\u0131na al\u0131rs\u0131n\u0131z.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ul>\n<li>\n        <strong>S: Sadece istemci taraf\u0131nda (taray\u0131c\u0131da) do\u011frulama yapmak yeterli midir?<\/strong><\/p>\n<p>C: Hay\u0131r, kesinlikle yeterli de\u011fildir. \u0130stemci taraf\u0131 do\u011frulama, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve sunucu y\u00fck\u00fcn\u00fc azaltmak i\u00e7in faydal\u0131d\u0131r ancak g\u00fcvenlik a\u00e7\u0131s\u0131ndan kolayca atlat\u0131labilir. T\u00fcm kritik do\u011frulama mant\u0131\u011f\u0131 her zaman sunucu taraf\u0131nda uygulanmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>S: Do\u011frulama (Validation) ile Temizleme (Sanitization) aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p>C: Do\u011frulama, bir verinin belirli kurallara uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol etme i\u015flemidir (\u00f6rne\u011fin, bir say\u0131n\u0131n pozitif olmas\u0131). Temizleme ise, veriyi g\u00fcvenli ve kullan\u0131labilir hale getirmek i\u00e7in de\u011fi\u015ftirme i\u015flemidir (\u00f6rne\u011fin, bir metinden zararl\u0131 HTML etiketlerini kald\u0131rmak). G\u00fcvenlik i\u00e7in genellikle her ikisi de gereklidir.<\/p>\n<\/li>\n<li>\n        <strong>S: Python&#8217;da hangi do\u011frulama k\u00fct\u00fcphanesini kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>C: Projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ve karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Basit projeler i\u00e7in yerle\u015fik Python \u00f6zellikleri ve Regex yeterli olabilir. Daha b\u00fcy\u00fck ve yap\u0131land\u0131r\u0131lm\u0131\u015f veri modelleriyle \u00e7al\u0131\u015fan projeler i\u00e7in <code>Pydantic<\/code> (modern web uygulamalar\u0131 i\u00e7in pop\u00fcler), <code>Marshmallow<\/code> (serile\u015ftirme\/deserile\u015ftirme ile birlikte) veya <code>Cerberus<\/code> (hafif ve esnek) gibi k\u00fct\u00fcphaneler \u00f6nerilir.<\/p>\n<\/li>\n<li>\n        <strong>S: Kullan\u0131c\u0131 girdisini do\u011frulamay\u0131 unutursam ne olur?<\/strong><\/p>\n<p>C: Kullan\u0131c\u0131 girdisini do\u011frulamay\u0131 unutmak, uygulaman\u0131zda SQL Enjeksiyonu, XSS gibi g\u00fcvenlik a\u00e7\u0131klar\u0131, veri taban\u0131nda tutars\u0131z veya bozuk veriler, uygulaman\u0131n \u00e7\u00f6kmesine neden olan \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131 ve k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimi gibi ciddi sorunlara yol a\u00e7abilir.<\/p>\n<\/li>\n<\/ul>\n<p>#Python #WebGeli\u015ftirme #VeriG\u00fcvenli\u011fi #Do\u011frulama #SiberG\u00fcvenlik<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/python-user-input-validation-example\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/python-user-input-validation-example<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Web uygulamalar\u0131ndan mobil uygulamalara, masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131ndan API&#8217;lere kadar, neredeyse her yaz\u0131l\u0131m sisteminin kullan\u0131c\u0131dan girdi almas\u0131 ka\u00e7\u0131n\u0131lmazd\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":[1403],"tags":[],"class_list":{"0":"post-42663","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","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>Python&#039;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek - 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\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python&#039;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek\" \/>\n<meta property=\"og:description\" content=\"Web uygulamalar\u0131ndan mobil uygulamalara, masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131ndan API&#039;lere kadar, neredeyse her yaz\u0131l\u0131m sisteminin kullan\u0131c\u0131dan girdi almas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-18T18:10:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-18T18:10:35+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=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek\",\"datePublished\":\"2026-06-18T18:10:14+00:00\",\"dateModified\":\"2026-06-18T18:10:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\"},\"wordCount\":3438,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\",\"name\":\"Python'da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-18T18:10:14+00:00\",\"dateModified\":\"2026-06-18T18:10:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek\"}]},{\"@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":"Python'da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek - 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\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Python'da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek","og_description":"Web uygulamalar\u0131ndan mobil uygulamalara, masa\u00fcst\u00fc yaz\u0131l\u0131mlar\u0131ndan API'lere kadar, neredeyse her yaz\u0131l\u0131m sisteminin kullan\u0131c\u0131dan girdi almas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-18T18:10:14+00:00","article_modified_time":"2026-06-18T18:10:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek","datePublished":"2026-06-18T18:10:14+00:00","dateModified":"2026-06-18T18:10:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/"},"wordCount":3438,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/","name":"Python'da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-18T18:10:14+00:00","dateModified":"2026-06-18T18:10:35+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-kullanici-girisi-dogrulama-guvenli-bir-kapi-insa-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python&#8217;da Kullan\u0131c\u0131 Giri\u015fi Do\u011frulama: G\u00fcvenli Bir Kap\u0131 \u0130n\u015fa Etmek"}]},{"@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\/42663","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=42663"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42663\/revisions"}],"predecessor-version":[{"id":42664,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42663\/revisions\/42664"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}