﻿
{"id":3443,"date":"2015-12-25T00:23:03","date_gmt":"2015-12-25T00:23:03","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3443"},"modified":"2015-12-25T00:23:03","modified_gmt":"2015-12-25T00:23:03","slug":"asp-net-mvcde-csrfxsrfcross-site-request-forgery-saldiri-guvenligi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-mvcde-csrfxsrfcross-site-request-forgery-saldiri-guvenligi\/","title":{"rendered":"Asp.NET MVC&#8217;de CSRF\/XSRF(Cross-Site Request Forgery) Sald\u0131r\u0131 G\u00fcvenli\u011fi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda sizlere basit ama etkili bir teknik olan CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131s\u0131ndan bahsedece\u011fim.Bu sald\u0131r\u0131y\u0131 ger\u00e7ekle\u015ftirebilmek i\u00e7in teknik bilgi ihtiyac\u0131ndan ziyade, mant\u0131ki bir hamle kabiliyetine hakim olmak yeterlidir.<\/p>\n<p>Anlayaca\u011f\u0131n\u0131z d\u0131\u015far\u0131dan hi\u00e7bir teknik bilgi ve birikim gerekmeksizin yap\u0131lan entrikalarla oturum sahiplerine belli ba\u015fl\u0131 \u00e7akall\u0131klar\u0131 yapt\u0131rabilen bir sald\u0131r\u0131 mekanizmas\u0131d\u0131r diyebiliriz.<\/p>\n<p>\u00d6rnek olarak bir y\u00f6nteme de\u011finirsek e\u011fer,<br \/>\nHerhangi bir sitenizde bulunan yaz\u0131lar\u0131 <em><strong>http:\/\/www.****.com\/Yazilar\/Sil\/173<\/strong><\/em> buna benzer bir link ile silebildi\u011finizi d\u00fc\u015f\u00fcn\u00fcn.(Bu linkteki 173 bir ID de\u011ferini temsil etmektedir.)Tabi oturum a\u00e7\u0131lmad\u0131\u011f\u0131 s\u00fcrece bu link tetiklenmeyecek ve ilgili kullan\u0131c\u0131dan oturum yetkisi istenecektir.Buraya kadar bir s\u0131k\u0131nt\u0131 yok.O halde bu sald\u0131r\u0131 nas\u0131l d\u00fczenlenip, bu link tetiklenebilir.Yan\u0131 k\u00f6t\u00fc ama\u00e7l\u0131 ki\u015fi, bu linki bir \u015fekilde tetikletip hedefine nas\u0131l ula\u015fabilecektir? Soru bu!<\/p>\n<p>Burada k\u00f6t\u00fc ama\u00e7l\u0131 ki\u015finin yapmas\u0131 gereken \u00e7ok basittir.\u0130lgili linki size bir \u015fekilde ula\u015ft\u0131rmas\u0131 yeterli olacakt\u0131r.(Tabi ki de o sitede sizin bir yetkili oldu\u011funuzu varsay\u0131yoruz)Topu size att\u0131ktan sonra, kah yanl\u0131\u015fl\u0131kla kah belkide hi\u00e7 fark\u0131nda olmadan bu sald\u0131r\u0131ya kap\u0131lar\u0131 kendi ellerinizle a\u00e7m\u0131\u015f olacaks\u0131n\u0131z.<\/p>\n<p>Varsayal\u0131m, k\u00f6t\u00fc ama\u00e7l\u0131 \u015fah\u0131s bu linki size(site y\u00f6neticisi, moderat\u00f6r vs.) mail arac\u0131l\u0131\u011f\u0131yla yollad\u0131.Sizde &#8220;neymi\u015f la dur bi bakay\u0131m&#8221; diyerek linke t\u0131klad\u0131\u011f\u0131n\u0131z an %50 \u015fansla sald\u0131r\u0131 ba\u015far\u0131ya ula\u015fabilmektedir.Sald\u0131r\u0131 ba\u015far\u0131s\u0131na %50 pay bi\u00e7memin sebebi sizin ilgili sitedeki oturumunuzun a\u00e7\u0131k olup, olmamas\u0131ndan kaynaklanmaktad\u0131r.E\u011fer sitenizde oturum s\u00fcrekli a\u00e7\u0131ksa ya da 10 &#8211; 15 dk \u00f6nce girip oturumu kapatmadan \u00e7\u0131kt\u0131ysan\u0131z veyahut o an aktifseniz e\u011fer bu mail arac\u0131l\u0131\u011f\u0131yla gelen ve sizin tetikledi\u011finiz link oturumunuz huzurunda gerekli Action yap\u0131lar\u0131 tetikleyecek ve o ID de\u011ferine sahip yaz\u0131 silinecektir.<\/p>\n<p>Hadi diyelim sald\u0131r\u0131 bu \u015fekilde link \u00fczerinden gelirse yapt\u0131\u011f\u0131n\u0131z hatan\u0131n fark\u0131na varabilir ve bir \u015fekilde zarar\u0131 telafi edebilirsiniz.Lakin ikinci y\u00f6ntem olarak birazdan bahsedece\u011fim gizli link vakas\u0131 sizin ne olup bitti\u011finden hi\u00e7 haberdar olmayaca\u011f\u0131n\u0131z bir durumda ger\u00e7ekle\u015fecektir.<\/p>\n<p>O ikinci y\u00f6nteme gelece\u011fim.Tamam.Ama \u015fuanda buraya kadar bu sald\u0131r\u0131n\u0131n ne t\u00fcr bir tarzda oldu\u011funu, ne kadar basit ama etkili oldu\u011funu kavraman\u0131z\u0131 istiyorum.<\/p>\n<p>K\u0131saca \u00f6zetlersek, sald\u0131ran\u0131n amac\u0131, sitede tetikleyici linkleri oturum sahiplerine a\u00e7\u0131k ya da gizli bir \u015fekilde ula\u015ft\u0131rmak ve linkleri tetikletmektir.<\/p>\n<p>\u015eimdi bu sald\u0131r\u0131ya nas\u0131l kar\u015f\u0131 gelebilece\u011fimizi, hangi felsefeyle hareket edece\u011fimizi ve teknik olarak ne yapmam\u0131z gerekti\u011fini konu\u015fal\u0131m, ard\u0131ndan ikinci y\u00f6ntem olarak gizli link vakas\u0131 dedi\u011fim y\u00f6nteme de\u011finip yaz\u0131m\u0131z\u0131 noktalayal\u0131m.<\/p>\n<p>\u00d6ncelikle \u015funu biliyoruz ki, bu sald\u0131r\u0131 d\u0131\u015far\u0131dan g\u00f6nderilen bir link sonucu do\u011fmaktad\u0131r.O halde \u015f\u00f6yle d\u00fc\u015f\u00fcnelim?Benim sitemde bulunan tetikleyici link ile d\u0131\u015far\u0131dan gelecek olan link evet ayn\u0131 yap\u0131da ve adreste olabilir ama ikisi aras\u0131nda bir fark yaratabilmeliyiz.Bu fark\u0131 yaratabilirsek e\u011fer tetiklenmenin site \u00fczerinden mi? yoksa d\u0131\u015far\u0131dan ya da ba\u015fka bir kaynaktan m\u0131 yap\u0131ld\u0131\u011f\u0131n\u0131 ay\u0131rt edebiliriz.<\/p>\n<p>Aradaki farka gelirsek e\u011fer, sitemdeki link sitemde, d\u0131\u015far\u0131dan g\u00f6nderilen sald\u0131r\u0131 ama\u00e7l\u0131 linkte d\u0131\u015far\u0131dad\u0131r.&#8221;Hoca dalgam\u0131 ge\u00e7iyon?&#8221; diye soranlar\u0131n\u0131z olabilir.Tabi ki de hay\u0131r.Burada size anlams\u0131z gelen bu fark durumuyla bir nokta yakalayarak ona g\u00f6re g\u00fcvenlik olu\u015fturaca\u011f\u0131z.<\/p>\n<p>\u015eimdi, &#8220;sitemde olan bir linkin ayn\u0131s\u0131n\u0131n d\u0131\u015far\u0131da olmas\u0131 aras\u0131nda ne fark olabilir?&#8221; diye sorabilirsiniz.Hay\u0131r!Fark bu ikisinde de\u011fil.Linklerin bulundu\u011fu ortamlardad\u0131r.Yani sitemin y\u00f6netim panelinin \u00f6rn. &#8220;Yaz\u0131 Listesi&#8221; sekmesinde bulunan bu link ile \u00f6rn. mail arac\u0131l\u0131\u011f\u0131yla bize ula\u015ft\u0131r\u0131lan bu link aras\u0131nda fark s\u0131f\u0131rd\u0131r ama ortam fark\u0131 vard\u0131r.<\/p>\n<p>\u0130\u015fte bu ortam ile link aras\u0131nda bir ba\u011f kurarak sitemizden mi? yoksa d\u0131\u015far\u0131dan m\u0131? tetiklenme yap\u0131lm\u0131\u015f ay\u0131rt edebilece\u011fiz.<\/p>\n<p>\u00d6rnek olarak &#8220;Yaz\u0131 Listesi&#8221; sekmesinde bulunan bu linki birdaha ele alal\u0131m.<br \/>\n<em><strong>http:\/\/www.****.com\/Yazilar\/Sil\/173<\/strong><\/em><br \/>\nBu link bizim sitemizin &#8220;Yaz\u0131 Listesi&#8221; sayfas\u0131nda oldu\u011fu i\u00e7in, o sayfaya \u00f6zel bir token olu\u015fturursak ve ilgili Action tetiklendi\u011fi vakit o token\u0131 do\u011frulat\u0131rsak e\u011fer anlar\u0131z ki bu tetikleme site \u00fczerinden kas\u0131tl\u0131 bir bi\u00e7imde yap\u0131lm\u0131\u015ft\u0131r.Yok e\u011fer token do\u011frulanm\u0131yorsa, demek ki bu link d\u0131\u015far\u0131dan ya da ba\u015fka bir kaynaktan gelmi\u015ftir.<\/p>\n<p>Bu mant\u0131\u011fa g\u00f6re bu linkin do\u011fru \u00e7al\u0131\u015fmas\u0131 i\u00e7in site \u00fczerinde token\u0131n olu\u015fturuldu\u011fu sayfa \u00fczerinden tetiklenmek \u015fart ko\u015fulmaktad\u0131r ve aksi taktirde token do\u011frulanamayaca\u011f\u0131 i\u00e7in bu sald\u0131r\u0131 yap\u0131lsa ve biz tuza\u011fa d\u00fc\u015fsek bile k\u00f6t\u00fc ki\u015fi murad\u0131na eremeyecektir.<\/p>\n<p>Bu arada Token; belirti, ni\u015fan, i\u015faret ve jeton anlam\u0131nda kullan\u0131lan bir kelimedir.<\/p>\n<p>\u015eimdi gelelim teknik olarak bu i\u015fi nas\u0131l halledece\u011fimize.\u00d6ncelikle tokendan kast\u0131m\u0131z yukar\u0131da belirtti\u011fim gibi bir i\u015faret ama\u00e7l\u0131 de\u011fer \u00fcretilip bunu serverda do\u011frulatmakt\u0131r.Bunu siz istedi\u011finiz algoritma ve teknikle ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<p>\u015eimdi buna bir \u00f6rnek olarak Index.cshtml sayfas\u0131nda manuel bir token olu\u015fturuyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@{\r\n    Session.Add(&quot;Token&quot;, &quot;IndexSayfasi&quot;);\r\n}\r\n\r\n&lt;a href=&quot;@Url.Action(&quot;OrnekAction&quot;,&quot;Home&quot;)&quot;&gt;T\u0131kla&lt;\/a&gt;\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;IndexSayfasi&#8221; de\u011ferine sahip token\u0131 bir Session de\u011fi\u015fkene at\u0131yorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public ActionResult OrnekAction()\r\n        {\r\n            if (Session&#x5B;&quot;Token&quot;] != null)\r\n            {\r\n                if (Session&#x5B;&quot;Token&quot;] == &quot;IndexSayfasi&quot;)\r\n                {\r\n                    \/\/\u0130\u015flemleri ger\u00e7ekle\u015ftir....\r\n                }\r\n            }\r\n\r\n            Session.Remove(&quot;Token&quot;);\r\n            return View();\r\n        }\r\n<\/pre>\n<p>Ve burada da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Index.cshtml sayfas\u0131nda olu\u015fturulan token\u0131 burada do\u011frulatt\u0131r\u0131yorum.Buradaki algoritmaya g\u00f6re her Action tetiklenme neticesinde ilgili Session de\u011fi\u015fkenimizi siliyorum ki haf\u0131zada Session tutulmas\u0131n.<\/p>\n<p>Evet, art\u0131k Asp.NET MVC mimarisinde normal linkler i\u00e7in CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131 g\u00fcvenli\u011fini ger\u00e7ekle\u015ftirmi\u015f olduk.<\/p>\n<p>Bunlar\u0131n yan\u0131nda formlar\u0131nda CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131s\u0131na kar\u015f\u0131 g\u00fcvenli\u011fi al\u0131nabilmektedir.Bunun i\u00e7in yapmam\u0131z gerekense form i\u00e7erisinde token \u00fcretmektir.Ama bu i\u015flem i\u00e7in Asp.NET MVC Framework geli\u015ftiricileri biz .NET kullan\u0131c\u0131lar\u0131 i\u00e7in bu mant\u0131kta bir yap\u0131 geli\u015ftirmi\u015flerdir ve tek sat\u0131rda bu i\u015fi halledebilmekteyiz.<\/p>\n<p>\u015eimdi \u00f6rnek olarak gene Index.cshtml sayfas\u0131nda token\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using (Html.BeginForm(&quot;OrnekAction&quot;, &quot;Home&quot;))\r\n{\r\n    @Html.AntiForgeryToken()\r\n\r\n    &lt;input type=&quot;button&quot; value=&quot;Post Et&quot; \/&gt;\r\n}\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;AntiForgeryToken&#8221; komutu ile Index.cshtml sayfas\u0131na \u00f6zel form i\u00e7in token\u0131m\u0131z\u0131 olu\u015fturduk.Sayfam\u0131z\u0131n kaynak koduna bakarsak e\u011fer &#8220;AntiForgeryToken&#8221; komutu sayesinde bir input olu\u015fturdu\u011funu rahatl\u0131kla g\u00f6rebiliriz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/12\/Asp.NET-MVCde-CSRF-XSRFCross-Site-Request-Forgery-Sald\u0131r\u0131-G\u00fcvenli\u011fi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3451\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/12\/Asp.NET-MVCde-CSRF-XSRFCross-Site-Request-Forgery-Sald\u0131r\u0131-G\u00fcvenli\u011fi.png\" alt=\"Asp.NET MVC'de CSRF-XSRF(Cross-Site Request Forgery) Sald\u0131r\u0131 G\u00fcvenli\u011fi\" width=\"1168\" height=\"48\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/12\/Asp.NET-MVCde-CSRF-XSRFCross-Site-Request-Forgery-Sald\u0131r\u0131-G\u00fcvenli\u011fi.png 1168w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/12\/Asp.NET-MVCde-CSRF-XSRFCross-Site-Request-Forgery-Sald\u0131r\u0131-G\u00fcvenli\u011fi-300x12.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2015\/12\/Asp.NET-MVCde-CSRF-XSRFCross-Site-Request-Forgery-Sald\u0131r\u0131-G\u00fcvenli\u011fi-1024x42.png 1024w\" sizes=\"auto, (max-width: 1168px) 100vw, 1168px\" \/><\/a><\/p>\n<p>\u0130\u015fte burada olu\u015fturdu\u011fu input de\u011ferini post ederek servera g\u00f6nderecek ve do\u011frulataca\u011f\u0131z.<\/p>\n<p>\u015eimdi ise Serverda bu token\u0131 kontrol ederek olu\u015fturuldu\u011funu do\u011frulatt\u0131r\u0131p metodumuzu tetiklettirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;ValidateAntiForgeryToken()]\r\n        &#x5B;HttpPost()]\r\n        public ActionResult OrnekAction()\r\n        {\r\n            return View();\r\n        }\r\n<\/pre>\n<p>Burada da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;ValidateAntiForgeryToken&#8221; Attribute&#8217;u ile View katman\u0131nda olu\u015fturulan token\u0131 do\u011frulatm\u0131\u015f oluyoruz.<\/p>\n<p>\u0130\u015flemimiz bu kadar.<\/p>\n<p>\u015euana kadar CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131s\u0131n\u0131n ne oldu\u011fundan, teorik ve teknik g\u00fcvenli\u011fin nas\u0131l al\u0131naca\u011f\u0131ndan bahsettik ve pratikte hem manuel hemde Framework&#8217;te s\u0131rf bu i\u015flem i\u00e7in tasarlanm\u0131\u015f yap\u0131yla \u00f6rneklerimizi neticelendirdik.<\/p>\n<p>Asl\u0131nda yaz\u0131m\u0131z i\u00e7erik olarak burada bitmi\u015f bulunmaktad\u0131r, lakin s\u00f6z verdi\u011fimiz gizli link sald\u0131r\u0131s\u0131ndan da bahsetmemiz gerekmektedir.<\/p>\n<p>CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131s\u0131 d\u0131\u015far\u0131dan olan bir hamle sonucu oldu\u011funu biliyoruz.Yaz\u0131m\u0131z\u0131n ba\u015f\u0131nda bu hamlenin direkt olarak ilgili linkin g\u00f6nderilmesiyle ilgili bir senaryo  \u00fczerinde tart\u0131\u015ft\u0131k.Cross-Site Request Forgery sald\u0131r\u0131s\u0131 sadece ilgili linki g\u00f6ndermekle s\u0131n\u0131rland\u0131r\u0131lmamakta, ba\u015fka linkler \u00fczerinden de hedef(kurban) link \u00fczerinde tetikleme i\u015flemi yap\u0131labilmektedir.<\/p>\n<p>\u00d6rnek olarak size mailden http:\/\/www.gencayyildiz.com adresini g\u00f6nderdim.Sizde t\u0131klad\u0131n\u0131z.Bu t\u0131klama neticesinde g\u00f6nderdi\u011fim sayfa \u00fczerinden jQuery komutlar\u0131 arac\u0131l\u0131\u011f\u0131yla ilgili linki tetikletebilir, direkt y\u00f6nlendirme yapabilir veyahut bir img(resim) nesnesi arac\u0131l\u0131\u011f\u0131yla ruhunuzun duymayaca\u011f\u0131 \u015fekilde hedef linki tetikletip harekete ge\u00e7irebilirim.Varsayal\u0131m g\u00f6nderdi\u011fim adreste a\u015fa\u011f\u0131daki gibi bir resim var.<br \/>\n<em><strong>&lt;img src=&#8221;http:\/\/www.****.com\/Yazilar\/Sil\/173&#8243; \/&gt;<\/strong><\/em><br \/>\nBu resmin src attributeunda yani kayna\u011f\u0131nda hedef link var.img nesneleri verilen kaynak linke talep g\u00f6ndermekte ve gelen neticeyi ilgili alana basmaktad\u0131rlar.Haliyle bu img nesnesi verilen hedef linke talep g\u00f6nderecek, yani onu tetikletecek ve sald\u0131r\u0131da burada amac\u0131na ermi\u015f olacak, ama geriye bir resim Response edilmedi\u011fi i\u00e7in img nesnesi resmi g\u00f6steremeyecektir.<\/p>\n<p>\u0130\u015fte ben buna gizli link vakas\u0131 ismini verdim.<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\nHepinize iyi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131mda sizlere basit ama etkili bir teknik olan CSRF\/XSRF(Cross-Site Request Forgery) sald\u0131r\u0131s\u0131ndan bahsedece\u011fim.Bu sald\u0131r\u0131y\u0131 ger\u00e7ekle\u015ftirebilmek i\u00e7in teknik bilgi ihtiyac\u0131ndan ziyade, mant\u0131ki bir hamle kabiliyetine hakim olmak yeterlidir. Anlayaca\u011f\u0131n\u0131z d\u0131\u015far\u0131dan hi\u00e7bir teknik bilgi ve&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":3453,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,11,600,857],"tags":[864,860,861,859,858,865,863,862],"class_list":["post-3443","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net","category-asp-net-mvc","category-asp-net-mvc-5","category-guvenlik","tag-antiforgerytoken","tag-cross-site-request-forgery","tag-csrf","tag-csrfxsrf","tag-gizli-link-vakasi","tag-token","tag-validateantiforgerytoken","tag-xsrf"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3443","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=3443"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3443\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3453"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}