﻿
{"id":15380,"date":"2020-04-23T12:54:20","date_gmt":"2020-04-23T12:54:20","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15380"},"modified":"2020-04-23T12:54:20","modified_gmt":"2020-04-23T12:54:20","slug":"asp-net-core-data-protection-ile-veri-koruma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-data-protection-ile-veri-koruma\/","title":{"rendered":"Asp.NET Core &#8211; Data Protection \u0130le Veri Koruma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bir uygulaman\u0131n hukuki boyutundan be\u015feri boyutuna kadar t\u00fcm detaylar\u0131n\u0131 ilgilendiren ve uygulaman\u0131n kalitesini ortaya koyarak, tercih edilebilirlik oran\u0131n\u0131 belirleyen en b\u00fcy\u00fck etkenlerden birinin veri g\u00fcvenli\u011fi oldu\u011funu d\u00fc\u015f\u00fcnebiliriz. G\u00fcnl\u00fck hayattan edindi\u011fimiz tecr\u00fcbelerde g\u00f6stermektedir ki, hayat\u0131m\u0131za pratik anlamda \u00e7ok fazla katk\u0131da bulunabilen onlarca basit ve etkili uygulamalar\u0131n aras\u0131nda verisel anlamda s\u0131z\u0131nt\u0131 \u015f\u00fcphesi bar\u0131nd\u0131ranlar, sahalar\u0131na uygun geli\u015fimlerini ve yeterlilik seviyelerini olabildi\u011fince olumsuz izlenime maruz b\u0131rakt\u0131klar\u0131ndan dolay\u0131 kullan\u0131c\u0131lar taraf\u0131ndan tercih edilmemektedirler ve \u00e7ok k\u0131sa zamanda maziye kar\u0131\u015fabilmektedirler. Dolay\u0131s\u0131yla bu derece hayati bir konu olan veri g\u00fcvenli\u011fi \u00fczerine Asp.NET Core uygulamalar\u0131 \u00e7er\u00e7evesinde isti\u015fare edecek ve operasyonel olarak pratikte nas\u0131l bir tutum sergilenmesi gerekti\u011fini konu\u015faca\u011f\u0131z.<\/p>\n<h4>Veri G\u00fcvenli\u011fi Nedir?<\/h4>\n<p>Veri g\u00fcvenli\u011fi b\u00fct\u00fcnsel a\u00e7\u0131dan de\u011ferlendirildi\u011finde, uygulamaya ve hatta uygulamay\u0131 kullanan kitlelere dair verilerin m\u00fcmk\u00fcn mertebe irademiz d\u0131\u015f\u0131nda d\u0131\u015f d\u00fcnyaya s\u0131zmas\u0131n\u0131\/s\u0131zd\u0131r\u0131lmas\u0131n\u0131 engellemek yahut olabildi\u011fince minimize edebilmek i\u00e7in me\u015fakkatli bir tefekk\u00fcr ve operasyon gerektiren bir s\u00fcrecin neticesidir diyebiliriz. <\/p>\n<h4>Veri G\u00fcvenli\u011fi Neden \u00d6nemsenmelidir?<\/h4>\n<p>\u00d6zellikle uygulamay\u0131 tercih eden kullan\u0131c\u0131lar taraf\u0131ndan kar\u015f\u0131l\u0131kl\u0131 g\u00fcven ili\u015fkisine dayanarak payla\u015f\u0131lan verilerle birlikte, uygulamaya dair kritik arz edebilecek verilerin d\u0131\u015f d\u00fcnya taraf\u0131ndan eri\u015filebilmesi b\u00fcy\u00fck zaafiyetler do\u011furabilece\u011fi gibi b\u00fcy\u00fck bir mahcubiyetinde tezah\u00fcr\u00fc olabilir. O y\u00fczden veri g\u00fcvenli\u011fi kesinlikle \u00f6telenmemeli ve \u00f6zellikle kitlelere hitap edecek bir uygulama projesinde prensip olarak s\u0131ralamada \u00f6ncelik olarak belirlenmelidir.<\/p>\n<h4>Veri Korumas\u0131(Data Protection) Nedir?<\/h4>\n<p>Uygulamaya dair veri g\u00fcvenli\u011finin sa\u011flanabilmesi i\u00e7in yap\u0131lmas\u0131 gereken aktivitelerden sadece bir tanesidir. Uygulama yahut uygulamay\u0131 kullanan kullan\u0131c\u0131lara dair kritik verilerin genellikle url \u00fczerinde ta\u015f\u0131nmas\u0131 durumunda gizlenmesi bir ba\u015fka deyi\u015fle \u015fifrelenmesidir. Bu duruma istinaden a\u015fa\u011f\u0131daki url \u00f6rneklerini inceleyebilirsiniz;<\/p>\n<p><span style=\"color:purple; font-size:10px;\">\/Details\/5<\/span><br \/>\n<span style=\"color:green; font-size:10px;\">\/Details\/CfDJ8NJCCNrydG5OoLjy-PIjlIX2rVMPEsXyZ9rvhQJdJDxXRr5zyt_hiDhRRlBmtLo1npprgm2CMnQRcBWylcVWq8fjvwyngsfad<br \/>\nx45l83ol1YsBBQyQ5IVuKrZxJadhKnsqw<\/span><\/p>\n<h4>Asp.NET Core Uygulamalar\u0131nda Veri Korumas\u0131<\/h4>\n<p>Asp.NET Core uygulamalar\u0131nda veri korumas\u0131 a\u00e7\u0131s\u0131ndan url \u00fczerinde ta\u015f\u0131nan veri g\u00fcvenli\u011fini sa\u011flayabilmek i\u00e7in dahili olarak gelen <span style=\"color:orange;\">DataProtection<\/span> servisiyle birlikte <span style=\"color:orange;\">IDataProtector<\/span> interface&#8217;inin kullanabiliriz.<\/p>\n<p>Bunun i\u00e7in \u00f6ncelikle uygulaman\u0131n &#8216;Startup.cs&#8217; dosyas\u0131ndaki &#8216;ConfigureServices&#8217; metodunda a\u015fa\u011f\u0131daki gibi &#8216;AddDataProtection&#8217; servisinin eklenmesi gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        .\r\n        .\r\n        .\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddDataProtection();\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan istenilen controller&#8217;da &#8216;IDataProtectionProvider&#8217; aray\u00fcz\u00fc ile &#8216;DataProtection&#8217; iste\u011finde bulunulabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        IDataProtector _dataProtector;\r\n        public EmployeeController(IDataProtectionProvider dataProtectionProvider)\r\n        {\r\n            _dataProtector = dataProtectionProvider.CreateProtector(&quot;protectorname1&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada &#8216;IDataProtectionProvider&#8217; aray\u00fcz\u00fcn\u00fcn &#8216;CreateProtector&#8217; metodu ile ismi parametrede belirtildi\u011fi gibi olan bir protector olu\u015fturulmaktad\u0131r. Bu protector ile url \u00fczerinde ta\u015f\u0131nacak olan veri \u015fifrelenecektir. Bu \u015fekilde in\u015fa edilmesinin sebebi, bir uygulamada birden fazla protector\u0131 birbirinden izole bir \u015fekilde olu\u015fturabilmek i\u00e7indir.<\/p>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131daki yap\u0131lanmay\u0131 incelerseniz e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        IDataProtector _dataProtector1;\r\n        IDataProtector _dataProtector2;\r\n        public EmployeeController(IDataProtectionProvider dataProtectionProvider)\r\n        {\r\n            _dataProtector1 = dataProtectionProvider.CreateProtector(&quot;protectorname1&quot;);\r\n            _dataProtector2 = dataProtectionProvider.CreateProtector(&quot;protectorname2&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>birbirinden izole edilmi\u015f &#8216;_dataProtector1&#8217; ve &#8216;_dataProtector2&#8217; isminde birinin \u015fifresini bir di\u011ferinin \u00e7\u00f6z\u00fcmleyemeyece\u011fi \u015fekilde iki protector olu\u015fturulmu\u015ftur. Bu yap\u0131lanman\u0131n esas amac\u0131, DataProtector ile \u015fifrelenen verilerin yine DataProtector kullanan ba\u015fka bir uygulama taraf\u0131ndan \u00e7\u00f6z\u00fcmlenmesini engellemek i\u00e7indir. Bundan dolay\u0131 burada yaz\u0131lan metinsel de\u011ferler uygulama i\u00e7in secret \u00f6zellik g\u00f6stermektedirler.<\/p>\n<p>Velhas\u0131l&#8230; \u015eimdi bu servisi nas\u0131l kullanaca\u011f\u0131m\u0131za odaklanal\u0131m.<\/p>\n<p>Genellikle url \u00fczerindeki veriler bir entity&#8217;nin id kolonundan gelen veriler olabilmektedirler. O y\u00fczden bizler \u00f6rneklendirme i\u00e7in veri koruma senaryosu olarak personellerin listesi \u00fczerinden konuyu seyredece\u011fiz. <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string Email { get; set; }\r\n\r\n        &#x5B;NotMapped]\r\n        public string EncryptedId { get; set; }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z bir personeli modelledi\u011fimiz &#8216;Employee&#8217; class&#8217;\u0131 olu\u015fturulmu\u015ftur. Yap\u0131sal olarak i\u00e7erisinde olguya dair memberlar tan\u0131mland\u0131\u011f\u0131 gibi ayriyetten &#8216;Id&#8217; kolonundaki verinin \u015fifrelenmi\u015f versiyonunu temsil edecek olan &#8216;EncryptedId&#8217; propertyside tan\u0131mlanm\u0131\u015ft\u0131r. \u015eimdi! burada \u00e7ok kritik arz edebilecek olan bir hususa dikkatinizi \u00e7ekmek istiyorum. Ger\u00e7ek hayatta \u00f6rnekteki &#8216;Employee&#8217; gibi entityler genellikle Entity Framework Core gibi ORM ara\u00e7lar\u0131yla kullan\u0131lan s\u0131n\u0131flar olaca\u011f\u0131ndan dolay\u0131 Database First y\u00f6ntemleri ile otomatik olu\u015fturulan s\u0131n\u0131flar olabilirler. Bu otomatik s\u00fcre\u00e7te entity s\u0131n\u0131flar yeniden olu\u015fturulaca\u011f\u0131ndan ve mevcut olanlar ezilece\u011finden dolay\u0131 sizlerin\/bizlerin yapm\u0131\u015f oldu\u011fu de\u011fi\u015fiklikler kal\u0131c\u0131 olarak silinecektirler. B\u00f6yle bir durumda hi\u00e7bir zaman entity classlarda ekstradan eklenecek olan elemanlar direkt ilgili s\u0131n\u0131fa fiziksel olarak eklenmezler.<br \/>\nSoru : <em><strong>Peki nereye ekleyece\u011fiz hocam?<\/strong><\/em><br \/>\nCevap : \u0130lgili s\u0131n\u0131f\u0131n partial class\u0131na&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public partial class Employee\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string Email { get; set; }\r\n    }\r\n    public partial class Employee\r\n    {\r\n        &#x5B;NotMapped]\r\n        public string EncryptedId { get; set; }\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte do\u011fru yakla\u015f\u0131m neticesinde do\u011fru bir tasar\u0131m&#8230; Bundan sonra yap\u0131lacak herhangi bir de\u011fi\u015fiklikte &#8216;Employee&#8217; s\u0131n\u0131f\u0131 yeniden olu\u015fturulabilir lakin partial&#8217;\u0131 ezilmeyece\u011fi ve korunaca\u011f\u0131 i\u00e7in her de\u011fi\u015fiklik neticesinde &#8216;EncryptedId&#8217; propertysi i\u00e7erisine dahil edilmi\u015f olacakt\u0131r.<\/p>\n<p>Ayr\u0131ca ilgili property&#8217;nin &#8216;NotMapped&#8217; attribute&#8217;u ile i\u015faretlenmesinin sebebi ORM ara\u00e7lar\u0131nda kar\u015f\u0131l\u0131\u011f\u0131 olmayan bir kolon oldu\u011funu bildirmek i\u00e7indir. Aksi taktirde hata ile kar\u015f\u0131la\u015fma olas\u0131l\u0131\u011f\u0131n\u0131z y\u00fcksek ihtimaldir.<\/p>\n<p>\u015eimdi ilgili s\u0131n\u0131f t\u00fcr\u00fcnden nesneler bar\u0131nd\u0131ran bir koleksiyonu view&#8217;e g\u00f6nderen a\u015fa\u011f\u0131daki action metodu inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        IDataProtector _dataProtector;\r\n        public EmployeeController(IDataProtectionProvider dataProtectionProvider)\r\n        {\r\n            _dataProtector = dataProtectionProvider.CreateProtector(&quot;protectorname1&quot;);\r\n        }\r\n\r\n        List&lt;Employee&gt; employees = new List&lt;Employee&gt;\r\n            {\r\n                new Employee{ Id = 1, Name = &quot;Hilmi&quot;, Email = &quot;hilmi@gmail.com&quot; },\r\n                new Employee{ Id = 2, Name = &quot;H\u00fcseyin&quot;, Email = &quot;huseyin@gmail.com&quot; },\r\n                new Employee{ Id = 3, Name = &quot;\u015e\u00fckr\u00fc&quot;, Email = &quot;sukru@gmail.com&quot; },\r\n                new Employee{ Id = 4, Name = &quot;\u015euayip&quot;, Email = &quot;suayip@gmail.com&quot; },\r\n                new Employee{ Id = 5, Name = &quot;R\u0131fk\u0131&quot;, Email = &quot;rifki@gmail.com&quot; },\r\n                new Employee{ Id = 6, Name = &quot;M\u00fclayim&quot;, Email = &quot;mulayim@gmail.com&quot; }\r\n            };\r\n\r\n        public IActionResult Index()\r\n        {\r\n            employees.ForEach(emp =&gt; emp.EncryptedId = _dataProtector.Protect(emp.Id.ToString()));\r\n\r\n            return View(employees);\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada &#8217;employees&#8217; koleksiyonunun veritaban\u0131ndan geldi\u011fini varsayabilirsiniz. As\u0131l dikkat etmeniz gereken nokta 21. sat\u0131rdaki i\u015flemdir. Burada t\u00fcm nesnelerin &#8216;Id&#8217; kolonlar\u0131 &#8216;DataProtector&#8217; nesnesinin &#8216;Protect&#8217; metoduyla \u015fifrelenerek \u00fcretilen de\u011fer &#8216;EncryptedId&#8217; kolonuna atanmaktad\u0131r.<\/p>\n<p>A\u015fa\u011f\u0131daki kod blo\u011funa bakarsan\u0131z e\u011fer employee&#8217;lar\u0131n detay linklerinde &#8216;Id&#8217; de\u011ferleri de\u011fil, \u015fifrelenmi\u015f &#8216;EncryptedId&#8217; de\u011ferleri listelenmektedir.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n@model IEnumerable&lt;Employee&gt;\r\n\r\n&lt;table class=&quot;table&quot;&gt;\r\n    &lt;thead&gt;\r\n        &lt;tr&gt;\r\n            &lt;th&gt;Name&lt;\/th&gt;\r\n            &lt;th&gt;Email&lt;\/th&gt;\r\n            &lt;th&gt;&lt;\/th&gt;\r\n        &lt;\/tr&gt;\r\n    &lt;\/thead&gt;\r\n    &lt;tbody&gt;\r\n        @foreach (var employee in Model)\r\n        {\r\n            &lt;tr&gt;\r\n                &lt;td&gt;@employee.Name&lt;\/td&gt;\r\n                &lt;td&gt;@employee.Email&lt;\/td&gt;\r\n                &lt;td&gt;\r\n                    &lt;a asp-action=&quot;Details&quot; asp-route-id=&quot;@employee.EncryptedId&quot;&gt;Detay&lt;\/a&gt;\r\n                &lt;\/td&gt;\r\n            &lt;\/tr&gt;\r\n        }\r\n    &lt;\/tbody&gt;\r\n&lt;\/table&gt;\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Data-Protection-\u0130le-Veri-Koruma.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Data-Protection-\u0130le-Veri-Koruma.jpg\" alt=\"Asp.NET Core - Data Protection \u0130le Veri Koruma\" width=\"919\" height=\"95\" class=\"aligncenter size-full wp-image-15418\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Data-Protection-\u0130le-Veri-Koruma.jpg 919w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Data-Protection-\u0130le-Veri-Koruma-300x31.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Data-Protection-\u0130le-Veri-Koruma-768x79.jpg 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/a><\/p>\n<p>B\u00f6ylece uygulamada kritik arz eden verilerimizi korumaya alm\u0131\u015f bulunmaktay\u0131z.<\/p>\n<p>Bu ad\u0131mdan sonra s\u0131rada, herhangi bir employee \u00fczerinden detay iste\u011finde bulunulursa \u015fifrelenmi\u015f &#8216;EncryptedId&#8217; de\u011ferini tekrar \u00e7\u00f6z\u00fcmlenmesi ve ilgili employee&#8217;a y\u00f6nlendirme yap\u0131lmas\u0131 vard\u0131r. Bunun i\u00e7inde a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 inceleyiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult Details(string id)\r\n        {\r\n            Employee employee = employees.FirstOrDefault(emp =&gt; emp.Id == int.Parse(_dataProtector.Unprotect(id)));\r\n            return View(employee);\r\n        }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;id&#8217; parametresinden gelen \u015fifrelenmi\u015f de\u011feri &#8216;Unprotect&#8217; metoduyla \u00e7\u00f6zerek ilgili nesneyi elde etmekte ve view&#8217;e g\u00f6ndermekteyiz.<\/p>\n<h4>ToTimeLimitedDataProtector \u0130le \u015eifrelenmi\u015f Veriye \u00d6m\u00fcr Bi\u00e7me<\/h4>\n<p>&#8216;ITimeLimitedDataProtector&#8217; aray\u00fcz\u00fc ile \u015fifrelenen verilerin \u00e7\u00f6z\u00fcmlenme s\u00fcresine bir \u00f6m\u00fcr bi\u00e7ebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        ITimeLimitedDataProtector _dataProtector;\r\n        public EmployeeController(IDataProtectionProvider dataProtectionProvider)\r\n        {\r\n            _dataProtector = dataProtectionProvider.CreateProtector(&quot;protectorname1&quot;).ToTimeLimitedDataProtector();\r\n        }\r\n    }\r\n<\/pre>\n<p>Kullan\u0131m\u0131;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            _dataProtector.Protect(emp.Id.ToString(), TimeSpan.FromMinutes(1))\r\n<\/pre>\n<p>Belirtilen s\u00fcre zarf\u0131nda \u015fifrelenmi\u015f veri \u00e7\u00f6z\u00fclebilecek aksi taktirde \u00e7\u00f6z\u00fclemeyecektir. B\u00f6ylece ihtiya\u00e7 do\u011frultusunda ge\u00e7ici urller olu\u015fturabilir ve kullan\u0131c\u0131 zamansal a\u00e7\u0131dan s\u0131n\u0131rland\u0131r\u0131labilir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bir uygulaman\u0131n hukuki boyutundan be\u015feri boyutuna kadar t\u00fcm detaylar\u0131n\u0131 ilgilendiren ve uygulaman\u0131n kalitesini ortaya koyarak, tercih edilebilirlik oran\u0131n\u0131 belirleyen en b\u00fcy\u00fck etkenlerden birinin veri g\u00fcvenli\u011fi oldu\u011funu d\u00fc\u015f\u00fcnebiliriz. G\u00fcnl\u00fck hayattan edindi\u011fimiz tecr\u00fcbelerde g\u00f6stermektedir ki,&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":15425,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3102,2898,3103],"tags":[2679,3455,3454,3456,3457,3458,3460,3459],"class_list":["post-15380","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core","category-asp-net-core-3-0","category-asp-net-core-3-1","tag-asp-net-core","tag-asp-net-core-data-protection","tag-asp-net-core-security","tag-data-protection","tag-dataprotection","tag-idataprotector","tag-itimelimiteddataprotector","tag-totimelimiteddataprotector"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=15380"}],"version-history":[{"count":42,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15380\/revisions"}],"predecessor-version":[{"id":15424,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15380\/revisions\/15424"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/15425"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}