IIS7: Jak zablokować dostęp za pomocą pliku web.config?

14

Wiem, że IIS7 pozwala mi na konfigurację dla poszczególnych katalogów z plikiem xml web.config. Mam katalog z niektórymi plikami konfiguracyjnymi, które nie chcą być dostępne w Internecie. Lokalny plik web.config zabraniający dostępu do niego byłby dobrym rozwiązaniem.

Jaka powinna być zawartość pliku web.config, aby zabronić dostępu do plików?

Edycja: Próbuję umieścić plik web.config z następującą zawartością w pliku:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
            <system.web>
                    <authorization>
                            <deny users="*" /> <!-- Denies all users -->
                    </authorization>
            </system.web>
</configuration>

Ale nadal mogę bezpośrednio uzyskać dostęp do pliku w katalogu. Co jest z tym nie tak? Jak debugować to, co się dzieje?

Neves
źródło

Odpowiedzi:

12

Używasz system.web. W IIS7 należy zamiast tego użyć system.webServer. Spowoduje to zablokowanie wszystkich typów plików, nie tylko plików ASP.NET. Na przykład możesz zabezpieczyć hasłem pliki jpg, gif, txt i wszystkie typy plików.

Wyglądałoby to tak:

  <system.webServer>
      <security>
          <authorization>
              <remove users="*" roles="" verbs="" />
              <add accessType="Allow" roles="Administrators" />
          </authorization>
      </security>
  </system.webServer>

A jeśli chcesz ustawić go tylko dla 1 pliku:

 <location path="dontlook.jpg">
     <system.webServer>
         <security>
             <authorization>
                 <remove users="*" roles="" verbs="" />
                 <add accessType="Allow" roles="Administrators" />
             </authorization>
         </security>
     </system.webServer>
 </location>
Scott Forsyth - MVP
źródło
Ponad rok później natknąłem się na własną odpowiedź i chciałem dodać dodatkową notatkę. Musisz upewnić się, że włączono także uwierzytelnianie formularzy lub systemu Windows, w przeciwnym razie pomocna będzie tylko reguła usuwania. Jeśli włączyłeś uwierzytelnianie systemu Windows, pojawi się monit o podanie poświadczeń.
Scott Forsyth - MVP
+1 w końcu! Spędziłem 3 godziny na znalezieniu tego! Dziękuję
hofnarwillie
5

myślę, że to może rozwiązać twój problem.
umieść ten plik web.config w katalogu zawierającym katalog docelowy:

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <hiddenSegments>
     <add segment="target directory name"/>
    </hiddenSegments>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>
Reza Roshan
źródło
2
Czy możesz to zweryfikować przed przesłaniem odpowiedzi?
James A Mohler,
To działa dla mnie. Pamiętaj też, że możesz umieścić nazwę pliku jako segment.
Soenhay,
4

Możesz użyć węzłów lokalizacji w pliku Web.config. Oto szczegółowe wyjaśnienie dotyczące msdn ; w skrócie:

<location path="Subdirectory">
    <system.web>
        <authorization>
            <deny users="*"/> <!-- Denies all users -->
        </authorization>
    </system.web>
</location>
<location path="Public_Directory">
    <system.web>
        <authorization>
            <allow users="*"/> <!-- Allows all users -->
        </authorization>
    </system.web>
</location>

Możesz także użyć? symbol wieloznaczny określający, że należy (zezwalać / odmawiać) anonimowym użytkownikom

Jhonny D. Cano -Leftware-
źródło
Jak ten plik zablokowałby dostęp do bieżącego katalogu, ale pozwoliłby na katalog „css”? brakuje mu znacznika <configuration> wokół niego.
neves
Zezwolenie zezwala tylko uwierzytelnionym użytkownikom. Jeśli chcesz mieć nieuwierzytelnionych użytkowników, powinieneś dołączyć allow users = "?" także.
Nissan Fan
0
  • * oznacza każdego zalogowanego użytkownika.
  • ? oznacza anonimowych użytkowników.

Musisz użyć ?.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <authorization>
            <deny users="?" /> 
        </authorization>
    </system.web>
</configuration>
Marooned
źródło