Sunucu Yanıt Başlığını IIS7'yi Kaldır


107

"Sunucu" yanıt başlığını IIS7'den kaldırmanın herhangi bir yolu var mı? HttpModules kullanarak aynı şeyi başarabileceğimizi gösteren bazı makaleler var. Sunucuya yönetici hakkımız yoksa bu yardımcı olacaktır. Ayrıca ISAPI filtresi yazmak istemiyorum.

Sunucum için yönetici haklarına sahibim. Bu yüzden yukarıdaki şeyleri yapmak istemiyorum. O yüzden lütfen aynısını yapmama yardım et.


Yanıtlar:


111

Bunu global.asax.cs dosyanıza ekleyin:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

11
Http modülü yanıtının neden bundan daha yüksek olduğunu bilmiyorum, bu çok daha kolay
jjxtra

2
Eğer NullReferenceExceptiongüvenirsen, Cassini'de bir bulabilirsin HttpContext.Current. Bu blog yazısı , sizin için önemliyse, Cassini desteğini bozmadan nasıl yapılacağını gösterir.
Owen Blacker

49
@PsychoDad bu yalnızca ASP.NET istekleri için çalışır, .css ve .js gibi statik dosyalar için geçerli değildir
Max Toro

1
MVC başlığından kurtulmak için bunu MvcHandler.DisableMvcResponseHeader = true;
ProVega

7
Veya PreSendRequestHeadersuygulayan bir sınıfta kullanmak iyi bir fikir değildir . Stres yükü altında sunucudaki uygulamayı donduran olaya şahit oldum. Etkinlik yanıtı başlık değişiklikleri yapmak için çalışmalıdır. Hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx sayfasına bakın . IHttpModuleGlobal.asaxBeginRequest
Dmitry S.

77

IIS7'de bir HTTP modülü kullanmanız gerekir. Aşağıdakileri VS'de bir sınıf kitaplığı olarak oluşturun: Build the following as a class library in VS:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

