fk2868: Bild nur bei vorhandenen Zugriffrechten einfügen: Javascript

Wenn ich mittels

<img src="bild">

ein Bild in ein HTML-Dokument einbinde, als aktueller Benutzer aber keine Zugriffsrechte darauf habe, fragt IE wie FF erneut nach einem Login/Passwort.

Kommt das 50x im Dokument vor, dann wird 50x nachgefragt.

Apache .httaccess mit

<FilesMatch ".(jpeg|jpg|png|gif)$">
  ErrorDocument 404 /image/noAccess.png
  </FilesMatch>

hilft nicht weiter, der Login-Dialog kommt vor dem Ersetzen. Login-Dialog, Wegclicken, erst dann wird das Bild ersetzt.
Ich habe einiges ausprobiert, mir sind aber die Ideen ausgegangen.
Geht so was dynamisch per Javascript? Zugriff testen, abhängig vom Ergebnis
Codesnippet1 oder Codesnippet2 einfügen? Gibt es elegantere Ansätze?

Codesnippet1 wäre z.B.
<a href="/dir1/seite1.html> <img src="/dir1/bild.png"> </a>

Codesnippet2 wäre z.B.
<img src="/img/n.a.png">

Abhängig von den Zugriffsrechten des aktuellen Betrachters auf /dir1/bild.png ohne das Anfordern weiterer Passwörter.

  1. Hi,

    Wenn ich mittels
      <img src="bild">
    ein Bild in ein HTML-Dokument einbinde, als aktueller Benutzer aber keine Zugriffsrechte darauf habe, fragt IE wie FF erneut nach einem Login/Passwort.

    Du redest als von HTTP Authentication?

    Natuerlich muessen die Browser da "nachfragen" - es ist ja schliesslich noch gar nicht klar, ob der Benutzer Berechtigung zum Abruf dieser Ressource hat oder nicht.

    Apache .httaccess mit

    <FilesMatch ".(jpeg|jpg|png|gif)$">
      ErrorDocument 404 /image/noAccess.png
      </FilesMatch>

    hilft nicht weiter,

    Natuerlich nicht. Zum ersten erst mal deshalb, weil der Statuscode 404 damit herzlich wenig zu tun hat. Kann der Benutzer keine gueltigen Credentials vorweisen, lautet die Antwort 401 Unauthorized.

    der Login-Dialog kommt vor dem Ersetzen. Login-Dialog, Wegclicken, erst dann wird das Bild ersetzt.

    Natuerlich, siehe oben. Bevor er nachfragt, kann der Client ja noch nicht wissen, ob der Benutzer berechtigt ist, die Ressource abzurufen. Erst wenn dieser durch "Wegklicken" der Zugangsdatenabfrage klar macht, dass er keine Zugangsdaten eingeben moechte, weiss der Client, dass er die gewuenschte Ressource vom Server nicht erhalten wird - und kann dann stattdessen ggf. die Bildressource ausgeben, die vom Server als Alternativinhalt mit der 401-Antwort geliefert wurde, bzw. einen "broken image"-Platzhalter anzeigen.

    Geht so was dynamisch per Javascript? Zugriff testen, abhängig vom Ergebnis
    Codesnippet1 oder Codesnippet2 einfügen?

    Per JavaScript koenntest du zwar ggf. abfragen, ob eine Bildressource fehlerfrei geladen werden konnte - aber schon beim Versuch, diese vom Server anzufordern, wird wieder die Abfrage der Zugangsdaten kommen.

    Abhängig von den Zugriffsrechten des aktuellen Betrachters auf /dir1/bild.png ohne das Anfordern weiterer Passwörter.

    Sorge dafuer, dass die das Bild einbindende Ressource und die Bildressourcen innerhalb des gleichen Zugangsbereiches ("Realm") liegen - dann muss der Benutzer die Daten nur einmal eingeben, der Client "merkt" sie sich und schickt sie bei weiteren Anfragen nach Ressourcen aus dem gleichen Realm automatisch selber an den Server.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      »» Wenn ich mittels
      »»   <img src="bild">
      »» ein Bild in ein HTML-Dokument einbinde, als aktueller Benutzer aber keine Zugriffsrechte darauf habe, fragt IE wie FF erneut nach einem Login/Passwort.

      Du redest als von HTTP Authentication?

      »»
      Ja.

      Natuerlich muessen die Browser da "nachfragen" - es ist ja schliesslich noch gar nicht klar, ob der Benutzer Berechtigung zum Abruf dieser Ressource hat oder nicht.

      Wenn er es einmal machen würde, könnte ich damit leben.
      Er stellt aber für jedes Element immer wieder die gleiche Frage, Firefox macht das noch parallel und reißt sich in den Abgrund. IE arbeitet etwas gutmütiger.

      »» Apache .httaccess mit
      »»
      »»   <FilesMatch ".(jpeg|jpg|png|gif)$">
      »»   ErrorDocument 404 /image/noAccess.png
      »»   </FilesMatch>
      »»
      »» hilft nicht weiter,

      Natuerlich nicht. Zum ersten erst mal deshalb, weil der Statuscode 404 damit herzlich wenig zu tun hat. Kann der Benutzer keine gueltigen Credentials vorweisen, lautet die Antwort 401 Unauthorized.

      Ich MEINTE 401.
      Ich kann die Daten auch vollständig übertragen, dann können inhaltliche Kürzungsfehler nicht auftreten. Allerdings ist das dann nicht mehr lesbar.

      »» der Login-Dialog kommt vor dem Ersetzen. Login-Dialog, Wegclicken, erst dann wird das Bild ersetzt.

      Natuerlich, siehe oben. Bevor er nachfragt, kann der Client ja noch nicht wissen, ob der Benutzer berechtigt ist, die Ressource abzurufen. Erst wenn dieser durch "Wegklicken" der Zugangsdatenabfrage klar macht, dass er keine Zugangsdaten eingeben moechte, weiss der Client, dass er die gewuenschte Ressource vom Server nicht erhalten wird - und kann dann stattdessen ggf. die Bildressource ausgeben, die vom Server als Alternativinhalt mit der 401-Antwort geliefert wurde, bzw. einen "broken image"-Platzhalter anzeigen.

      Prinzipiell richtig. Wenn es aber danach geht, kann man 95% der Features von Apache und 80% der Features von Firefox entsorgen, weil man sie eigentlich nicht braucht.

      Es geht darum, daß Webseite aus ca. 1000 Elementen besteht, und je nach Nutzer nur auf 700 bis 1000 Elemente Zugriffsrechte hat. Die 300 bis 0 nicht zugreifbaren Elemente sind in der gleichen Realm.

      Der FF und IE puffert zwar erfolgreiche Auth ab, nicht erfolgreiche wiederholt er aber ohne Gnade.

      »» Geht so was dynamisch per Javascript? Zugriff testen, abhängig vom Ergebnis
      »» Codesnippet1 oder Codesnippet2 einfügen?

      Per JavaScript koenntest du zwar ggf. abfragen, ob eine Bildressource fehlerfrei geladen werden konnte - aber schon beim Versuch, diese vom Server anzufordern, wird wieder die Abfrage der Zugangsdaten kommen.

      Kann man das unterbinden?

      Entweder darf der Client nur für fehlgeschlagende HTML-Dokumente nach einem weiteren Versuch für Login+Passwd betteln oder der Server darf für bestimmte Dokumente kein 401 bringen (was prinzipiell geht, wenn man sich an den Quellen vergreift).

      »» Abhängig von den Zugriffsrechten des aktuellen Betrachters auf /dir1/bild.png ohne das Anfordern weiterer Passwörter.

      Sorge dafuer, dass die das Bild einbindende Ressource und die Bildressourcen innerhalb des gleichen Zugangsbereiches ("Realm") liegen - dann muss der Benutzer die Daten nur einmal eingeben, der Client "merkt" sie sich und schickt sie bei weiteren Anfragen nach Ressourcen aus dem gleichen Realm automatisch selber an den Server.

      Der Benutzer hat keine Rechte auf diese Elemente. Der Browser probiert das aber für jedes Element aus.

      * Lege eine HTML-Datei an.
      * lege diese auf einem Server ab, ob geschützt oder ungeschützt, ist egal.
      * Füge 500 kleine Icons von ein und der selben geschützten Webseite ein.

      Der Client fragt 500 mal die gleiche Frage. Bei einem Reload noch 500x. Der glaubt Dir nicht, daß Du das Passwort nicht weißt.

      1. Hi,

        Natuerlich, siehe oben. Bevor er nachfragt, kann der Client ja noch nicht wissen, ob der Benutzer berechtigt ist, die Ressource abzurufen. Erst wenn dieser durch "Wegklicken" der Zugangsdatenabfrage klar macht, dass er keine Zugangsdaten eingeben moechte, weiss der Client, dass er die gewuenschte Ressource vom Server nicht erhalten wird - und kann dann stattdessen ggf. die Bildressource ausgeben, die vom Server als Alternativinhalt mit der 401-Antwort geliefert wurde, bzw. einen "broken image"-Platzhalter anzeigen.

        Prinzipiell richtig. Wenn es aber danach geht, kann man 95% der Features von Apache und 80% der Features von Firefox entsorgen, weil man sie eigentlich nicht braucht.

        Du kannst das Antworten auf Teile meiner Antwort auch lassen, wenn dir gerade mal absolut nichts zum Thema einfallen will :-)

        Entweder darf der Client nur für fehlgeschlagende HTML-Dokumente nach einem weiteren Versuch für Login+Passwd betteln oder der Server darf für bestimmte Dokumente kein 401 bringen (was prinzipiell geht, wenn man sich an den Quellen vergreift).

        Und dann?

        Ohne 401 Antwort wird sich der Client m.E. auch nicht verpflichtet fuehlen, dem Server Zugangsdaten mitzuteilen, selbst wenn er sie haette.

        Vielleicht solltest du lieber zu einem andern Verfahren als HTTP Auth greifen, um bestimmte Inhalte zu schuetzen.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi,

          Und dann?

          Ohne 401 Antwort wird sich der Client m.E. auch nicht verpflichtet fuehlen, dem Server Zugangsdaten mitzuteilen, selbst wenn er sie haette.

          Vielleicht solltest du lieber zu einem andern Verfahren als HTTP Auth greifen, um bestimmte Inhalte zu schuetzen.

          Welche anderen Verfahren gibt es?

          Ich stehe z.Z. in Indien und will an den Baikalsee. Es gibt vielleicht 20 Startwege, von denen ich vielleicht 35% kenne. Deswegen ist das Verwenden einer Suchmaschine nicht sonderlich sinnvoll. Das gleiche gilt für Buchliteratur. Ach so: So einfach wie möglich, so einfach wie nötig. Kein Flash. Client: Einfacher Webbrowser. Server: Keine 5 Programmpakete und 5 neuen Scriptsprachen a la PHP und Perl.

          1. Hi,

            Vielleicht solltest du lieber zu einem andern Verfahren als HTTP Auth greifen, um bestimmte Inhalte zu schuetzen.

            Welche anderen Verfahren gibt es?

            Z.B. ein Script zu nutzen, um zu pruefen, ob der Benutzer berechtigt ist, einen bestimmten Inhalt abzurufen, und dementsprechend entweder diesen Inhalt, oder eine alternative Fehlermeldung auszuliefern.
            Laesst sich huebsch mit Sessions kombinieren, um einen "eingeloggt"-Status und ggf. noch eine bestimmte Benutzergruppe o.ae. auch anderen Scriptinstanzen ohne erneute Authentifizierung zugaenglich zu machen.

            Ach so: So einfach wie möglich, so einfach wie nötig. Kein Flash. Client: Einfacher Webbrowser. Server: Keine 5 Programmpakete und 5 neuen Scriptsprachen a la PHP und Perl.

            Keine Angst - eine deiner Wahl, plus ein wenig Einarbeitung in diese, wird reichen.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Hi,

              »» > Vielleicht solltest du lieber zu einem andern Verfahren als HTTP Auth greifen, um bestimmte Inhalte zu schuetzen.
              »» >
              »» Welche anderen Verfahren gibt es?

              Z.B. ein Script zu nutzen, um zu pruefen, ob der Benutzer berechtigt ist, einen bestimmten Inhalt abzurufen, und dementsprechend entweder diesen Inhalt, oder eine alternative Fehlermeldung auszuliefern.
              Laesst sich huebsch mit Sessions kombinieren, um einen "eingeloggt"-Status und ggf. noch eine bestimmte Benutzergruppe o.ae. auch anderen Scriptinstanzen ohne erneute Authentifizierung zugaenglich zu machen.

              »» Ach so: So einfach wie möglich, so einfach wie nötig. Kein Flash. Client: Einfacher Webbrowser. Server: Keine 5 Programmpakete und 5 neuen Scriptsprachen a la PHP und Perl.

              Keine Angst - eine deiner Wahl, plus ein wenig Einarbeitung in diese, wird reichen.

              So, Script statt statischen HTML-Code.
              Sobald ich den auskommentierten Code auch nur eine Zeile einkommentiere, erhalte ich eine leere Seite.
              Wie debuggt man Javascript?

              <script language="JavaScript">
              <!--

              function Zugreifbar ( Pfad )
              {
                var oRequest ;

              oRequest = new XMLHttpRequest() ;

              //oRequest.open('GET', url, true);   // false und true probiert
                //oRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                //oRequest.send(null);

              if  ( oRequest.status == 200 )
              return true ;
                else
              return false ;
              }

              function DirectoryLine ( Beschreibung, Farbe, Datum, Weite, Hoehe, AName, Pfad )
              {
                document.write ( '<tr>\n' ) ;
                document.write ( '  <td align="left" valign="top" bgcolor="' + Farbe + '">' + Beschreibung + '</td>\n' ) ;
                document.write ( '  <td align="left" valign="top" bgcolor="' + Farbe + '">' + Datum        + '</td>\n' ) ;
                document.write ( '  <td align="left" valign="top" bgcolor="' + Farbe + '">&nbsp;&nbsp;<a name="' + AName + '"></a><a href="' + Pfad  + '/.tiny/thumbnails.html">[winzig]</a>&nbsp;&nbsp;<a href="' + Pfad  + '/.small/thumbnails.html">[klein]</a>&nbsp;&nbsp;<a href="' + Pfad  + '/.medium/thumbnails.html">[mittel]</a>&nbsp;&nbsp;<a href="' + Pfad  + '/.large/thumbnails.html">[groß]</a>&nbsp;&nbsp;</td>\n' ) ;
                if ( Zugreifbar ( Pfad + '/.tiny/index.jpg' ) == true )
                {
                  document.write ( '  <td align="left" valign="top" bgcolor="' + Farbe + '"><img src="' + Pfad + '/.tiny/index.jpg"' );
                  if ( Weite > 0 ) document.write ( ' width="'  + Weite + '"' ) ;
                  if ( Hoehe > 0 ) document.write ( ' height="' + Hoehe + '"' ) ;
                  document.write ( '></img></td>\n' ) ;
                }
                else
                {
                  document.write ( '  <td></td>\n' ) ;
                }
                document.write ( '</tr>\n' ) ;
              }

              ... Hier 300 Aufrufe von DirectoryLine.

              Der Code ist gegenüber HTML-Code nur noch 40% so groß und lädt sinnvoller (Tabelle ist sofort da, erst dann werden die Bildchen geladen, bei reinem HTML bekämpft sich die Basisseite und die Bildchen trotz width/height-Attributen der Bilder)

              Funktion Zugreifbar(), wie muß man die schreiben?
              Mit der chinesischen Affenmethode brauche ich zu lange ;-)

              1. Hi,

                So, Script statt statischen HTML-Code.

                Ich meinte schon was *serverseitiges* ...

                Sobald ich den auskommentierten Code auch nur eine Zeile einkommentiere, erhalte ich eine leere Seite.
                Wie debuggt man Javascript?

                Als allererstes Mal per Blick in die JavaScript-Konsole eines vernuenftigen Browsers (bspw. FireFox).

                Funktion Zugreifbar(), wie muß man die schreiben?

                Das kaeme darauf an, was sie machen soll.

                Mit der chinesischen Affenmethode brauche ich zu lange ;-)

                Mit der ich-such-mir-irgendwas-aus-dem-WWW-und-baue-es-ohne-zu-verstehen-was-es-eigentlich-ist-ein-Methode kommt man selten weiter.

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. Hi,

                  »» So, Script statt statischen HTML-Code.

                  Ich meinte schon was *serverseitiges* ...

                  »» Sobald ich den auskommentierten Code auch nur eine Zeile einkommentiere, erhalte ich eine leere Seite.
                  »» Wie debuggt man Javascript?

                  Als allererstes Mal per Blick in die JavaScript-Konsole eines vernuenftigen Browsers (bspw. FireFox).

                  Die habe ich mittlerweile gefunden. MS VS 8.0 benutze ich als Debugger.
                  Lösung war, erst den Wert einer Variable zuzuweisen und diese zu vergleichen.

                  »» Funktion Zugreifbar(), wie muß man die schreiben?

                  Das kaeme darauf an, was sie machen soll.

                  true zurückliefern, wenn ein socket() + connect() + send()
                  ein "HTTP/x.x 200 OK" liefert, sonst ein false.

                  Mit dem gesammelten Wissen, ohne weitere Benutzerinteraktionen.
                  Zur Not ein false zuviel.

                  »» Mit der chinesischen Affenmethode brauche ich zu lange ;-)

                  Mit der ich-such-mir-irgendwas-aus-dem-WWW-und-baue-es-ohne-zu-verstehen-was-es-eigentlich-ist-ein-Methode kommt man selten weiter.

                  Ich bin nicht blöd.

                  Aber mit der ich-studier-erst-mal-alles-und-fang-dann-an-Methode bin ich bis jetzt immer zuverlässig verreckt. Mit der klein-anfangen-und-dann-bis-zur-perfektion-optimieren bin ich bis jetzt immer zuverlässig vorangekommen.

                  Das Problem ist, daß ich nicht weiß, welcher Weg zu gehen ist, wenn man Webbrowser+was zusätzliches als Weg gewählt hat. Der Suchbaum für die Grundsatzentscheidungen ist noch viel zu groß. Eine eigene Applikation könnte ich schreiben, die Beschränkung auf einen Webbrowser erzeugt aber eine Menge Einschränkungen, die wie UFOs auftauchen.

                  Ich meinte schon was *serverseitiges* ...

                  Auf dem Server läuft Apache 2.2 und ich kann Daten in ein Basisverzeichnis laden. Die Authorisierung erfolgt über Login/Passwort-Paare, die ich von
                  einem anderen Server bekomme. Ich weiß nicht, was in meinem Einflußbereich liegt. Ich weiß nicht einmal, ob es überhaupt einen Weg gibt.

                  Deswegen würde ich gern erst mal was lauffähiges haben und dann nach eleganteren Alternativen suchen als nach einer Lösung zu suchen, von der
                  ich mir nicht sicher bin, ob es sie gibt und wenn es sie gibt, wo etwa sie liegt.

                  1. Hi,

                    »» Funktion Zugreifbar(), wie muß man die schreiben?

                    Das kaeme darauf an, was sie machen soll.

                    true zurückliefern, wenn ein socket() + connect() + send()
                    ein "HTTP/x.x 200 OK" liefert, sonst ein false.

                    Socket und Connect sind Begriffe, die in Verbindung mit JavaScript eher weniger sinnvoll Verwendung finden.

                    Ja, man kann zwar per XMLHttpRequest HTTP-Requests absetzen (oh Wunder ...) - aber wenn die Ressource in einem per HTTP Auth geschuetzten Bereich liegt und keine passenden Credentials bereits mit uebergeben wurden, dann wird der Browser sofort wieder nach ihnen fragen.

                    Das Problem ist, daß ich nicht weiß, welcher Weg zu gehen ist, wenn man Webbrowser+was zusätzliches als Weg gewählt hat.

                    Das "Zusaetzliche" ist erst mal sinnvoll zu waehlen.

                    Auf dem Server läuft Apache 2.2 und ich kann Daten in ein Basisverzeichnis laden. Die Authorisierung erfolgt über Login/Passwort-Paare, die ich von einem anderen Server bekomme.

                    Was heisst in dem Zusammenhang, dass du sie von einem anderen Server bekommst?

                    Ich weiß nicht, was in meinem Einflußbereich liegt.

                    Dann ist das eine der Fragen, die zuerst geklaert werden muessen.

                    Mein Vorschlag war ja, HTTP Auth gar nicht zu verwenden (weil ich damit keinen Weg sehe, das beschriebene Problem zu umgehen), und stattdessen eine andere Methode der Authentifizierung und damit des Zugriffsschutzes zu waehlen.
                    Aber dazu muss natuerlich vorher erst mal abgeklaert werden, was denn als Alternative ueberhaupt erst mal theoretisch und dann praktisch in Frage kaeme.

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“