[{"data":1,"prerenderedAt":888},["ShallowReactive",2],{"i-feather:search":3,"i-feather:x":8,"i-feather:moon":10,"i-feather:sun":12,"i-lucide:house-heart":14,"i-fa-brands:youtube":16,"i-fa-brands:twitch":20,"i-fa-brands:github":22,"i-fa-brands:linkedin":25,"i-fa-brands:stack-overflow":28,"i-simple-icons:bluesky":31,"i-fa-brands:mastodon":33,"i-fa-regular:envelope":35,"i-fa-solid:rss":37,"post-\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F":39,"post-navigation":494,"i-fa-solid:share-alt":868,"i-fa-brands:facebook":870,"i-fa-brands:twitter":872,"i-fa-brands:reddit":874,"i-fa-brands:patreon":876,"i-simple-icons:buymeacoffee":878,"i-fa-brands:paypal":880,"i-fa-regular:question-circle":882,"i-feather:arrow-left":884,"i-feather:arrow-right":886},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003Cpath d=\"m21 21l-4.35-4.35\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"5\"\u002F>\u003Cpath d=\"M12 1v2m0 18v2M4.22 4.22l1.42 1.42m12.72 12.72l1.42 1.42M1 12h2m18 0h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8.62 13.8A2.25 2.25 0 1 1 12 10.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z\"\u002F>\u003Cpath d=\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":17,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":19},576,512,"\u003Cpath fill=\"currentColor\" d=\"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597c-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821c11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cpath fill=\"currentColor\" d=\"M391.17 103.47h-38.63v109.7h38.63ZM285 103h-38.63v109.75H285ZM120.83 0L24.31 91.42v329.16h115.83V512l96.53-91.42h77.25L487.69 256V0Zm328.24 237.75l-77.22 73.12h-77.24l-67.6 64v-64h-86.87V36.58h308.93Z\"\u002F>",{"left":4,"top":4,"width":23,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":24},496,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":27},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":29,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":30},384,"\u003Cpath fill=\"currentColor\" d=\"M290.7 311L95 269.7L86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8l153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24l119.3 160.3l32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":32},"\u003Cpath fill=\"currentColor\" d=\"M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":34},"\u003Cpath fill=\"currentColor\" d=\"M433 179.11c0-97.2-63.71-125.7-63.71-125.7c-62.52-28.7-228.56-28.4-290.48 0c0 0-63.72 28.5-63.72 125.7c0 115.7-6.6 259.4 105.63 289.1c40.51 10.7 75.32 13 103.33 11.4c50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7c56.12-6.7 105-41.3 111.23-72.9c9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175c25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5l11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1c23.71 27.3 18.4 53 18.4 175z\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":36},"\u003Cpath fill=\"currentColor\" d=\"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48m0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49c-16.841 13.247-50.201 45.072-73.413 44.701c-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646c21.857 17.205 60.134 55.186 103.062 54.955c42.717.231 80.509-37.199 103.053-54.947c49.528-38.783 82.032-64.401 104.947-82.653V400z\"\u002F>",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":38},"\u003Cpath fill=\"currentColor\" d=\"M128.081 415.959c0 35.369-28.672 64.041-64.041 64.041S0 451.328 0 415.959s28.672-64.041 64.041-64.041s64.04 28.673 64.04 64.041m175.66 47.25c-8.354-154.6-132.185-278.587-286.95-286.95C7.656 175.765 0 183.105 0 192.253v48.069c0 8.415 6.49 15.472 14.887 16.018c111.832 7.284 201.473 96.702 208.772 208.772c.547 8.397 7.604 14.887 16.018 14.887h48.069c9.149.001 16.489-7.655 15.995-16.79m144.249.288C439.596 229.677 251.465 40.445 16.503 32.01C7.473 31.686 0 38.981 0 48.016v48.068c0 8.625 6.835 15.645 15.453 15.999c191.179 7.839 344.627 161.316 352.465 352.465c.353 8.618 7.373 15.453 15.999 15.453h48.068c9.034-.001 16.329-7.474 16.005-16.504\"\u002F>",{"id":40,"title":41,"author":42,"body":43,"comments":292,"date":468,"dateModified":469,"description":470,"extension":471,"headings":472,"heroImage":478,"meta":479,"path":55,"permalink":55,"published":480,"stem":481,"tags":482,"timeToRead":493},"posts\u002Fposts\u002F2016\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002Findex.md","Subresource Integrity TagHelper Using ASP.NET Core - Part 1","Muhammad Rehan Saeed",{"type":44,"value":45,"toc":289},"minimark",[46,62,85,89,97,104,107,128,137,148,151,154,157,187,196,207,210,213,216,245,251,262,265,285],[47,48,49,56],"ol",{},[50,51,52],"li",{},[53,54,41],"a",{"href":55},"\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002F",[50,57,58],{},[53,59,61],{"href":60},"\u002Fsubresource-integrity-taghelper-using-asp-net-core-part-2\u002F","Subresource Integrity TagHelper Using ASP.NET Core - Part 2",[63,64,66,84],"h1",{"id":65},"what-is-subresource-integrity-sri",[53,67,70],{"href":68,"aria-hidden":69},"#what-is-subresource-integrity-sri","true",[71,72,78],"svg",{"xmlns":73,"xmlns:xlink":74,"viewBox":75,"version":76,"width":77,"height":77,"aria-hidden":69},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink","0 0 16 16","1.1",22,[79,80],"path",{"fill":81,"fill-rule":82,"d":83},"currentColor","evenodd","M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z","What is Subresource Integrity (SRI)",[86,87,88],"p",{},"Can you trust your CDN provider? What if they get hacked and the copy of jQuery you are using hosted by them has some malicious script added to it? You would have no idea this was happening! This is where Subresource Integrity (SRI) comes in.",[86,90,91,92,96],{},"It works by taking a cryptographic hash of the file hosted on the CDN and adding that to your script or link tags. So in our case if we are using jQuery, we would add an integrity and ",[93,94,95],"code",{},"crossorigin"," attribute to our script tag like so:",[98,99],"pre",{"className":100,"language":101,"meta":102,"style":102,"html":103},"language-html shiki shiki-themes light-plus monokai","html","","\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> src\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"https:\u002F\u002Fajax.googleapis.com\u002Fajax\u002Flibs\u002Fjquery\u002F2.1.3\u002Fjquery.min.js\"\u003C\u002Fspan>\u003Cspan class=\"sfK3G\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">        integrity\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"sha256-ivk71nXhz9nsyFDoYoGf2sbjrR9ddh+XDkCcfZxjvcM=\"\u003C\u002Fspan>\u003Cspan class=\"sfK3G\"> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">        crossorigin\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"anonymous\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[86,105,106],{},"The cryptographic hashing algorithm used can be SHA256, SHA384 or SHA512 at the time of writing. In fact, you can use more than one at a time and browsers will pick the most secure one to check the file against.",[86,108,109,110,119,120,123,124,127],{},"The current official standard ",[53,111,118],{"href":112,"rel":113,"target":117},"http:\u002F\u002Fwww.w3.org\u002FTR\u002FSRI\u002F",[114,115,116],"nofollow","noopener","noreferrer","_blank","document"," states that currently only script or link tags are supported for your JavaScript or CSS. However, it also states that this is likely to be expanded to pretty much any tag with a ",[93,121,122],{},"src"," or ",[93,125,126],{},"href"," attribute such as images, objects etc.",[86,129,130,131,136],{},"Scott Helme has a great ",[53,132,135],{"href":133,"rel":134,"target":117},"https:\u002F\u002Fscotthelme.co.uk\u002Fsubresource-integrity\u002F",[114,115,116],"post"," on the subject which I highly recommend you read (It's where I learned about it).",[63,138,140,147],{"id":139},"the-aspnet-core-tag-helper",[53,141,143],{"href":142,"aria-hidden":69},"#the-aspnet-core-tag-helper",[71,144,145],{"xmlns":73,"xmlns:xlink":74,"viewBox":75,"version":76,"width":77,"height":77,"aria-hidden":69},[79,146],{"fill":81,"fill-rule":82,"d":83},"The ASP.NET Core Tag Helper",[86,149,150],{},"I implemented a tag helper for ASP.NET Core which is as simple to use as this:",[98,152],{"className":100,"language":101,"meta":102,"style":102,"html":153},"\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> asp-subresource-integrity\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"line\">\u003Cspan class=\"snDo4\">        src\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"https:\u002F\u002Fajax.googleapis.com\u002Fajax\u002Flibs\u002Fjquery\u002F2.1.3\u002Fjquery.min.js\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[86,155,156],{},"Don't you love it when security is so easy! I'm a big believer in making security as easy as having a big red button that says 'on' and turning it on by default so people don't have to. It's the only way these things will get used! What is it doing behind the scenes?",[47,158,159,162,165,175,184],{},[50,160,161],{},"Downloads the file from the CDN.",[50,163,164],{},"Calculates a SHA512 hash for the file.",[50,166,167,168,171,172,174],{},"Adds the ",[93,169,170],{},"integrity"," and ",[93,173,95],{}," attributes to the script tag.",[50,176,177,178,183],{},"Adds the SHA512 hash value to the distributed cache (IDistributedCache) built in to ASP.NET Core with no expiry date. If you are using a distributed cache like ",[53,179,182],{"href":180,"rel":181,"target":117},"http:\u002F\u002Fredis.io\u002F",[114,115,116],"Redis"," (Which you should for the pure speed of it) then the hash will be remembered.",[50,185,186],{},"The next time the page loads, the hash is retrieved from the cache, so there is very little performance impact of this tag helper.",[86,188,189,190,192,193,195],{},"There are actually two tag helpers, one supports any tag with a ",[93,191,122],{}," attribute and another supports any tag with a ",[93,194,126],{}," element. This is in preparation for when subresource integrity is opened up to tags other than script and link.",[63,197,199,206],{"id":198},"gotchas",[53,200,202],{"href":201,"aria-hidden":69},"#gotchas",[71,203,204],{"xmlns":73,"xmlns:xlink":74,"viewBox":75,"version":76,"width":77,"height":77,"aria-hidden":69},[79,205],{"fill":81,"fill-rule":82,"d":83},"Gotchas",[86,208,209],{},"In the past, I have often omitted the scheme from the CDN URL like so:",[98,211],{"className":100,"language":101,"meta":102,"style":102,"html":212},"\u003Cspan class=\"line\">\u003Cspan class=\"sNflI\">&lt;\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"snDo4\"> src\u003C\u002Fspan>\u003Cspan class=\"sfK3G\">=\u003C\u002Fspan>\u003Cspan class=\"squEy\">\"\u002F\u002Fajax.googleapis.com\u002Fajax\u002Flibs\u002Fjquery\u002F2.2.0\u002Fjquery.min.js\"\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;&lt;\u002F\u003C\u002Fspan>\u003Cspan class=\"sjbfc\">script\u003C\u002Fspan>\u003Cspan class=\"sNflI\">&gt;\n\u003C\u002Fspan>\u003C\u002Fspan>",[86,214,215],{},"However, I have noticed that Firefox, does not like it when you use SRI and omit the scheme. It stops the file from loading completely. When you think about it, this makes sense. We are trying to confirm that the resource has not been changed, one of the ways to do this is to use HTTPS. It does not make sense to use SRI over HTTP.",[86,217,218,219,222,223,226,227,232,233,238,239,244],{},"The other gotcha I found is that the resource must have the ",[93,220,221],{},"Access-Control-Allow-Origin"," HTTP header. It can be set to ",[93,224,225],{},"*"," or your individual domain name. Now, I have been using CDN resources provided by ",[53,228,231],{"href":229,"rel":230,"target":117},"http:\u002F\u002Fajax.googleapis.com",[114,115,116],"Google"," (for jQuery), ",[53,234,237],{"href":235,"rel":236,"target":117},"http:\u002F\u002Fwww.asp.net\u002Fajax\u002Fcdn",[114,115,116],"Microsoft"," (for Bootstrap, jQuery Validation etc.) and ",[53,240,243],{"href":241,"rel":242,"target":117},"https:\u002F\u002Fwww.maxcdn.com\u002F",[114,115,116],"MaxCDN"," (for Font Awesome) because they are free, most browsers have probably already got a copy of the files from there and because they have very fast global exit nodes.",[86,246,247,248,250],{},"However, I have discovered that all provide the ",[93,249,221],{}," HTTP header except Microsoft on some of their resources. Strangely, they return the header for Bootstrap but not for the jQuery Validation scripts. I have reached out to them through my capacity as an MVP and hope to get the issue solved. In the mean time, if you are using Microsoft's CDN you can switch to another CDN or wait for them to fix the issue.",[63,252,254,261],{"id":253},"where-can-i-get-it",[53,255,257],{"href":256,"aria-hidden":69},"#where-can-i-get-it",[71,258,259],{"xmlns":73,"xmlns:xlink":74,"viewBox":75,"version":76,"width":77,"height":77,"aria-hidden":69},[79,260],{"fill":81,"fill-rule":82,"d":83},"Where Can I Get It?",[86,263,264],{},"This tag helper is available in a few ways:",[47,266,267,276],{},[50,268,269,270,275],{},"The ",[53,271,274],{"href":272,"rel":273,"target":117},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FBoxed.AspNetCore.TagHelpers\u002F",[114,115,116],".NET Boxed Boxed.AspNetCore.TagHelpers"," NuGet package.",[50,277,278,279,284],{},"Check out source code in the ",[53,280,283],{"href":281,"rel":282,"target":117},"https:\u002F\u002Fgithub.com\u002FDotnet-Boxed\u002FFramework",[114,115,116],".NET Boxed Framework"," GitHub repository.",[286,287,288],"style",{},"html pre.shiki code .sNflI, html code.shiki .sNflI{--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .sjbfc, html code.shiki .sjbfc{--shiki-default:#800000;--shiki-dark:#F92672}html pre.shiki code .snDo4, html code.shiki .snDo4{--shiki-default:#E50000;--shiki-dark:#A6E22E}html pre.shiki code .sfK3G, html code.shiki .sfK3G{--shiki-default:#000000FF;--shiki-dark:#F8F8F2}html pre.shiki code .squEy, html code.shiki .squEy{--shiki-default:#0000FF;--shiki-dark:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":102,"searchDepth":290,"depth":290,"links":291},2,[],{"issue":293,"comments":297},{"number":294,"title":295,"html_url":296},119,"[Comment] Subresource Integrity TagHelper Using ASP.NET Core - Part 1","https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119",[298,311,320,328,336,344,352,360,368,376,384,392,400,408,416,424,432,440,448,460],{"id":299,"html_url":300,"body_html":301,"created_at":302,"updated_at":303,"author_association":304,"user":305,"reactions":309},627277125,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277125","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ff2a16f4e307f3d346077275531c251cc3732ac4351fec03b017a6e8627b756ca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61666530323738626538656534666436346464633865363038383063386562353f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Founder\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Ff2a16f4e307f3d346077275531c251cc3732ac4351fec03b017a6e8627b756ca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f61666530323738626538656534666436346464633865363038383063386562353f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>Founder\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-06 21:25:19\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>It isn't just CDN's that get hacked. My mobile ISP (optus) had their dns hijacked, which served a hacked version of \u003Ccode>ga.js\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fforums.whirlpool.net.au\u002Farchive\u002F2479474\">http:\u002F\u002Fforums.whirlpool.net.au\u002Farchive\u002F2479474\u003C\u002Fa>\u003C\u002Fp>","2020-05-12T11:15:50Z","2020-05-12T11:37:29Z","OWNER",{"login":306,"avatar_url":307,"html_url":308},"RehanSaeed","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2270364?v=4","https:\u002F\u002Fgithub.com\u002FRehanSaeed",{"url":310,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277125\u002Freactions",{"id":312,"html_url":313,"body_html":314,"created_at":315,"updated_at":316,"author_association":304,"user":317,"reactions":318},627277186,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277186","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-07 08:55:43\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>It isn't just CDN's that get hacked. My mobile ISP (optus) had their dns hijacked, which served a hacked version of \u003Ccode>ga.js\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fforums.whirlpool.net.au\u002Farchive\u002F2479474\">http:\u002F\u002Fforums.whirlpool.net.au\u002Farchive\u002F2479474\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>That's a great example Justin! It's not just ISP's getting hacked though. Sometimes the ISP's are the ones deliberately doing the hacking in authoritarian regimes. In those cases, Content Security Policy (CSP) saves the day in most cases. Security is all about layers, the more layers you have the safer you will be and Subresource Integrity (SRI) is just one layer in the cake.\u003C\u002Fp>","2020-05-12T11:15:57Z","2020-05-12T11:37:36Z",{"login":306,"avatar_url":307,"html_url":308},{"url":319,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277186\u002Freactions",{"id":321,"html_url":322,"body_html":323,"created_at":324,"updated_at":324,"author_association":304,"user":325,"reactions":326},627277234,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277234","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-08 05:30:36\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>You can confirm the presence of SRI hashes on your website with: \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fsritest.io\u002F\">https:\u002F\u002Fsritest.io\u003C\u002Fa>\u003Cbr \u002F>\nDisclaimer: I am the developer of this service\u003C\u002Fp>","2020-05-12T11:16:03Z",{"login":306,"avatar_url":307,"html_url":308},{"url":327,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277234\u002Freactions",{"id":329,"html_url":330,"body_html":331,"created_at":332,"updated_at":332,"author_association":304,"user":333,"reactions":334},627277277,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277277","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-08 07:33:57\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>You can confirm the presence of SRI hashes on your website with: \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fsritest.io\u002F\">https:\u002F\u002Fsritest.io\u003C\u002Fa>\u003Cbr \u002F>\nDisclaimer: I am the developer of this service\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Cool service. Does it check that the URL has a scheme? Firefox has different behaviour when it doesn't. How would you feel about me recommending your service to check SRI's?\u003C\u002Fp>","2020-05-12T11:16:10Z",{"login":306,"avatar_url":307,"html_url":308},{"url":335,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277277\u002Freactions",{"id":337,"html_url":338,"body_html":339,"created_at":340,"updated_at":340,"author_association":304,"user":341,"reactions":342},627277316,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277316","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-08 11:58:10\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Cool service. Does it check that the URL has a scheme? Firefox has different behaviour when it doesn't. How would you feel about me recommending your service to check SRI's?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Sritest.io works with \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> as well \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> as URLs. Does Firefox check SRI differently depending on the URL scheme?\u003Cbr \u002F>\nI would be happy if you wrote something about the service.\u003C\u002Fp>","2020-05-12T11:16:17Z",{"login":306,"avatar_url":307,"html_url":308},{"url":343,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277316\u002Freactions",{"id":345,"html_url":346,"body_html":347,"created_at":348,"updated_at":348,"author_association":304,"user":349,"reactions":350},627277361,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277361","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-08 12:07:42\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Sritest.io works with http:\u002F\u002F as well https:\u002F\u002F as URLs. Does Firefox check SRI differently depending on the URL scheme?\u003Cbr \u002F>\nI would be happy if you wrote something about the service.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>In my testing having no scheme e.g. \u003Ccode>\u002F\u002Ffoo.cdn\u002Fjquery\u003C\u002Fcode> caused an error in Firefox which stopped the resource loading completely, so perhaps your service should raise a warning\u002Ferror for this. I did not try \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> in my testing but I would suggest that your service raises a warning\u002Ferror in this case also, because having a secure connection will act as an added protection.\u003C\u002Fp>","2020-05-12T11:16:24Z",{"login":306,"avatar_url":307,"html_url":308},{"url":351,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277361\u002Freactions",{"id":353,"html_url":354,"body_html":355,"created_at":356,"updated_at":356,"author_association":304,"user":357,"reactions":358},627277410,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277410","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-08 12:09:24\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>In my testing having no scheme e.g. \u003Ccode>\u002F\u002Ffoo.cdn\u002Fjquery\u003C\u002Fcode> caused an error in Firefox which stopped the resource loading completely, so perhaps your service should raise a warning\u002Ferror for this. I did not try \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> in my testing but I would suggest that your service raises a warning\u002Ferror in this case also, because having a secure connection will act as an added protection.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Hmmm interesting, I was not aware. I will look into that.\u003C\u002Fp>","2020-05-12T11:16:30Z",{"login":306,"avatar_url":307,"html_url":308},{"url":359,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277410\u002Freactions",{"id":361,"html_url":362,"body_html":363,"created_at":364,"updated_at":364,"author_association":304,"user":365,"reactions":366},627277459,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277459","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-10 00:27:49\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>In my testing having no scheme e.g. \u003Ccode>\u002F\u002Ffoo.cdn\u002Fjquery\u003C\u002Fcode> caused an error in Firefox which stopped the resource loading completely, so perhaps your service should raise a warning\u002Ferror for this. I did not try \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> in my testing but I would suggest that your service raises a warning\u002Ferror in this case also, because having a secure connection will act as an added protection.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I created a test html file with \u003Ccode>\u002F\u002F\u003C\u002Fcode> as the URL scheme, and Firefox loaded the page without errors.\u003Cbr \u002F>\nCould you please have a look and take me a screenshot perhaps? The file is hosted on \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\">http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\u003C\u002Fa> and \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\">https:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\u003C\u002Fa> I am running Firefox 44.0.2\u003C\u002Fp>","2020-05-12T11:16:37Z",{"login":306,"avatar_url":307,"html_url":308},{"url":367,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277459\u002Freactions",{"id":369,"html_url":370,"body_html":371,"created_at":372,"updated_at":372,"author_association":304,"user":373,"reactions":374},627277513,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277513","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-10 09:19:47\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>I created a test html file with \u003Ccode>\u002F\u002F\u003C\u002Fcode> as the URL scheme, and Firefox loaded the page without errors.\u003Cbr \u002F>\nCould you please have a look and take me a screenshot perhaps? The file is hosted on \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\">http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\u003C\u002Fa> and \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\">https:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\u003C\u002Fa> I am running Firefox 44.0.2\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>When navigating to \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\">http:\u002F\u002Fwww.himalaya-taska.hu\u002Fsritest.html\u003C\u002Fa>, I get the following warning and then error in Firefox 44.0.2:\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Warning: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at \u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fmaxcdn.bootstrapcdn.com\u002Fbootstrap\u002F3.3.6\u002Fjs\u002Fbootstrap.min.js\">http:\u002F\u002Fmaxcdn.bootstrapcdn.com\u002Fbootstrap\u002F3.3.6\u002Fjs\u002Fbootstrap.min.js\u003C\u002Fa>. (Reason: CORS header 'Access-Control-Allow-Origin' missing).\u003Cbr \u002F>\nError: None of the \"sha384\" hashes in the integrity attribute match the content of the subresource.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Perhaps this is one of my extensions causing the error. I'm using UBlock Origin, Ghostery and HTTPS-Everywhere because I'm paranoid and don't like advertisements.\u003C\u002Fp>","2020-05-12T11:16:44Z",{"login":306,"avatar_url":307,"html_url":308},{"url":375,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277513\u002Freactions",{"id":377,"html_url":378,"body_html":379,"created_at":380,"updated_at":380,"author_association":304,"user":381,"reactions":382},627277569,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277569","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F24a5a36d69df6eb4c03b0750646ee5f7e4396919117b558cfc3724d7589b4e76\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31336561643130333536633839336165616434326265393162356364636330313f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Duncan\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F24a5a36d69df6eb4c03b0750646ee5f7e4396919117b558cfc3724d7589b4e76\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31336561643130333536633839336165616434326265393162356364636330313f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fblog.dotsmart.net\u002F\">Duncan\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 07:48:03\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>If the CDN gets hacked then ... won't this then start serving up  hashes for the hacked content?\u003C\u002Fp>","2020-05-12T11:16:51Z",{"login":306,"avatar_url":307,"html_url":308},{"url":383,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277569\u002Freactions",{"id":385,"html_url":386,"body_html":387,"created_at":388,"updated_at":388,"author_association":304,"user":389,"reactions":390},627277618,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277618","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 08:30:29\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>In my testing having no scheme e.g. \u003Ccode>\u002F\u002Ffoo.cdn\u002Fjquery\u003C\u002Fcode> caused an error in Firefox which stopped the resource loading completely, so perhaps your service should raise a warning\u002Ferror for this. I did not try \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> in my testing but I would suggest that your service raises a warning\u002Ferror in this case also, because having a secure connection will act as an added protection.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Possibly it is the extensions, I also had similar issues with them earlier.\u003C\u002Fp>","2020-05-12T11:16:57Z",{"login":306,"avatar_url":307,"html_url":308},{"url":391,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277618\u002Freactions",{"id":393,"html_url":394,"body_html":395,"created_at":396,"updated_at":396,"author_association":304,"user":397,"reactions":398},627277671,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277671","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 08:43:36\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Possibly it is the extensions, I also had similar issues with them earlier.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Yes, I think so too. I think it's safer to add https at the start. Perhaps your site could raise a warning about this?\u003C\u002Fp>","2020-05-12T11:17:04Z",{"login":306,"avatar_url":307,"html_url":308},{"url":399,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277671\u002Freactions",{"id":401,"html_url":402,"body_html":403,"created_at":404,"updated_at":404,"author_association":304,"user":405,"reactions":406},627277718,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277718","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 08:44:52\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>If the CDN gets hacked then ... won't this then start serving up  hashes for the hacked content?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>My initial thinking was that you could check the files at deployment time when the tag helper first runs. Then the tag helper would have calculated the hash and cached it without any expiration time, so you are good from then on. That's still more secure than 'every site on the internet' as Jon Galloway put it in the ASP.NET standup.\u003C\u002Fp>\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FDotnet-Boxed\u002FTemplates\u002Fissues\u002F79\">Here\u003C\u002Fa> is a link to a discussion about a further improvement to this tag helper which I plan to release this weekend.\u003C\u002Fp>","2020-05-12T11:17:11Z",{"login":306,"avatar_url":307,"html_url":308},{"url":407,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277718\u002Freactions",{"id":409,"html_url":410,"body_html":411,"created_at":412,"updated_at":412,"author_association":304,"user":413,"reactions":414},627277784,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277784","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Gabor Szathmari\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002Fc049d4f4bbd6220f56f26892d3f725e8ef5a1b1e9797b9d44a5ab8b5241d2cda\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f34333765653362666263346439343361343965336230393836316339376539613f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fblog.gaborszathmari.me\u002F\">Gabor Szathmari\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 08:49:01\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>In my testing having no scheme e.g. \u002F\u002Ffoo.cdn\u002Fjquery caused an error in Firefox which stopped the resource loading completely, so perhaps your service should raise a warning\u002Ferror for this. I did not try http:\u002F\u002F in my testing but I would suggest that your service raises a warning\u002Ferror in this case also, because having a secure connection will act as an added protection.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I will have a look, I appreciate your feedback.\u003C\u002Fp>","2020-05-12T11:17:18Z",{"login":306,"avatar_url":307,"html_url":308},{"url":415,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277784\u002Freactions",{"id":417,"html_url":418,"body_html":419,"created_at":420,"updated_at":420,"author_association":304,"user":421,"reactions":422},627277834,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277834","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F834fa8981bdad49516704e44e1e96e6c582354d839cfa8ec40c591c833ccc4d1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30303030303030303030303030303030303030303030303030303030303030303f733d393626643d6d6d26723d67\">\u003Cimg alt=\"The Morning Brew - Chris Alcock » The Morning Brew #2050\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F834fa8981bdad49516704e44e1e96e6c582354d839cfa8ec40c591c833ccc4d1\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f30303030303030303030303030303030303030303030303030303030303030303f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fblog.cwa.me.uk\u002F2016\u002F03\u002F11\u002Fthe-morning-brew-2050\u002F\">The Morning Brew - Chris Alcock » The Morning Brew #2050\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 09:36:12\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>[…] Subresource Integrity TagHelper Using ASP.NET Core  - Muhammad Rehan Saeed […]\u003C\u002Fp>","2020-05-12T11:17:25Z",{"login":306,"avatar_url":307,"html_url":308},{"url":423,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277834\u002Freactions",{"id":425,"html_url":426,"body_html":427,"created_at":428,"updated_at":428,"author_association":304,"user":429,"reactions":430},627277892,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277892","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F24a5a36d69df6eb4c03b0750646ee5f7e4396919117b558cfc3724d7589b4e76\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31336561643130333536633839336165616434326265393162356364636330313f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Duncan\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F24a5a36d69df6eb4c03b0750646ee5f7e4396919117b558cfc3724d7589b4e76\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f31336561643130333536633839336165616434326265393162356364636330313f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"http:\u002F\u002Fblog.dotsmart.net\u002F\">Duncan\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2016-03-11 09:44:06\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>My initial thinking was that you could check the files at deployment time when the tag helper first runs. Then the tag helper would have calculated the hash and cached it without any expiration time, so you are good from then on. That's still more secure than 'every site on the internet' as Jon Galloway put it in the ASP.NET standup.\u003C\u002Fp>\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FDotnet-Boxed\u002FTemplates\u002Fissues\u002F79\">Here\u003C\u002Fa> is a link to a discussion about a further improvement to this tag helper which I plan to release this weekend.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>I think it's a build-time concern. Possibly have a build step that calculates the SHAs and writes them to a known file location then the tag helper looks for them first before falling back to calculating on the fly.\u003C\u002Fp>","2020-05-12T11:17:32Z",{"login":306,"avatar_url":307,"html_url":308},{"url":431,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277892\u002Freactions",{"id":433,"html_url":434,"body_html":435,"created_at":436,"updated_at":436,"author_association":304,"user":437,"reactions":438},627277940,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277940","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8dacc9a34512734f400955bfa7dd469189374ec245c5fc81d2b8869b6b1b7d2a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39643061343564643932656363326362313563646263356638306265666231353f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Chris Pratt\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8dacc9a34512734f400955bfa7dd469189374ec245c5fc81d2b8869b6b1b7d2a\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f39643061343564643932656363326362313563646263356638306265666231353f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Fcpratt.co\u002F\">Chris Pratt\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2018-08-27 17:05:46\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>If the CDN gets hacked then ... won't this then start serving up  hashes for the hacked content?\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Duncan makes a good point. Potentially, you could allow hacked resources in this way. However, given that the SRI hash is cached indefinitely, and assuming you're using a reasonably persistent cache store (basically anything other than in-memory), the odds that the hash would be calculated at the exact point that the resource was compromised (which itself is a pretty wild occurrence, if you're using one of the big global CDNs) are pretty high. It's important to be aware of, but I doubt it would actually be a true security concern.\u003C\u002Fp>\n\u003Cp>That said, this method could probably be improved by comparing to a local copy of the resource. ASP.NET Core already has functionality for providing fallback local scripts, should CDN resources fail. This same fallback could be used to compare with the remote version and a mismatch could be either logged or raised as an exception.\u003C\u002Fp>","2020-05-12T11:17:39Z",{"login":306,"avatar_url":307,"html_url":308},{"url":439,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277940\u002Freactions",{"id":441,"html_url":442,"body_html":443,"created_at":444,"updated_at":444,"author_association":304,"user":445,"reactions":446},627277994,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-627277994","\n\u003Cp>\u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\">\u003Cimg alt=\"Muhammad Rehan Saeed\" height=\"40\" width=\"40\" src=\"https:\u002F\u002Fcamo.githubusercontent.com\u002F8a07049df41b8a3839a3f4342f09ea8e6e7fa0065667687f04beca2d088a1dca\u002F68747470733a2f2f7777772e67726176617461722e636f6d2f6176617461722f32623266393030653361633066353535316462646537323864336262343935343f733d393626643d6d6d26723d67\" \u002F>\u003C\u002Fa> \u003Cstrong>\u003Ca rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\u002F\u002Frehansaeed.com\u002F\">Muhammad Rehan Saeed\u003C\u002Fa>\u003C\u002Fstrong> commented on \u003Cstrong>2018-08-28 09:24:54\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Duncan makes a good point. Potentially, you could allow hacked resources in this way. However, given that the SRI hash is cached indefinitely, and assuming you're using a reasonably persistent cache store (basically anything other than in-memory), the odds that the hash would be calculated at the exact point that the resource was compromised (which itself is a pretty wild occurrence, if you're using one of the big global CDNs) are pretty high. It's important to be aware of, but I doubt it would actually be a true security concern.\u003C\u002Fp>\n\u003Cp>That said, this method could probably be improved by comparing to a local copy of the resource. ASP.NET Core already has functionality for providing fallback local scripts, should CDN resources fail. This same fallback could be used to compare with the remote version and a mismatch could be either logged or raised as an exception.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>Take a look at part 2 of this post. That basically does what you suggest.\u003C\u002Fp>","2020-05-12T11:17:46Z",{"login":306,"avatar_url":307,"html_url":308},{"url":447,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F627277994\u002Freactions",{"id":449,"html_url":450,"body_html":451,"created_at":452,"updated_at":452,"author_association":453,"user":454,"reactions":458},1127269349,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-1127269349","\u003Cp>Hi  \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FRehanSaeed\">@RehanSaeed\u003C\u002Fa> ,\u003Cbr \u002F>\nUnable to resolve service for type 'Microsoft.AspNetCore.Mvc.Infrastructure.IActionContextAccessor' while attempting to activate 'Boxed.AspNetCore.TagHelpers.SrcSubresourceIntegrityTagHelper'.\u003C\u002Fp>\n\u003Cp>I'm getting the below exception while using the tag helper in asp.net core application\u003Cbr \u002F>\nCan any one help??\u003C\u002Fp>","2022-05-16T06:27:11Z","NONE",{"login":455,"avatar_url":456,"html_url":457},"samthrusha123","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F44087954?v=4","https:\u002F\u002Fgithub.com\u002Fsamthrusha123",{"url":459,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F1127269349\u002Freactions",{"id":461,"html_url":462,"body_html":463,"created_at":464,"updated_at":464,"author_association":304,"user":465,"reactions":466},1131854132,"https:\u002F\u002Fgithub.com\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002F119#issuecomment-1131854132","\u003Cblockquote>\n\u003Cp>Hi \u003Ca target=\"_blank\" rel=\"nofollow noopener noreferrer\" href=\"https:\u002F\u002Fgithub.com\u002FRehanSaeed\">@RehanSaeed\u003C\u002Fa> , Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.Infrastructure.IActionContextAccessor' while attempting to activate 'Boxed.AspNetCore.TagHelpers.SrcSubresourceIntegrityTagHelper'.\u003C\u002Fp>\n\u003Cp>I'm getting the below exception while using the tag helper in asp.net core application Can any one help??\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You need to register \u003Ccode>IActionContextAccessor\u003C\u002Fcode> like so:\u003C\u002Fp>\n\u003Cdiv>\u003Cpre>\u003Cspan>services\u003C\u002Fspan>\u003Cspan>.\u003C\u002Fspan>\u003Cspan>AddSingleton\u003C\u002Fspan>\u003Cspan>&lt;\u003C\u002Fspan>\u003Cspan>IActionContextAccessor\u003C\u002Fspan>\u003Cspan>,\u003C\u002Fspan> \u003Cspan>ActionContextAccessor\u003C\u002Fspan>\u003Cspan>&gt;\u003C\u002Fspan>\u003Cspan>(\u003C\u002Fspan>\u003Cspan>)\u003C\u002Fspan>\u003Cspan>;\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>","2022-05-19T15:14:04Z",{"login":306,"avatar_url":307,"html_url":308},{"url":467,"total_count":4,"+1":4,"-1":4,"laugh":4,"hooray":4,"confused":4,"heart":4,"rocket":4,"eyes":4},"https:\u002F\u002Fapi.github.com\u002Frepos\u002FRehanSaeed\u002Frehansaeed.github.io\u002Fissues\u002Fcomments\u002F1131854132\u002Freactions","2016-03-06T00:00:00+00:00",null,"Use an ASP.NET Core TagHelper to implement Subresource Integrity (SRI) to ensure that external resources have not been tampered with.","md",[473,475,476,477],{"depth":474,"value":84},1,{"depth":474,"value":147},{"depth":474,"value":206},{"depth":474,"value":261},"\u002Fimages\u002Fhero\u002FMake-Security-Easy-1366x768.png",{},true,"posts\u002F2016\u002Fsubresource-integrity-taghelper-using-asp-net-core\u002Findex",[483,484,485,486,487,488,489,490,491,492],".NET","ASP.NET Core","ASP.NET MVC",".NET Boxed","C#","Content Delivery Network (CDN)","Cryptography","NWebSec","Security","Subresource Integrity (SRI)",3,[495,499,503,507,512,515,518,522,526,530,533,537,542,545,548,552,556,560,563,567,571,575,578,583,588,592,595,598,601,606,610,613,618,622,626,630,633,637,641,645,649,653,657,658,659,663,667,671,675,678,682,686,689,692,696,700,705,709,713,717,721,725,729,732,735,738,742,746,749,752,755,758,761,764,768,772,775,778,782,786,789,792,795,799,803,807,811,814,817,822,825,828,832,835,839,843,846,850,853,856,860,864],{"title":496,"permalink":497,"heroImage":498,"timeToRead":474},"Just Start - The First Blog Post","\u002Fjust-start-the-first-blog-post\u002F","\u002Fimages\u002Fhero\u002FJust-Start-1366x768.png",{"title":500,"permalink":501,"heroImage":502,"timeToRead":290},"ConfigureAwait in Task Parallel Library (TPL)","\u002Fconfigureawait-task-parallel-library\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-.NET-1366x768.png",{"title":504,"permalink":505,"heroImage":506,"timeToRead":493},"Stop The Brace Wars, Use StyleCop","\u002Fstop-brace-wars-use-stylecop\u002F","\u002Fimages\u002Fhero\u002FStyleCop-1366x768.png",{"title":508,"permalink":509,"heroImage":510,"timeToRead":511},"Reactive Extensions (Rx) - Part 1 - Replacing C# Events","\u002Freactive-extensions-part1-replacing-events\u002F","\u002Fimages\u002Fhero\u002FReactive-Extensions-1366x768.png",4,{"title":513,"permalink":514,"heroImage":510,"timeToRead":493},"Reactive Extensions (Rx) - Part 2 - Wrapping C# Events","\u002Freactive-extensions-part2-wrapping-events\u002F",{"title":516,"permalink":517,"heroImage":510,"timeToRead":290},"Reactive Extensions (Rx) - Part 3 - Naming Conventions","\u002Freactive-extensions-part3-naming-conventions\u002F",{"title":519,"permalink":520,"heroImage":521,"timeToRead":493},"WPF Metro Part 1 - Modern UI for WPF","\u002Fwpf-metro-part1-modern-ui-for-wpf\u002F","\u002Fimages\u002Fhero\u002FModern-UI-for-WPF-1366x768.png",{"title":523,"permalink":524,"heroImage":525,"timeToRead":493},"WPF Metro Part 2 - MahApps Metro","\u002Fwpf-metro-part2-mahapps-metro\u002F","\u002Fimages\u002Fhero\u002FMahApps-Metro-1366x768.png",{"title":527,"permalink":528,"heroImage":529,"timeToRead":493},"Windows 8.1 TouchScreen Gaming Laptops","\u002Fwindows-8-touchscreen-gaming-laptops\u002F","\u002Fimages\u002Fhero\u002FFry-Shutup-And-Take-My-Money-1366x768.png",{"title":531,"permalink":532,"heroImage":510,"timeToRead":493},"Reactive Extensions (Rx) - Part 4 - Replacing Timers","\u002Freactive-extensions-part4-replacing-timers\u002F",{"title":534,"permalink":535,"heroImage":536,"timeToRead":290},"WPF Metro Part 3 - Elysium","\u002Fwpf-metro-part3-elysium\u002F","\u002Fimages\u002Fhero\u002FElysium-1366x768.png",{"title":538,"permalink":539,"heroImage":540,"timeToRead":541},"WPF Metro Part 4 - Elysium Extra","\u002Fwpf-metro-part4-elysium-extra\u002F","\u002Fimages\u002Fhero\u002FElysium-Extra-1366x768.png",8,{"title":543,"permalink":544,"heroImage":510,"timeToRead":511},"Reactive Extensions (Rx) - Part 5 - Awaiting Observables","\u002Freactive-extensions-part5-awaiting-observables\u002F",{"title":546,"permalink":547,"heroImage":502,"timeToRead":541},"GetHashCode Made Easy","\u002Fgethashcode-made-easy\u002F",{"title":549,"permalink":550,"heroImage":510,"timeToRead":551},"Reactive Extensions (Rx) - Part 6 - Task ToObservable","\u002Freactive-extensions-part6-task-toobservable\u002F",5,{"title":553,"permalink":554,"heroImage":555,"timeToRead":474},"Portable Class Library (PCL) version of NotificationsExtensions NuGet package","\u002Fportable-class-library-version-of-notificationsextensions-nuget-package\u002F","\u002Fimages\u002Fhero\u002FNuGet-1366x768.png",{"title":557,"permalink":558,"heroImage":559,"timeToRead":551},"Model-View-ViewModel (MVVM) - Part 1 - Overview","\u002Fmodel-view-viewmodel-mvvm-part1-overview\u002F","\u002Fimages\u002Fhero\u002FMVVM-1366x768.png",{"title":561,"permalink":562,"heroImage":559,"timeToRead":511},"Model-View-ViewModel (MVVM) - Part 2 - IDisposable","\u002Fmodel-view-viewmodel-mvvm-part2-idisposable\u002F",{"title":564,"permalink":565,"heroImage":559,"timeToRead":566},"Model-View-ViewModel (MVVM) - Part 3 - INotifyPropertyChanged","\u002Fmodel-view-viewmodel-mvvm-part3-inotifypropertychanged\u002F",11,{"title":568,"permalink":569,"heroImage":570,"timeToRead":493},"Naming Conventions","\u002Fnaming-conventions\u002F","\u002Fimages\u002Fhero\u002FNaming-Conventions-1366x768.png",{"title":572,"permalink":573,"heroImage":559,"timeToRead":574},"Model-View-ViewModel (MVVM) - Part 4 - INotifyDataErrorInfo","\u002Fmodel-view-viewmodel-mvvm-part4-inotifydataerrorinfo\u002F",12,{"title":576,"permalink":577,"heroImage":540,"timeToRead":511},"Elysium Extra 1.1 Released","\u002Felysium-extra-1-1-released\u002F",{"title":579,"permalink":580,"heroImage":581,"timeToRead":582},"ASP.NET Core Boilerplate","\u002Fasp-net-mvc-boilerplate\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Boilerplate-1366x768.png",7,{"title":584,"permalink":585,"heroImage":586,"timeToRead":587},"Internet Favicon Madness (Updated)","\u002Finternet-favicon-madness\u002F","\u002Fimages\u002Fhero\u002FFavicons-1366x768.png",17,{"title":589,"permalink":590,"heroImage":591,"timeToRead":582},"Custom Visual Studio Project Templates","\u002Fcustom-visual-studio-project-templates\u002F","\u002Fimages\u002Fhero\u002FVisual-Studio-1366x768.png",{"title":593,"permalink":594,"heroImage":591,"timeToRead":493},"Configuration File Transforms In Visual Studio Should Be Built In","\u002Fconfiguration-file-transforms-in-visual-studio-should-be-built-in\u002F",{"title":596,"permalink":597,"heroImage":581,"timeToRead":566},"Securing the ASP.NET MVC Web.config","\u002Fsecuring-the-aspnet-mvc-web-config\u002F",{"title":599,"permalink":600,"heroImage":510,"timeToRead":290},"Reactive Extensions (Rx) - Part 7 - Sample Events","\u002Freactive-extensions-part7-sample-events\u002F",{"title":602,"permalink":603,"heroImage":604,"timeToRead":605},"NWebSec ASP.NET MVC Security Through HTTP Headers","\u002Fnwebsec-asp-net-mvc-security-through-http-headers\u002F","\u002Fimages\u002Fhero\u002FNWebSec-1366x768.png",6,{"title":607,"permalink":608,"heroImage":609,"timeToRead":77},"Content Security Policy (CSP) for ASP.NET MVC","\u002Fcontent-security-policy-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FContent-Security-Policy-CSP-for-ASP.NET-MVC-1366x768.png",{"title":611,"permalink":612,"heroImage":502,"timeToRead":551},"C# 6.0 - Saving Developers From Themselves","\u002Fc-6-0-saving-developers-from-themselves\u002F",{"title":614,"permalink":615,"heroImage":616,"timeToRead":617},"Building RSS\u002FAtom Feeds for ASP.NET MVC","\u002Fbuilding-rssatom-feeds-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRSS-And-Atom-1366x768.png",19,{"title":619,"permalink":620,"heroImage":621,"timeToRead":566},"Canonical URL's for ASP.NET MVC","\u002Fcanonical-urls-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FLink-Juice-1366x768.png",{"title":623,"permalink":624,"heroImage":625,"timeToRead":511},"Dynamically Generating Robots.txt Using ASP.NET MVC","\u002Fdynamically-generating-robots-txt-using-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FRobots.txt-1366x768.jpg",{"title":627,"permalink":628,"heroImage":629,"timeToRead":511},"Minifying HTML for ASP.NET MVC","\u002Fminifying-html-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FThe-Internet-Is-A-Series-Of-Tubes-1366x768.jpg",{"title":631,"permalink":632,"heroImage":581,"timeToRead":290},"Whats New in ASP.NET Core Boilerplate","\u002Fwhats-new-in-asp-net-5-mvc-6-boilerplate\u002F",{"title":634,"permalink":635,"heroImage":636,"timeToRead":582},"Dynamically Generating Sitemap.xml for ASP.NET MVC","\u002Fdynamically-generating-sitemap-xml-for-asp-net-mvc\u002F","\u002Fimages\u002Fhero\u002FSitemaps-1366x768.png",{"title":638,"permalink":639,"heroImage":640,"timeToRead":290},"So I've Been Awarded Microsoft MVP Status!","\u002Fso-ive-been-awarded-microsoft-mvp-status\u002F","\u002Fimages\u002Fhero\u002FMicrosoft-MVP-1366x768.png",{"title":642,"permalink":643,"heroImage":644,"timeToRead":474},".NET Big-O Algorithm Complexity Cheat Sheet","\u002Fnet-big-o-algorithm-complexity-cheat-sheet\u002F","\u002Fimages\u002Fhero\u002FNET-Big-O-Algorithm-Complexity-Cheat-Sheet-1366x768.jpg",{"title":646,"permalink":647,"heroImage":648,"timeToRead":493},"Logging with Serilog.Exceptions","\u002Flogging-with-serilog-exceptions\u002F","\u002Fimages\u002Fhero\u002FSerilog.Exceptions-1366x768.png",{"title":650,"permalink":651,"heroImage":652,"timeToRead":474},"Make Certificate","\u002Fmake-certificate\u002F","\u002Fimages\u002Fhero\u002FMake-Certificate-1366x768.png",{"title":654,"permalink":655,"heroImage":656,"timeToRead":290},"Colorful.Console","\u002Fcolorful-console\u002F","\u002Fimages\u002Fhero\u002FColorful.Console-1366x768.png",{"title":41,"permalink":55,"heroImage":478,"timeToRead":493},{"title":61,"permalink":60,"heroImage":478,"timeToRead":511},{"title":660,"permalink":661,"heroImage":662,"timeToRead":551},"Social TagHelpers for ASP.NET Core","\u002Fsocial-taghelpers-for-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSocial-Media-1366x768.png",{"title":664,"permalink":665,"heroImage":666,"timeToRead":605},"Azure Active Directory Versus Identity Server","\u002Fazure-active-directory-versus-identity-server\u002F","\u002Fimages\u002Fhero\u002FAzure-Active-Directory-Versus-Identity-Server-1366x768.png",{"title":668,"permalink":669,"heroImage":670,"timeToRead":290},"ASP.NET Core Fluent Interface Extensions","\u002Fasp-net-core-fluent-interface-extensions\u002F","\u002Fimages\u002Fhero\u002FFluent-Interface-All-The-Things-1366x768.png",{"title":672,"permalink":673,"heroImage":674,"timeToRead":566},"NGINX for ASP.NET Core In-Depth","\u002Fnginx-asp-net-core-depth\u002F","\u002Fimages\u002Fhero\u002FNGINX-1366x768.png",{"title":676,"permalink":677,"heroImage":502,"timeToRead":290},"The Dotnet Watch Tool","\u002Fthe-dotnet-watch-tool\u002F",{"title":679,"permalink":680,"heroImage":681,"timeToRead":511},"Making Application Insights Fast & Secure","\u002Fmaking-application-insights-fast-and-secure\u002F","\u002Fimages\u002Fhero\u002FApplication-Insights-1366x768.png",{"title":683,"permalink":684,"heroImage":685,"timeToRead":582},"SEO Friendly URL's for ASP.NET Core","\u002Fseo-friendly-urls-asp-net-core\u002F","\u002Fimages\u002Fhero\u002FSearch-Engine-Optimization-SEO-1366x768.png",{"title":687,"permalink":688,"heroImage":510,"timeToRead":474},"Reactive Extensions (Rx) - Part 8 - Timeouts","\u002Freactive-extensions-rx-part-8-timeouts\u002F",{"title":690,"permalink":691,"heroImage":502,"timeToRead":511},"Custom Project Templates Using dotnet new","\u002Fcustom-project-templates-using-dotnet-new\u002F",{"title":693,"permalink":694,"heroImage":695,"timeToRead":541},"Cross-Platform DevOps for .NET Core","\u002Fcross-platform-devops-net-core\u002F","\u002Fimages\u002Fhero\u002FDotnet-Cake-AppVeyor-Travis-1366x768.png",{"title":697,"permalink":698,"heroImage":699,"timeToRead":582},"Cleaning Up CSPROJ","\u002Fcleaning-up-csproj\u002F","\u002Fimages\u002Fhero\u002FCleaning-Up-CSPROJ-1366x768.png",{"title":701,"permalink":702,"heroImage":703,"timeToRead":704},"dotnet new Feature Selection","\u002Fdotnet-new-feature-selection\u002F","\u002Fimages\u002Fhero\u002FWho-Wants-To-Be-A-Millionaire-1366x768.png",9,{"title":706,"permalink":707,"heroImage":708,"timeToRead":511},"ASP.NET Core Lazy Command Pattern","\u002Fasp-net-core-lazy-command-pattern\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Lazy-Command-Pattern-1366x768.png",{"title":710,"permalink":711,"heroImage":712,"timeToRead":290},"Structured Data using Schema.NET","\u002Fstructured-data-using-schema-net\u002F","\u002Fimages\u002Fhero\u002FSchema.NET-1366x768.png",{"title":714,"permalink":715,"heroImage":716,"timeToRead":605},"Keeping Up With Software Development","\u002Fkeeping-software-development\u002F","\u002Fimages\u002Fhero\u002FKeeping-up-with-Software-Development-1366x768.png",{"title":718,"permalink":719,"heroImage":720,"timeToRead":290},"A Very Generic .editorconfig File (Updated)","\u002Fgeneric-editorconfig-file\u002F","\u002Fimages\u002Fhero\u002FA-Very-Generic-Editorconfig-File-1366x768.png",{"title":722,"permalink":723,"heroImage":724,"timeToRead":551},"ASP.NET Core Caching in Practice","\u002Fasp-net-core-caching-in-practice\u002F","\u002Fimages\u002Fhero\u002FASP.NET-Core-Caching-in-Practice-1366x768.png",{"title":726,"permalink":727,"heroImage":728,"timeToRead":474},"Docker Read-Only File Systems","\u002Fdocker-read-file-systems\u002F","\u002Fimages\u002Fhero\u002FDocker-1366x768.png",{"title":730,"permalink":731,"heroImage":728,"timeToRead":493},"Docker Labels in Depth","\u002Fdocker-labels-depth\u002F",{"title":733,"permalink":734,"heroImage":728,"timeToRead":511},"Useful Docker Images - Part 1","\u002Fuseful-docker-images-part1\u002F",{"title":736,"permalink":737,"heroImage":728,"timeToRead":551},"Useful Docker Images - Part 2","\u002Fuseful-docker-images-part2\u002F",{"title":739,"permalink":740,"heroImage":741,"timeToRead":511},"Writing your Webpack configuration in TypeScript","\u002Fwriting-your-webpack-configuration-in-typescript\u002F","\u002Fimages\u002Fhero\u002FTypeScript-1366x768.png",{"title":743,"permalink":744,"heroImage":745,"timeToRead":551},"Writing Code while Asleep","\u002Fwriting-code-asleep\u002F","\u002Fimages\u002Fhero\u002FWhile-Alive-Eat-Sleep-Code-Repeat-1366x768.png",{"title":747,"permalink":748,"heroImage":502,"timeToRead":290},"The Dotnet Watch Tool Revisited","\u002Fthe-dotnet-watch-tool-revisited\u002F",{"title":486,"permalink":750,"heroImage":751,"timeToRead":290},"\u002Fnet-boxed\u002F","\u002Fimages\u002Fhero\u002FDotnet-Boxed-1366x768.png",{"title":753,"permalink":754,"heroImage":502,"timeToRead":290},"Migrating to Entity Framework Core Seed Data","\u002Fmigrating-to-entity-framework-core-seed-data\u002F",{"title":756,"permalink":757,"heroImage":502,"timeToRead":493},"Optimally Configuring Entity Framework Core","\u002Foptimally-configuring-entity-framework-core\u002F",{"title":759,"permalink":760,"heroImage":502,"timeToRead":474},"ASP.NET Core Hidden Gem - QueryHelpers","\u002Fasp-net-core-hidden-gem-queryhelpers\u002F",{"title":762,"permalink":763,"heroImage":502,"timeToRead":704},"Optimally Configuring ASP.NET Core HttpClientFactory","\u002Foptimally-configuring-asp-net-core-httpclientfactory\u002F",{"title":765,"permalink":766,"heroImage":767,"timeToRead":582},"PluralSight vs LinkedIn Learning vs FrontendMasters vs Egghead.io vs YouTube","\u002Fpluralsight-vs-linkedin-learning-vs-frontendmasters-vs-egghead-io-vs-youtube\u002F","\u002Fimages\u002Fhero\u002FOnline-Learning-1366x768.png",{"title":769,"permalink":770,"heroImage":771,"timeToRead":704},"Is ASP.NET Core now a Mature Platform?","\u002Fis-asp-net-core-now-a-mature-platform\u002F","\u002Fimages\u002Fhero\u002FRocket-1366x768.jpg",{"title":773,"permalink":774,"heroImage":751,"timeToRead":704},"A Simple and Fast Object Mapper","\u002Fa-simple-and-fast-object-mapper\u002F",{"title":776,"permalink":777,"heroImage":728,"timeToRead":474},"Securing ASP.NET Core in Docker","\u002Fsecuring-asp-net-core-in-docker\u002F",{"title":779,"permalink":780,"heroImage":781,"timeToRead":511},"Git Cloning the Windows OS Repo","\u002Fgit-cloning-the-windows-os-repo\u002F","\u002Fimages\u002Fhero\u002FWindows-1366x768.png",{"title":783,"permalink":784,"heroImage":785,"timeToRead":582},".gitattributes Best Practices","\u002Fgitattributes-best-practices\u002F","\u002Fimages\u002Fhero\u002FGit-1366x768.png",{"title":787,"permalink":788,"heroImage":502,"timeToRead":493},"Unit Testing dotnet new Templates","\u002Funit-testing-dotnet-new-templates\u002F",{"title":790,"permalink":791,"heroImage":751,"timeToRead":551},"What dotnet new Could Be","\u002Fwhat-dotnet-new-could-be\u002F",{"title":793,"permalink":794,"heroImage":502,"timeToRead":511},"ASP.NET Core Integration Testing & Mocking using Moq","\u002Fasp-net-core-integration-testing-mocking-using-moq\u002F",{"title":796,"permalink":797,"heroImage":798,"timeToRead":582},"Choosing a Static Site Generator","\u002Fchoosing-a-static-site-generator\u002F","\u002Fimages\u002Fhero\u002FStatic-Site-Generators-1600x900.png",{"title":800,"permalink":801,"heroImage":802,"timeToRead":290},"Spicing up your Browser Console","\u002Fspicing-up-your-browser-console\u002F","\u002Fimages\u002Fhero\u002FFiglet-Fonts-1600x900.png",{"title":804,"permalink":805,"heroImage":806,"timeToRead":551},"Racism in Software Development & Beyond","\u002Fracism-in-software-development-and-beyond\u002F","\u002Fimages\u002Fhero\u002FBlack-Glowing-Fist-1600x900.png",{"title":808,"permalink":809,"heroImage":810,"timeToRead":551},"The Easiest Way to Version NuGet Packages","\u002Fthe-easiest-way-to-version-nuget-packages\u002F","\u002Fimages\u002Fhero\u002FSemantic-Versioning-1600x900.png",{"title":812,"permalink":813,"heroImage":555,"timeToRead":605},"The Fastest NuGet Package Ever Published (Probably)","\u002Fthe-fastest-nuget-package-ever-published-probably\u002F",{"title":815,"permalink":816,"heroImage":502,"timeToRead":493},"Automating .NET Security Updates","\u002Fautomating-dotnet-security-updates\u002F",{"title":818,"permalink":819,"heroImage":820,"timeToRead":821},"Deep Dive into Open Telemetry for .NET","\u002Fdeep-dive-into-open-telemetry-for-net\u002F","\u002Fimages\u002Fhero\u002FOpen-Telemetry-1600x900.png",10,{"title":823,"permalink":824,"heroImage":820,"timeToRead":493},"Open Telemetry for ASP.NET Core","\u002Fopen-telemetry-for-asp-net-core\u002F",{"title":826,"permalink":827,"heroImage":820,"timeToRead":493},"Exporting Open Telemetry Data to Jaeger","\u002Fexporting-open-telemetry-data-to-jaeger\u002F",{"title":829,"permalink":830,"heroImage":831,"timeToRead":493},"A System for Grouping & Sorting CSS Properties","\u002Fsystem-for-grouping-and-sorting-css-properties\u002F","\u002Fimages\u002Fhero\u002FCSS-1600x900.png",{"title":833,"permalink":834,"heroImage":831,"timeToRead":605},"CSS General Rules of Thumb","\u002Fcss-general-rules-of-thumb\u002F",{"title":836,"permalink":837,"heroImage":838,"timeToRead":511},"Web Component Custom Element Gotchas","\u002Fweb-component-custom-element-gotchas\u002F","\u002Fimages\u002Fhero\u002FWeb-Components-1600x900.png",{"title":840,"permalink":841,"heroImage":842,"timeToRead":290},"Code Coverage & Frontend Testing","\u002Fcode-coverage-and-frontend-testing\u002F","\u002Fimages\u002Fhero\u002FJest-Cypress-1600x900.png",{"title":844,"permalink":845,"heroImage":591,"timeToRead":474},".NET Boxed Visual Studio Integration","\u002Fdotnet-boxed-visual-studio-integration\u002F",{"title":847,"permalink":848,"heroImage":849,"timeToRead":493},"The Windows Package Manager","\u002Fwindows-package-manager\u002F","\u002Fimages\u002Fhero\u002FWinget-1600x900.png",{"title":851,"permalink":852,"heroImage":502,"timeToRead":493},"The Problem with C# 10 Implicit Usings","\u002Fthe-problem-with-csharp-10-implicit-usings\u002F",{"title":854,"permalink":855,"heroImage":820,"timeToRead":511},"Optimally Configuring Open Telemetry Tracing for ASP.NET Core","\u002Foptimally-configuring-open-telemetry-tracing-for-asp-net-core\u002F",{"title":857,"permalink":858,"heroImage":859,"timeToRead":290},"Live Streaming .NET","\u002Flive-streaming-dotnet\u002F","\u002Fimages\u002Fhero\u002FMy-YouTube-1920x1080.jpg",{"title":861,"permalink":862,"heroImage":863,"timeToRead":290},"I Was Awarded as an Open UK Honouree","\u002Fopen-uk-honouree\u002F","\u002Fimages\u002Fhero\u002FOpen-UK-Honours-1366x768.jpg",{"title":865,"permalink":866,"heroImage":867,"timeToRead":511},"On the Etiquette of Pull Request Comments","\u002Fon-the-etiquette-of-pull-request-comments\u002F","\u002Fimages\u002Fhero\u002FPrecious-PR-1600x900.jpg",{"left":4,"top":4,"width":26,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":869},"\u003Cpath fill=\"currentColor\" d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.55 96.55 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.3 96.3 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96s-42.981-96-96-96\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":871},"\u003Cpath fill=\"currentColor\" d=\"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48c27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":873},"\u003Cpath fill=\"currentColor\" d=\"M459.37 151.716c.325 4.548.325 9.097.325 13.645c0 138.72-105.583 298.558-298.558 298.558c-59.452 0-114.68-17.219-161.137-47.106c8.447.974 16.568 1.299 25.34 1.299c49.055 0 94.213-16.568 130.274-44.832c-46.132-.975-84.792-31.188-98.112-72.772c6.498.974 12.995 1.624 19.818 1.624c9.421 0 18.843-1.3 27.614-3.573c-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319c-28.264-18.843-46.781-51.005-46.781-87.391c0-19.492 5.197-37.36 14.294-52.954c51.655 63.675 129.3 105.258 216.365 109.807c-1.624-7.797-2.599-15.918-2.599-24.04c0-57.828 46.782-104.934 104.934-104.934c30.213 0 57.502 12.67 76.67 33.137c23.715-4.548 46.456-13.32 66.599-25.34c-7.798 24.366-24.366 44.833-46.132 57.827c21.117-2.273 41.584-8.122 60.426-16.243c-14.292 20.791-32.161 39.308-52.628 54.253\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":875},"\u003Cpath fill=\"currentColor\" d=\"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6c0-13.8 11.1-24.9 24.9-24.9c13.6 0 24.6 11.1 24.6 24.9c0 13.6-11.1 24.6-24.6 24.6M504 256c0 137-111 248-248 248S8 393 8 256S119 8 256 8s248 111 248 248m-132.3-41.2c-9.4 0-17.7 3.9-23.8 10c-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3l55.4 12.5c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8c-6.1-6.4-14.7-10.2-24.1-10.2c-34.9 0-46.3 46.9-14.4 62.8c-1.1 5-1.7 10.2-1.7 15.5c0 52.6 59.2 95.2 132 95.2c73.1 0 132.3-42.6 132.3-95.2c0-5.3-.6-10.8-1.9-15.8c31.3-16 19.8-62.5-14.9-62.5M302.8 331c-18.2 18.2-76.1 17.9-93.6 0c-2.2-2.2-6.1-2.2-8.3 0c-2.5 2.5-2.5 6.4 0 8.6c22.8 22.8 87.3 22.8 110.2 0c2.5-2.2 2.5-6.1 0-8.6c-2.2-2.2-6.1-2.2-8.3 0m7.7-75c-13.6 0-24.6 11.1-24.6 24.9c0 13.6 11.1 24.6 24.6 24.6c13.8 0 24.9-11.1 24.9-24.6c0-13.8-11-24.9-24.9-24.9\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":877},"\u003Cpath fill=\"currentColor\" d=\"M512 194.8c0 101.3-82.4 183.8-183.8 183.8c-101.7 0-184.4-82.4-184.4-183.8c0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8M0 501.5h90v-491H0z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":879},"\u003Cpath fill=\"currentColor\" d=\"m20.216 6.415l-.132-.666c-.119-.598-.388-1.163-1.001-1.379c-.197-.069-.42-.098-.57-.241c-.152-.143-.196-.366-.231-.572c-.065-.378-.125-.756-.192-1.133c-.057-.325-.102-.69-.25-.987c-.195-.4-.597-.634-.996-.788a6 6 0 0 0-.626-.194c-1-.263-2.05-.36-3.077-.416a26 26 0 0 0-3.7.062c-.915.083-1.88.184-2.75.5c-.318.116-.646.256-.888.501c-.297.302-.393.77-.177 1.146c.154.267.415.456.692.58c.36.162.737.284 1.123.366c1.075.238 2.189.331 3.287.37q1.829.074 3.65-.118q.449-.05.896-.119c.352-.054.578-.513.474-.834c-.124-.383-.457-.531-.834-.473c-.466.074-.96.108-1.382.146q-1.767.12-3.536.006a22 22 0 0 1-1.157-.107c-.086-.01-.18-.025-.258-.036q-.364-.055-.724-.13c-.111-.027-.111-.185 0-.212h.005q.416-.09.838-.147h.002c.131-.009.263-.032.394-.048a25 25 0 0 1 3.426-.12q1.011.029 2.017.144l.228.031q.4.06.798.145c.392.085.895.113 1.07.542c.055.137.08.288.111.431l.319 1.484a.237.237 0 0 1-.199.284h-.003l-.112.015a37 37 0 0 1-4.743.295a37 37 0 0 1-4.699-.304c-.14-.017-.293-.042-.417-.06c-.326-.048-.649-.108-.973-.161c-.393-.065-.768-.032-1.123.161c-.29.16-.527.404-.675.701c-.154.316-.199.66-.267 1c-.069.34-.176.707-.135 1.056c.087.753.613 1.365 1.37 1.502a39.7 39.7 0 0 0 11.343.376a.483.483 0 0 1 .535.53l-.071.697l-1.018 9.907c-.041.41-.047.832-.125 1.237c-.122.637-.553 1.028-1.182 1.171q-.868.197-1.756.205c-.656.004-1.31-.025-1.966-.022c-.699.004-1.556-.06-2.095-.58c-.475-.458-.54-1.174-.605-1.793l-.731-7.013l-.322-3.094c-.037-.351-.286-.695-.678-.678c-.336.015-.718.3-.678.679l.228 2.185l.949 9.112c.147 1.344 1.174 2.068 2.446 2.272c.742.12 1.503.144 2.257.156c.966.016 1.942.053 2.892-.122c1.408-.258 2.465-1.198 2.616-2.657l1.024-9.995l.215-2.087a.48.48 0 0 1 .39-.426c.402-.078.787-.212 1.074-.518c.455-.488.546-1.124.385-1.766zm-1.478.772c-.145.137-.363.201-.578.233c-2.416.359-4.866.54-7.308.46c-1.748-.06-3.477-.254-5.207-.498c-.17-.024-.353-.055-.47-.18c-.22-.236-.111-.71-.054-.995c.052-.26.152-.609.463-.646c.484-.057 1.046.148 1.526.22q.865.132 1.737.212c2.48.226 5.002.19 7.472-.14q.675-.09 1.345-.21c.399-.072.84-.206 1.08.206c.166.281.188.657.162.974a.54.54 0 0 1-.169.364zm-6.159 3.9c-.862.37-1.84.788-3.109.788a6 6 0 0 1-1.569-.217l.877 9.004c.065.78.717 1.38 1.5 1.38c0 0 1.243.065 1.658.065c.447 0 1.786-.065 1.786-.065c.783 0 1.434-.6 1.499-1.38l.94-9.95a4 4 0 0 0-1.322-.238c-.826 0-1.491.284-2.26.613\"\u002F>",{"left":4,"top":4,"width":29,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":881},"\u003Cpath fill=\"currentColor\" d=\"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134c-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9c152.3 0 165.1-3.7 204 11.4c60.1 23.3 65.6 79.5 44 140.3c-21.5 62.6-72.5 89.5-140.1 90.3c-43.4.7-69.5-7-75.3 24.2M357.1 152c-1.8-1.3-2.5-1.8-3 1.3c-2 11.4-5.1 22.5-8.8 33.6c-39.9 113.8-150.5 103.9-204.5 103.9c-6.1 0-10.1 3.3-10.9 9.4c-22.6 140.4-27.1 169.7-27.1 169.7c-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9c.7-5.4-1.1 6.1 14.4-91.3c4.6-22 14.3-19.7 29.3-19.7c71 0 126.4-28.8 142.9-112.3c6.5-34.8 4.6-71.4-23.8-92.6\"\u002F>",{"left":4,"top":4,"width":18,"height":18,"rotate":4,"vFlip":6,"hFlip":6,"body":883},"\u003Cpath fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8m0 448c-110.532 0-200-89.431-200-200c0-110.495 89.472-200 200-200c110.491 0 200 89.471 200 200c0 110.53-89.431 200-200 200m107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516c17.561-9.845 28.324-16.541 28.324-29.579c0-17.246-21.999-28.693-39.784-28.693c-23.189 0-33.894 10.977-48.942 29.969c-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8M298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42s18.841-42 42-42s42 18.841 42 42\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":885},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 12H5m7 7l-7-7l7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":887},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1793098364551]