{"id":773,"date":"2016-09-01T09:27:50","date_gmt":"2016-09-01T06:27:50","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=773"},"modified":"2016-09-01T09:32:26","modified_gmt":"2016-09-01T06:32:26","slug":"asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/","title":{"rendered":"Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Gelen sorular \u00fczerine bu yaz\u0131mda\u00a0sizlerle <strong>Asp.Net Web API&#8217;da Cross-Site Request Forgery(CSRF)<\/strong> sald\u0131r\u0131lar\u0131na kar\u015f\u0131 g\u00fcvenli\u011fi nas\u0131l ele\u00a0alabiliriz&#8217;i k\u00fc\u00e7\u00fck \u00e7apta anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Zaten bir \u00e7o\u011fumuzun <strong>Asp.Net MVC<\/strong>&#8216;den <strong>AntiForgeryToken\u00a0<\/strong>ile a\u015fina oldu\u011fu bir konu olabilir. AntiForgeryToken\u00a0implementasyonunu Web API baca\u011f\u0131nda ise custom olarak kendimiz ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/csrf.png\"><img decoding=\"async\" class=\"size-full wp-image-774 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/csrf.png\" alt=\"csrf\" width=\"895\" height=\"409\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/csrf.png 895w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/csrf-300x137.png 300w\" data-sizes=\"(max-width: 895px) 100vw, 895px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 895px; --smush-placeholder-aspect-ratio: 895\/409;\" \/><\/a><\/p>\n<p>Dilerseniz \u00f6ncelikle CSRF hakk\u0131ndaki bilgimizi biraz\u00a0g\u00fcncelleyelim.<\/p>\n<blockquote><p>CSRF ata\u011f\u0131 sald\u0131rgan taraf\u0131ndan son kullan\u0131c\u0131n\u0131n kulland\u0131\u011f\u0131 uygulamada, iste\u011fi d\u0131\u015f\u0131nda i\u015flemler yapt\u0131r\u0131labilmesidir\u00a0diyebiliriz.<\/p><\/blockquote>\n<p>Bir \u00fcstteki resme bakt\u0131\u011f\u0131m\u0131zda ise burada Attacker&#8217;\u0131n Victim&#8217;a bir link g\u00f6nderdi\u011fini ve burada bir form submit i\u015fleminin yap\u0131ld\u0131\u011f\u0131n\u0131 (iste\u011finin d\u0131\u015f\u0131nda) g\u00f6r\u00fcyoruz. Sonras\u0131nda ise Attacker&#8217;\u0131n iste\u011fi do\u011frultusunda ilgili Response al\u0131nd\u0131ktan sonra Bank Server&#8217;a Victim&#8217;\u0131n \u00a0data+cookie gibi ge\u00e7erli session bilgileri ile g\u00f6nderilebildi\u011fini\u00a0g\u00f6r\u00fcyoruz.\u00a0Biraz u\u00e7 bir \u00f6rnek olsada CSRF sald\u0131r\u0131lar\u0131n\u0131n i\u015fleyi\u015f bi\u00e7imi bu \u015fekildedir diyebiliriz. Denk\u00a0gelinebilmesi biraz zor bir a\u00e7\u0131k olsa da gerekti\u011fi durumlarda \u00f6nlemini almak iyi olacakt\u0131r.<\/p>\n<p>Yukar\u0131daki u\u00e7\u00a0\u00f6rne\u011fimizde bulunan ak\u0131\u015fta, son kullan\u0131c\u0131ya sald\u0131rgan taraf\u0131ndan t\u0131klat\u0131lan en basitinden \u00f6rnek form&#8217;a bakmak gerekirse de:<\/p>\n<pre class=\"lang:default decode:true\">&lt;h1&gt;Fake Bank Form&lt;\/h1&gt;\r\n  &lt;form action=\"http:\/\/www.foobank.com\/api\/transfer\" method=\"post\"&gt;\r\n    &lt;input type=\"hidden\" name=\"SessionId\" value=\"123456\" \/&gt;\r\n    &lt;input type=\"hidden\" name=\"Amount\" value=\"100\" \/&gt;\r\n  &lt;input type=\"submit\" value=\"Transfer\"\/&gt;\r\n&lt;\/form&gt;<\/pre>\n<h4>1)\u00a0AntiForgeryToken mant\u0131\u011f\u0131 nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/h4>\n<p>Client taraf\u0131nda ilgili form&#8217;a \u00f6zel encrypted bir AntiForgeryToken olu\u015fturulur ve bir adette cookie i\u00e7erisinde olu\u015fturulur. Bu token MVC taraf\u0131nda\u00a0a\u015fa\u011f\u0131daki kod sat\u0131r\u0131 ile olu\u015fturulmaktad\u0131r.<\/p>\n<pre class=\"lang:c# decode:true\">@Html.AntiForgeryToken()<\/pre>\n<p>\u0130lgili form POST\u00a0edildi\u011finde ise AntiForgeryToken server taraf\u0131nda decrypt edilerek cookie&#8217;deki de\u011fer ile kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r ve validation i\u015flemlerinden ge\u00e7irilir. Bu sayede Cross-Site istekleri\u00a0engellenmi\u015f olunur.<\/p>\n<h4>2) Asp.Net Web API taraf\u0131nda AntiForgeryToken implementasyonu<\/h4>\n<p>Implementasyon i\u015flemini Web API&#8217;\u0131n filter&#8217;lar\u0131 ile ger\u00e7ekle\u015ftirece\u011fiz. Bunun i\u00e7in\u00a0<strong>IAuthorizationFilter<\/strong>\u00a0interface&#8217;inden yararlanaca\u011f\u0131z. Implementasyona ba\u015flamadan \u00f6nce Nuget Package Manager \u00fczerinden &#8220;Microsoft.AspNet.WebPages&#8221; paketini y\u00fcklememiz gerekmektedir. Bu paket yard\u0131m\u0131 ile &#8220;System.Web.Helpers&#8221; namespace&#8217;i alt\u0131nda bulunan, <strong>AntiForgery<\/strong> s\u0131n\u0131f\u0131n\u0131 kullanabilece\u011fiz.<\/p>\n<p><strong>ValidateHttpAntiForgeryTokenAttribute\u00a0<\/strong>isminde bir class olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Net;\r\nusing System.Net.Http;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Web.Helpers;\r\nusing System.Web.Http.Controllers;\r\nusing System.Web.Http.Filters;\r\n\r\nnamespace AspNetWebAPIAntiForgeryToken.Filters\r\n{\r\n    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]\r\n    public sealed class ValidateHttpAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter\r\n    {\r\n        public Task&lt;HttpResponseMessage&gt; ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func&lt;Task&lt;HttpResponseMessage&gt;&gt; continuation)\r\n        {\r\n            try\r\n            {\r\n                AntiForgery.Validate();\r\n            }\r\n            catch(Exception ex)\r\n            {\r\n                \/\/ Loglama i\u015flemleri yap\u0131lmal\u0131d\u0131r\r\n\r\n                actionContext.Response = new HttpResponseMessage\r\n                {\r\n                    StatusCode = HttpStatusCode.Forbidden\r\n                };\r\n\r\n                return FromResult(actionContext.Response);\r\n            }\r\n\r\n            return continuation();\r\n        }\r\n\r\n        private Task&lt;HttpResponseMessage&gt; FromResult(HttpResponseMessage result)\r\n        {\r\n            var taskCompletionSource = new TaskCompletionSource&lt;HttpResponseMessage&gt;();\r\n\r\n            taskCompletionSource.SetResult(result);\r\n\r\n            return taskCompletionSource.Task;\r\n        }\r\n    }\r\n}<\/pre>\n<p>Olu\u015fturmu\u015f oldu\u011fumuz attribute i\u00e7erisinde\u00a0<strong>ExecuteAuthorizationFilterAsync<\/strong> method&#8217;undan yararlanarak, i\u00e7erisinde <strong>AntiForgery.Validate()<\/strong> method&#8217;unu \u00e7a\u011f\u0131r\u0131yoruz. Bu method kendisine g\u00f6nderilen AntiForgeryToken&#8217;\u0131\u00a0decrypt i\u015fleminden ge\u00e7irerek, validation i\u015flemlerini ger\u00e7ekle\u015ftirmektedir. E\u011fer validation i\u015flemlerinden ge\u00e7emezse bu noktada exception&#8217;a d\u00fc\u015fmektedir.<\/p>\n<p>\u015eimdi bir <strong>TestController<\/strong> olu\u015ftural\u0131m ve olu\u015fturmu\u015f oldu\u011fumuz attribute&#8217;\u00fc a\u015fa\u011f\u0131daki gibi kullanal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">using System.Net;\r\nusing System.Net.Http;\r\nusing System.Web.Http;\r\nusing AspNetWebAPIAntiForgeryToken.Filters;\r\n\r\nnamespace AspNetWebAPIAntiForgeryToken.Controllers\r\n{\r\n    public class TestController : ApiController\r\n    {\r\n        [ValidateHttpAntiForgeryToken]\r\n        public HttpResponseMessage Post()\r\n        {\r\n            return Request.CreateResponse(HttpStatusCode.OK);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Asp.Net Web API taraf\u0131 \u015fuan CSRF i\u00e7in haz\u0131r durumda. Test i\u015flemlerimizi ger\u00e7ekle\u015ftirebilmemiz i\u00e7in, i\u00e7erisinde POST i\u015flemi ger\u00e7ekle\u015ftirecek olan\u00a0basit bir form&#8217;a sahip MVC uygulamas\u0131 olu\u015ftural\u0131m.<\/p>\n<p>Form&#8217;u a\u015fa\u011f\u0131daki gibi d\u00fczenleyelim.<\/p>\n<pre class=\"lang:default decode:true\">&lt;form action=\"http:\/\/localhost:57955\/api\/test\" method=\"post\"&gt;\r\n    @Html.AntiForgeryToken()\r\n\r\n    &lt;div class=\"form-horizontal\"&gt;\r\n        &lt;div class=\"form-group\"&gt;\r\n            Email\r\n            &lt;div class=\"col-md-10\"&gt;\r\n                &lt;input type=\"text\" class=\"form-control\" \/&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n\r\n        &lt;div class=\"form-group\"&gt;\r\n            New Password\r\n            &lt;div class=\"col-md-10\"&gt;\r\n                &lt;input type=\"text\" class=\"form-control\" \/&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n\r\n        &lt;div class=\"form-group\"&gt;\r\n            &lt;div class=\"col-md-offset-2 col-md-10\"&gt;\r\n                &lt;input type=\"submit\" value=\"Complete\" class=\"btn btn-default\" \/&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Burada bizim i\u00e7in \u00f6nemli olan sadece AntiForgeryToken&#8217;\u0131 olu\u015fturacak olan &#8220;Html.AntiForgeryToken()&#8221; k\u0131sm\u0131d\u0131r. MVC uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131p kaynak kodu g\u00f6r\u00fcnt\u00fcledi\u011fimizde\u00a0ise, her seferinde farkl\u0131 bir token \u00fcretti\u011fini de g\u00f6rebiliriz.<\/p>\n<pre class=\"lang:default decode:true \">&lt;input name=\"__RequestVerificationToken\" type=\"hidden\" value=\"EC5S9Ew_yO9NWtprV9MoDY9-FVsNnbeRXB7glpC3-8qeR7AbA_xvQ-AdsxnIga5an8Pda4eAgG8V9QaeZswvxbcxwhI1\" \/&gt;<\/pre>\n<p>Yukar\u0131daki\u00a0formun POST edilece\u011fi adres, local&#8217;imdeki Web API&#8217;\u0131 host etti\u011fim &#8220;http:\/\/localhost:57955\/api\/test&#8221; adresidir. Sizde bu k\u0131sm\u0131 kendi local adresiniz ile de\u011fi\u015ftirebilirsiniz.<\/p>\n<p>\u0130lk denememizi yapabilmek ad\u0131na dilerseniz her iki projeyi de ayn\u0131 anda \u00e7al\u0131\u015ft\u0131ral\u0131m. \u00c7al\u0131\u015ft\u0131rd\u0131ktan sonra Web API k\u0131sm\u0131ndaki geli\u015ftirmi\u015f oldu\u011fumuz token&#8217;\u0131n &#8220;AntiForgery.Validate()&#8221; sat\u0131r\u0131na bir break point koyal\u0131m ve MVC uygulamas\u0131ndaki form&#8217;da submit i\u015flemini ger\u00e7ekle\u015ftirelim. Bakal\u0131m token validation i\u015flemlerinden ge\u00e7ebilecek mi?<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/antiforgerytoken_1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-780 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/antiforgerytoken_1.jpg\" alt=\"antiforgerytoken_1\" width=\"786\" height=\"377\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/antiforgerytoken_1.jpg 786w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/antiforgerytoken_1-300x144.jpg 300w\" data-sizes=\"(max-width: 786px) 100vw, 786px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 786px; --smush-placeholder-aspect-ratio: 786\/377;\" \/><\/a><\/p>\n<p>Ups! validation i\u015flemi ger\u00e7ekle\u015femedi. Bunun sebebi ise olu\u015fturulan AntiForgeryToken&#8217;lar &#8220;machineKey&#8221; i\u00e7erisindeki &#8220;validation&#8221; ve &#8220;decryption&#8221; key bilgilerine g\u00f6re olu\u015fturulmaktad\u0131r t\u0131pk\u0131 OAuth 2.0&#8217;da oldu\u011fu gibi. Bu i\u015flemin iki taraf i\u00e7inde ortak ger\u00e7ekle\u015ftirilebilmesi yani ayn\u0131 dilden\u00a0konu\u015fabilmeleri i\u00e7in ayn\u0131 &#8220;machineKey&#8221; bilgilerine sahip olmalar\u0131 gerekmektedir.<\/p>\n<p>IIS Manager \u00fczerinden h\u0131zl\u0131ca machineKey bilgilerini olu\u015fturabilirsiniz. Ben her iki uygulamam i\u00e7in &#8220;web.config&#8221; i\u00e7erisindeki &#8220;system.web&#8221; alt\u0131na ilgili &#8220;machineKey&#8221; bilgilerini, a\u015fa\u011f\u0131daki gibi tan\u0131ml\u0131yorum.<\/p>\n<pre class=\"lang:default decode:true\">&lt;system.web&gt;\r\n  &lt;compilation debug=\"true\" targetFramework=\"4.5.2\"\/&gt;\r\n  &lt;httpRuntime targetFramework=\"4.5.2\"\/&gt;\r\n\r\n  &lt;machineKey validationKey=\"994FD669298C7B30E765A8E6118D4140746A83EF0A89F94EBEF02EF2991FA5C808F2DAAD91E8D649DEF9A1F31E398CA1D7C8D2B7A21EB3E81F7A824456BEA1BC\" \r\n              decryptionKey=\"B550B27413F1DBB46A37CC54620FCF4F78AAE1A22E4AD71DF185EDF4F9AC5726\" \r\n              validation=\"SHA1\" decryption=\"AES\" \/&gt;\r\n&lt;\/system.web&gt;<\/pre>\n<p>\u0130ki uygulamay\u0131 \u015fimdi tekrar\u00a0\u00e7al\u0131\u015ft\u0131r\u0131p, &#8220;AntiForgery.Validate()&#8221; sat\u0131r\u0131ndaki debug noktas\u0131na bir kez daha\u00a0g\u00f6z atal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/antiforgerytoken_2.jpg\"><img decoding=\"async\" class=\"size-full wp-image-781 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/antiforgerytoken_2.jpg\" alt=\"antiforgerytoken_2\" width=\"670\" height=\"400\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/antiforgerytoken_2.jpg 670w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/antiforgerytoken_2-300x179.jpg 300w\" data-sizes=\"(max-width: 670px) 100vw, 670px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 670px; --smush-placeholder-aspect-ratio: 670\/400;\" \/><\/a><\/p>\n<p>Bu sefer ba\u015far\u0131l\u0131 bir \u015fekilde validate i\u015fleminin ger\u00e7ekle\u015fti\u011fini g\u00f6rebilmekteyiz.<\/p>\n<p><strong>AntiForgery<\/strong> s\u0131n\u0131f\u0131n\u0131n <strong>Validate<\/strong> method&#8217;unun arkaplan\u0131ndaki\u00a0kontrol i\u015fleminde ise form aray\u00fcz\u00fcnden POST edilen AntiForgeryToken ile, cookie&#8217;ye yaz\u0131lan token&#8217;lar server taraf\u0131nda\u00a0decrypt edilerek kontrol edilmektedir ve validation i\u015flemleri ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<h4>3) Dikkat edilmesi gereken bir ka\u00e7 nokta<\/h4>\n<ul>\n<li>Bu i\u015flem sadece POST request&#8217;leri\u00a0i\u00e7in ge\u00e7erli olmal\u0131d\u0131r, GET request&#8217;leri i\u00e7in de\u011fil<\/li>\n<li>E\u011fer sisteminizde herhangi bir Cross Site Scripting(XSS) a\u00e7\u0131\u011f\u0131 var ise kolayl\u0131kla token\u00a0bypass edilebilmektedir<\/li>\n<li>Cookie arac\u0131l\u0131\u011f\u0131 ile validation i\u015flemleri ger\u00e7ekle\u015ftirildi\u011fi i\u00e7in herhangi bir kullan\u0131c\u0131n\u0131n cookie&#8217;leri kapal\u0131 ise, valid olmayacakt\u0131r<\/li>\n<\/ul>\n<p>Makalemizi burada sonland\u0131r\u0131yoruz ve umar\u0131m herkes i\u00e7in faydal\u0131 bir makale olmu\u015ftur. \u0130lgili \u00f6rnek projeye a\u015fa\u011f\u0131daki linkten\u00a0ula\u015fabilirsiniz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/antiforgerytoken_2.jpg\"><br \/>\n<\/a> <a href=\"\/wp-content\/uploads\/2016\/09\/AspNetWebAPIAntiForgeryToken.rar\">AspNetWebAPIAntiForgeryToken<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Gelen sorular \u00fczerine bu yaz\u0131mda\u00a0sizlerle Asp.Net Web API&#8217;da Cross-Site Request Forgery(CSRF) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 g\u00fcvenli\u011fi nas\u0131l ele\u00a0alabiliriz&#8217;i k\u00fc\u00e7\u00fck \u00e7apta anlatmaya \u00e7al\u0131\u015faca\u011f\u0131m. Zaten bir \u00e7o\u011fumuzun Asp.Net MVC&#8216;den AntiForgeryToken\u00a0ile a\u015fina oldu\u011fu bir konu olabilir. AntiForgeryToken\u00a0implementasyonunu Web API baca\u011f\u0131nda ise custom olarak kendimiz ger\u00e7ekle\u015ftirece\u011fiz. Dilerseniz \u00f6ncelikle CSRF&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,48],"tags":[255,254,256,250,252,251,253],"class_list":["post-773","post","type-post","status-publish","format-standard","hentry","category-net","category-asp-net-web-api","tag-asp-net-web-api-antiforgerytoken","tag-asp-net-web-api-csrf","tag-asp-net-web-api-csrf-guvenligi","tag-cross-site-request-forgery","tag-cross-site-request-forgery-nedir","tag-csrf-guvenligi","tag-csrf-nedir","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Asp.Net Web API&#039;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp<\/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:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Asp.Net Web API&#039;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-01T06:27:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-09-01T06:32:26+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi\",\"datePublished\":\"2016-09-01T06:27:50+00:00\",\"dateModified\":\"2016-09-01T06:32:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/\"},\"wordCount\":920,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"Asp.Net Web API AntiForgeryToken\",\"Asp.Net Web API CSRF\",\"Asp.Net Web API CSRF G\u00fcvenli\u011fi\",\"Cross-Site Request Forgery\",\"Cross-Site Request Forgery Nedir\",\"CSRF G\u00fcvenli\u011fi\",\"CSRF nedir\"],\"articleSection\":[\".NET\",\"Asp.Net Web API\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/\",\"name\":\"Asp.Net Web API'da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-09-01T06:27:50+00:00\",\"dateModified\":\"2016-09-01T06:32:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Asp.Net Web API'da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/","og_locale":"tr_TR","og_type":"article","og_title":"Asp.Net Web API'da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-09-01T06:27:50+00:00","article_modified_time":"2016-09-01T06:32:26+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"6 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi","datePublished":"2016-09-01T06:27:50+00:00","dateModified":"2016-09-01T06:32:26+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/"},"wordCount":920,"commentCount":12,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["Asp.Net Web API AntiForgeryToken","Asp.Net Web API CSRF","Asp.Net Web API CSRF G\u00fcvenli\u011fi","Cross-Site Request Forgery","Cross-Site Request Forgery Nedir","CSRF G\u00fcvenli\u011fi","CSRF nedir"],"articleSection":[".NET","Asp.Net Web API"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/","url":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/","name":"Asp.Net Web API'da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-09-01T06:27:50+00:00","dateModified":"2016-09-01T06:32:26+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-apida-cross-site-request-forgery-csrf-saldiri-guvenligi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Asp.Net Web API&#8217;da Cross-Site Request Forgery (CSRF) Sald\u0131r\u0131 G\u00fcvenli\u011fi"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=773"}],"version-history":[{"count":10,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/773\/revisions"}],"predecessor-version":[{"id":787,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/773\/revisions\/787"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}