Ardından, web.config dosyanıza aşağıdakileri ekleyin veya IIS içinde yapılandırın (IIS içinde yapılandırırsanız, derlemenin GAC'de olması gerekir).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>

Harika, ETag başlığını sunucu grubumdan kaldırmak için bunu da değiştirebilirim.
devstuff

Bu ... / ASP.NET Dev sunucu Casini bir çalışma zamanı hatası neden olur
UpTheCreek

2
@UpTheCreek ASP.Net dev sunucusu (Cassini) bu kodu beğenmeyecek; Bu blog yazısı Bunu kontrol etmek gerek - gerçi, buna bir çözümü vardır HttpApplication, HttpRequest, HttpContextve HttpResponsedeğil null, aynı zamanda denetleme olduğunu HttpRequest.IsLocalolduğunu false.
Owen Blacker

2
Başlığı içinde değiştirmek HttpCacheModule ile ilgili sorunlara nedenPreSendRequestHeaders olabileceğinden , bunun yerine benzer bir şey kullanmalısınız. PostReleaseRequestState
Eirik H

5
Modül, ASP.NET ardışık düzenine ulaşmadığından, IIS statik dosyalar (css / less / images / etc) için 304 Değiştirilmedi üstbilgisi gönderdiğinde çağrılmaz, dolayısıyla bu durumda Sunucu: Microsoft IIS / 7.5 hala işlenir
Jano

42

IIS (UrlRewrite) için URL Yeniden Yazma Modülü Sürüm 2.0 etkinleştirildiğinde, yapılandırma bölümünde <configuration><system.webServer><rewrite>giden kuralı ekleyin:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

11
Bunun sadece Sunucu başlığını kapattığını, onu kaldırmadığını unutmayın.
Nick Evans

Cehalet için üzgünüm ama bunu hangi kısma eklemeliyim? <
System.webServer

1
Teşekkürler! IIS 8.5'te çalışıyor, bu çok kolay. Bir metin düzenleyicim yok ama GUI'yi kolayca kullanabilirsiniz. Adın RESPONSE_Server olması gerekir, yalnızca Sunucu değil (ilk başta burada başarısız olduğum yer burası).
Louis Matthijssen

ASP.Net olmayan bir uygulamanız varsa bu yeterince iyidir, bu nedenle belirtilen kodlarla sunucu başlığını kaldıramazsınız
mhesabi

4
@vignesh bu bazı UrlRewrite yapılandırma alt düğümleridir. Onları bir rewritedüğümün altına yerleştirmelisiniz system.webServer. Dikkat edin, sunucuda UrlRewrite kurulu değilse bu sitenizin çökmesine neden olacaktır. Ve bu yapılandırma düğümlerini nasıl yazdığını kontrol etmek için önce IIS yapılandırma konsolunu kullansanız iyi olur.
Frédéric

36

Scott Mitchell, gereksiz başlıkları kaldırmak için bir blog gönderisinde çözümler sunar .

Burada daha önce başka yanıtlarda da belirtildiği gibi, Serverbaşlık için http modülü çözümü veya IIS 10+ için bir web.config çözümü vardır ya da boş bırakmak için URLRewrite'ı kullanabilirsiniz .

Güncel (IIS 10 +) bir kurulum için en pratik çözüm removeServerHeaderweb.config'de kullanmaktır:

<system.webServer>
  ...
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
  ...
</system.webServer>

İçin X-AspNet-Versionve X-AspNetMvc-Versiondeğil sadece tüm bunları üreten: o her yanıta bunları kaldırmayı daha iyi bir yol sağlar.

Web.config içinde enableVersionHeaderdevre dışı bırakmak için kullanınX-AspNet-Version

<system.web>
  ...
  <httpRuntime enableVersionHeader="false" />
  ...
</system.web>

MvcHandler.DisableMvcResponseHeaderDevre dışı bırakmak için .Net Application_Start olayında kullanınX-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

Ve son olarak, IIS yapılandırmasında X-Powered-Byweb.config dosyasındaki özel başlığı kaldırın .

<system.webServer>
  ...
  <httpProtocol>
    <customHeaders>
      <remove name="X-Powered-By" />
    </customHeaders>
  </httpProtocol>
  ...
</system.webServer>

Dikkat edin, ARR'niz (Uygulama İsteği Yönlendirme) varsa, kendi başına da ekleyecektir ve X-Powered-Bybu, özel başlık ayarlarıyla kaldırılmayacaktır. Bu seferki (bir tesiste) IIS kökü üzerinde IIS Yöneticisi, Editör yapılandırma yoluyla kaldırılmalıdır: gidin system.webServer/proxydüğüme ve seti arrResponseHeaderiçin false. A sonra IISResetdikkate alınır.
(Ben bunu bulduk burada eski şeyleri yapılandırma 6.0 yolunu IIS ile ilgili bu yazı olduğunu hariç.)

Statik içerikte oluşturulan başlığa varsayılan olarak uygulama koduna göre çözümün geçerli olmadığını unutmayın (bunu runAllManagedModulesForAllRequestsdeğiştirmek için etkinleştirebilirsiniz , ancak tüm isteklerin .Net ardışık düzenini çalıştırmasına neden olur). X-AspNetMvc-VersionStatik içeriğe eklenmediği için bir sorun değildir (en azından statik istek .Net ardışık düzeninde çalıştırılmıyorsa).

Yan not: amaç kullanılan teknolojiyi gizlemek olduğunda, standart .Net çerez adlarını da değiştirmelisiniz ( .ASPXAUTHformlar yetkilendirildiyse ( web.config içindeki etiketin nameözniteliğini kullanın forms), ASP.NET_SessionId( etiket <sessionState cookieName="yourName" />altında web.config içinde kullanın system.web), __RequestVerificationToken( kod ile AntiForgeryConfig.CookieName, ancak maalesef bu sistemin html'de oluşturduğu gizli girdi için geçerli değildir)).


18

Aslında kodlanmış modüller ve yukarıda gösterilen Global.asax örnekleri yalnızca geçerli istekler için çalışır.

Örneğin, URL'nizin sonuna <ekleyin ve sunucu başlığını göstermeye devam eden bir "Hatalı istek" sayfası alacaksınız. Birçok geliştirici bunu görmezden geliyor.

Gösterilen kayıt defteri ayarları da çalışmıyor. URLScan, "sunucu" başlığını kaldırmanın YALNIZCA yoludur (en azından IIS 7.5'te).


Kötü bir istekte bile kodlanmış modülle (web.config'e eklendi) benim için çalışıyor;) global.asax'ta gerçekten çalışmıyor (örn. Statik dosyalar vb.)
kapsiR

Umarız istek doğrulamasını hala açmışsınızdır.
Dan Ware

1
IIS 8+ için urlscan alternatifi olan var mı?
herostwist

En azından IIS10 + 'da çalışan bir çözüm var: stackoverflow.com/a/53222967/1671558
Ilya Chernomordik

16

Veya web.config'i ekleyin:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

3
Bu yöntem 'Sunucu' başlığını kaldırmaz. Diğerleri kaldırılır.
Pure.Krome

Sunucu düzeyinde Yanıt başlıkları yapılandırmasında X-Powered-By'den kurtulabilirsiniz.
Snowburnt

1
Bu yolun kaldırıldığı X-AspNet-Versionve X-AspNetMvc-Versionbaşlığın olduğu durumlar olup olmadığını bilmiyorum . Bildiğim, bu yolun her zaman işe yaramadığıdır (eğer işe yararsa). Bunları kaldırmanın daha güvenilir bir yolu için @Frederic yanıtına bakın.
TheBlueSky

Şimdi IIS10 + 'da sunucu başlığını kaldırmanın bir yolu var: stackoverflow.com/a/53222946/1671558
Ilya Chernomordik

14

Bu web.configkurulum, tüm gereksiz üstbilgileri ASP.NET yanıtından kaldırmak için çalışır (en azından IIS 10'dan başlayarak):

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

Diğer tüm yaklaşımlarda olduğu gibi, bunun "uygulama" için tüm başlıkları gizlediğini lütfen unutmayın. Örneğin, bazı varsayılan sayfaya veya IIS tarafından oluşturulan bir hata sayfasına veya uygulamanızın dışında ASP.NET'e ulaşırsanız, bu kurallar uygulanmayacaktır. Bu nedenle ideal olarak IIS'de kök düzeyinde olmaları gerekir ve bu eşik, IIS'nin kendisine bazı hata yanıtları bırakabilir.

PS IIS 10'da, bazen doğru yapılandırmayla bile sunucu başlığını göstermesine neden olan bir hata vardır . Şimdiye kadar düzeltilmesi gerekiyor, ancak IIS / Windows'un güncellenmesi gerekiyor.


12

Yeniden Yazma URL yanıtına ek olarak , işte tam XMLweb.config

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="Remove RESPONSE_Server" >
        <match serverVariable="RESPONSE_Server" pattern=".+" />
        <action type="Rewrite" value="Company name" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

URL Yeniden Yaz


Bu, tüm IIS ve ASP sürümlerini
hacker'dan

1
Yukarıdaki düzeltme web sayfaları için doğru çalışıyor ancak resimler / simgeler için 500 Dahili Sunucu Hatası oluştuysa, değer yerine Sunucuyu gösteriyor: Microsoft-IIS / 7.5.Lütfen bu konuda bana yardım eder misiniz
ravithejag

11

Server:Başlığı kaldırmak için , gidin Global.asax, Application_PreSendRequestHeadersetkinliği bulun / oluşturun ve aşağıdaki gibi bir satır ekleyin ( BK ve bu blog sayesinde bu , Cassini / yerel geliştiricide de başarısız olmayacaktır):

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

Azure / IIS7'deki tüm ilgili başlıkları kaldırmak için eksiksiz bir çözüm istiyorsanız ve Cassini ile de çalışıyorsa, bu başlıkları HttpModules veya URLScan kullanmadan devre dışı bırakmanın en iyi yolunu gösteren bu bağlantıya bakın .


9

Başlığı kaldırmak istiyorsanız, lukiffer'ın yanıtının kısaltılmış bir versiyonunu kullanabilirsiniz:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

Ve sonra Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>

1
Bu en uygunudur, çünkü css / js gibi kaynaklar Sunucu başlığına sahip olmayacak, sunucudan sunucuya yapılandırma olmadan bağlantı noktaları ve Sunucu yanıt başlığı sadece boş olmayacak, gönderilmeyecek.
Adam Caviness

RunAllManagedModulesForAllRequests = "true" nun uygulamanızı yavaşlatacağına ve önerilmeyeceğine dair yorumlar gördüm. Bunun yerine, sunucu değerini statik dosyalar için de temizlemek için urlrewrite modülü outboundRules kullanılabilir. britishdeveloper.co.uk/2010/06/…
Juri

5

HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderKayıt defteri girdisini a REG_DWORDolarak ayarlamayı deneyin 1.


Bu kayıt defteri ayarının, kullandığımız tüm işletim sistemlerinde (W2K8, W2K3) hem IIS6 hem de IIS7 için çalışan tek değişiklik olduğu sunucu çiftliğimizde garip bir durumla karşılaştık.
jerhewet

2
Sinir bozucu bir şekilde, bu, sanal makineyi yeniden başlattıktan sonra bile benim için bir fark yaratmıyor. Windows Server 2008 R2 Standard, "Sürüm 6.1 (Derleme 7601: Hizmet Paketi 1)" üzerinde IIS 7.5 çalıştırıyoruz. Benzer şekilde, OnPreSendRequestHeadersolay işleyicim (yukarıya bakın) bazı nedenlerden dolayı asla ateşlenmiyor.
Owen Blacker

3
Maalesef kayıt defteri anahtarı IIS 7.5'te çalışmıyor gibi görünüyor
Andrew Csontos


2

Takip etmek eddiegroves' cevabı URLScan'in sürümüne bağlı olarak, bunun yerine tercih edebilirsiniz RemoveServerHeader=1altında [options].

Bu seçeneğin hangi URLScan sürümünde eklendiğinden emin değilim, ancak sürüm 2.5 ve sonrasında mevcut.


2

Bunu IIS'de düzgün bir şekilde ayarlamak için neden hem Kayıt Defteri düzenlemesi yapmamız hem de UrlScan gibi bir araç kullanmamız gerektiğini açıklayan bir makale buldum. Bunu sunucularımızda takip ettim ve çalışıyor: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . Yalnızca UrlScan kullanır ancak kayıt defteri değişikliğini yapmazsanız, World Wide Publishing Service'i durdurduğunuz süre boyunca sunucunuz HTTP.sys dosyasından sunucu http yanıtını döndürecektir. Ayrıca, UrlScan aracını kullanmanın sık karşılaşılan sonuçları şunlardır: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008


2
Lütfen kodunuzu Stack Overflow'da yayınlayın. Bağlantılar değişebilir ve kopabilir, bu nedenle gönderme kodu çok daha yararlıdır
Blundering Philosopher

2

IIS 10'da, Drew'un yaklaşımına benzer bir çözüm kullanıyoruz, yani:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

Ve açıkçası, projelerinizdeki bu dll'ye ve ayrıca istediğiniz yapılandırmadaki modüle bir referans ekleyin:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

ÖNEMLİ NOT1: Bu çözüm, entegre olarak ayarlanmış bir uygulama havuzu gerektirir;

ÖNEMLİ NOT2: Web uygulamasındaki tüm yanıtlar bundan etkilenecektir (css ve js dahil);


1

Bunu araştırdım ve URLRewrite yöntemi iyi çalışıyor. Hiçbir yerde yazılmış değişikliği bulamıyorum. Bunu PowerShell v2 ve üstü ile uyumlu olarak yazdım ve IIS 7.5 üzerinde test ettim.

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"

1

Global.asax.cs dosyasına aşağıdaki kodu ekleyebilirsiniz

    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
    }

1

Yukarıda önerilen çözüm, aşağıdaki değişikliklerle birlikte benim için çalıştı. Burada senaryomu ve çözümümü yayınlıyorum.

Benim için aşağıdaki başlıkları kaldırmak istedim:

  • Sunucu
  • X-Powered-By
  • X-aspnet sürüm
  • X-AspNetMvc sürüm

Bunları global.asax'ıma ekledim:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

Yukarıdaki olay tetiklenmiyordu, bu yüzden web.config'e aşağıdakileri ekledim ve çalıştı.

<modules runAllManagedModulesForAllRequests="true" />

ve sürüm başlığını kaldırmak için web.config dosyasına aşağıdakileri de ekledim:

<httpRuntime enableVersionHeader="false" />

Web.config’teki değişiklikler:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

Umarım yardımcı olur!


0

Buradaki tüm şeyleri ve diğer birkaç benzer yığın taşma iş parçacığı üzerinde denedim.

Yapılandırma değişiklikleri yaptıktan sonra tarayıcı önbelleğimi temizlemeyi unuttuğum için bir süre takıldım. Bunu yapmazsanız ve dosya yerel önbelleğinizdeyse, size orijinal başlıklarla (duh) sunacaktır.

Çoğunlukla runAllManagedModulesForAllRequests'i kaldırarak çalıştım:

<modules runAllManagedModulesForAllRequests="true">

Bu, gereksiz başlıkları statik dosyaların çoğundan kaldırdı, ancak yine de WebAPI projemdeki bazı statik dosyalarda "Sunucu" başlığını swagger olarak alıyordum.

Sonunda bu çözümü buldum ve uyguladım ve şimdi tüm istenmeyen başlıklar gitti:

https://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

buradaki kodunu tartışan:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

Bu bir Yerel Kod modülüdür. Yapabiliyor kaldırmak değeri şeyi siliyor değil, Server başlığı. Varsayılan olarak şunları kaldırır:

  • Sunucu
  • X-Powered-By
  • X-Aspnet sürüm
  • Sunucu: Microsoft-HTTPAPI / 2.0 - "istek IIS'ye iletilemezse" döndürülür

-1

IIS 7.5 ve muhtemelen daha yeni sürümlerde başlık metni, iiscore.dll

Bir onaltılık düzenleyici kullanarak, dizeyi ve 53 65 72 76 65 72ondan sonraki "Sunucu" kelimesini bulun ve bunları boş baytlarla değiştirin. IIS 7.5'te şöyle görünür:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

Diğer bazı yöntemlerin aksine, bu bir performans cezasına neden olmaz. Başlık ayrıca dahili hatalar dahil tüm isteklerden kaldırılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.