String aus gesichertem Server lesen .htaccess

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    String aus gesichertem Server lesen .htaccess

    Hallo zusammen.

    Habe eine Frage zum Thema .htaccess
    Ich habe auf einem Server einen Ordner über .htaccess geschützt, was soweit auch funktioniert.
    In diesem Ordner liegt eine .txt.
    Diesen Inhalt möchte ich nun, in einer Textbox anzeigen lassen.
    Anstatt die normale URL zu nutzten setzt ich: "http://USER:PASSWORT@Host.de" voran.
    Leider bekomme ich dem Fehler 401 gemeldet. Setzte ich die o.g URL direkt in die Browserzeile sehe ich allerdings den .txt Inhalt.
    Was mache ich falsch?

    Setzte ich in meine .htaccess

    Allow From All
    Satisfy Any

    das hinten an, klappt es zwar, allerdings kann dann jeder von extern auf die Datei zugreifen. Was ich natürlich in dem Fall nicht möchte

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hast du Sonderzeichen in dem Benutzernamen/Password?
    Die kannst du mit \ escapen oder in Quotes packen: http://foo:'b?ar'@Host.de

    Generell möchte ich aber anmerken, das das eine doofe Idee ist und kein Schutz bietet.
    Wenn jemand anderes deine Anwendung hat, kann er die Daten extrahieren.
    Der Ordner wird dann mittels HTTP Auth geschützt. Das musst du zusätzlich mit deiner Anfrage an den Webserver schicken; genau so macht's der Browser ja auch.

    Ich würde das auch ganz arg sein lassen, die Daten über die URL zu liefern - das ist ein massives Sicherheitsrisiko. Nicht nur, wenn jemand dein Programm in die Hände bekommt, aber die URL, die du aufrufst, ist für jeden in deinem Netzwerk sichtbar (und auch für dein ISP).
    Schick die Daten immer mit NetworkCredentials, so werden die erst gesendet, nachdem eine HTTPS Verbindet aufgebaut wurde.

    Beispiel bei StackOverflow: stackoverflow.com/questions/43…sing-basic-authentication

    EDIT:

    Ich sehe auch gerade, dass du nur HTTP nutzt 8|
    Bitte stell möglichst sicher, dass du HTTPS verwendest.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    @siycah
    Hey, Danke für deinen Tipp klappt super.

    Hast du evt. noch eine Idee wie ich die NetworkCredentials für das aufrufen von Bildern nehmen kann?

    Diesen Code hatte ich zuvor und hat Super geklappt:

    VB.NET-Quellcode

    1. Dim Pic As Image = ImageFromWeb("https://xxx.jpg")
    2. If Pic Is Nothing Then
    3. Aktive.PB_bild.Image = My.Resources.platzhalter_m
    4. Else
    5. Aktive.PB_bild.Image = Pic
    6. End If


    VB.NET-Quellcode

    1. Public Function ImageFromWeb(ByVal sURL As String) As Image
    2. Try
    3. ' Web-Anfrage mit vorgegebener URL zur Bilddatei
    4. Dim oRequest As WebRequest = WebRequest.Create(sURL)
    5. oRequest.Method = "GET"
    6. ' Antwort unserer Anfrage...
    7. Dim oResponse As WebResponse = oRequest.GetResponse()
    8. Application.DoEvents()
    9. ' Stream-Objekt mit den Bilddaten erstellen
    10. Dim oStream As New StreamReader(oResponse.GetResponseStream())
    11. ' Bild aus dem Stream-Objekt in ein Image-Objekt kopieren
    12. Dim Pic As Image = Image.FromStream(oStream.BaseStream)
    13. ' Objekte zerstören
    14. oStream.Close()
    15. oResponse.Close()
    16. ' Image-Objekt zurückgeben
    17. Return Pic
    18. Catch ex As Exception
    19. MsgBox(ex.ToString)
    20. Return Nothing
    21. End Try
    22. End Function


    Habe es mit den NetworkCredentials so gelöst

    Quellcode

    1. ​ReadOnly client = New WebClient With {
    2. .Credentials = New NetworkCredential(user, key),
    3. .Encoding = Text.Encoding.UTF8
    4. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Otti“ ()

    Otti schrieb:

    Hast du evt. noch eine Idee wie ich die NetworkCredentials für das aufrufen von Bildern nehmen kann?


    Du musst dich immer authorisieren. Außer du speicherst einen Cookie o.Ä.
    Ich würde an deiner Stelle auch nicht den WebClient und WebRequest benutzen, sondern den HttpClient. Die zuvorgenannten sind deprecated und könnten demnächst aus dem Framework verschwinden.

    Damit kannst du dann den Stream zurücklesen und daraus (z.B. mit einem MemoryStream) das Bild erstellen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    Hey
    @siycah

    Habe mal ein bischen im Netz gegoogelt.

    Habe das gefunden. Könnte ich damit arbeiten um mein Ziel zu erreichen?

    VB.NET-Quellcode

    1. Dim uri = New Uri("http://xxx.jpg")
    2. Dim credentialsCache = New CredentialCache()
    3. credentialsCache.Add(uri, "Negotiate", New NetworkCredential(ssluser, sslkey))
    4. Dim handler = New HttpClientHandler() With {
    5. .Credentials = credentialsCache,
    6. .PreAuthenticate = True
    7. }
    8. Dim httpClient = New HttpClient(handler) With {
    9. .Timeout = New TimeSpan(0, 0, 10)
    10. }
    11. Dim response = Await httpClient.GetAsync(uri)
    12. Dim result = Await response.Content.ReadAsStringAsync()
    13. MsgBox(result)


    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Grundsätzlich sieht das schon mal soweit okay aus. Ob das jetzt als Text heruntergeladen werden muss, oder als Byte[] oder so, hängt natürlich davon ab, was du damit tun willst.

    Ich würde es an deiner Stelle einfach mal ausprobieren - kaputtmachen wirste damit nichts.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.
    Hallo zusammen.

    So ich habe nun mehre Tage getestet, ein Bild über httpClient anzeigen zu lassen.
    Das klappt auch soweit, allerdings nicht so wie ich es möchte, da der Server eine Authorisierung brauch.
    Wer kann mir helfen oder verraten wo ich die NetworkCredential einbinden muss?

    VB.NET-Quellcode

    1. Dim req As Net.HttpWebRequest = DirectCast(Net.HttpWebRequest.Create("https://123.jpg"), Net.HttpWebRequest)
    2. Dim res As Net.HttpWebResponse = DirectCast(req.GetResponse, Net.HttpWebResponse)
    3. Dim img As Image = New System.Drawing.Bitmap(res.GetResponseStream)
    4. res.Close()
    5. bild.Image = img


    Habe es so versucht, bekomme allerdings Fehler 401 zurück.

    VB.NET-Quellcode

    1. ​Using handler As New HttpClientHandler With {.Credentials = New NetworkCredential(ssluser, sslkey)}
    2. Dim uri As Net.HttpWebRequest = DirectCast(Net.HttpWebRequest.Create("https://123.jpg"), Net.HttpWebRequest)
    3. Dim httpClient = New HttpClient(handler)
    4. Dim response As Net.HttpWebResponse = DirectCast(uri.GetResponse, Net.HttpWebResponse)
    5. Dim img As Image = New System.Drawing.Bitmap(response.GetResponseStream)
    6. response.Close()
    7. bild.Image = img
    8. End Using


    Desweiteren habe ich noch das Problem das ich über den HttpClient die Rückmeldung nicht im meine Combobox anzeigen kann.

    VB.NET-Quellcode

    1. Dim client As New HttpClient(handler)
    2. Dim response = Await client.GetAsync(uri)
    3. MsgBox(response.Content.ReadAsStringAsync())
    4. Login.C_Namen.Items.Clear()
    5. Login.C_Namen.Items.AddRange(response)


    response wird in der MSGBOX angezeigt, allerdings in Addrange - HTTPReponseMEssage kann nicht in Object() konvertiert werden.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Otti“ ()