Autor |
Beitrag |
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 07.05.17 01:55
Leider hatte ich nun schon mehrfach das Problem, daß die IE-internen Methoden sich nicht innerhalb von php einsetzen lassen.
PHP-Quelltext 1:
| echo '<!--[if lte IE 6]>'.exit.'<![endif]-->'; |
führt ebenso immer zu sofortigem (statt browserabhängigem) Exit, wie auch
HTML-Dokument
Und if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') == true ) {exit;} geht auch nicht, denn es reagiert auf jede IE-Version.
Kennt jemand eine Möglichkeit OHNE JavaScript ?
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 07.05.17 07:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 07.05.17 09:36
Also dass eine HTML-Browserweiche in PHP nicht funktioniert, sollte ja nicht wundern. HTML wird vom Browser interpretiert, PHP viel früher vom Server. Für PHP sind das einfach irgendwelche Strings, die er ausgeben soll, was das ist, ist dem egal.
Die reine PHP-Version braucht halt den richtigen User-Agent-String, den kann man sich aber ergooglen. strpos gibt übrigens einen int und keinen Boolean zurück.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Für diesen Beitrag haben gedankt: FinnO
|
|
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 09.05.17 04:12
@Frühlingsrolle: Daß die NEGATION (wie Du sie als Beispiel gibst) nicht funktionieren kann, ist aus dem von Dir genannten Grund klar. Aber das wäre nicht das Problem, sowas läßt sich anders umgehen. Wenn etwas für den IE ungeeignet ist, blende ich das in der Regel dadurch aus, daß ich vor und nach der entsprechenden Sequenz jeweils eine IE-interne Auswertung des Browers einfüge (die von anderen Browsern ja wie ein Kommentar übersprungen wird) und beim ersten dieser beiden Teile dann "display=none" setze. Das geht bei optischen Sachen, aber nicht, wenn der Code gar nicht ausgeführt werden darf und dann darum ein php-exit erfolgen müßte.
@Christian: Was die Frage der Interpretation durch PHP betrifft, so gebe ich zu, daß ich daran nicht gedacht hatte. ABER wieso überspringt PHP diese Anweisungen, statt sie komplett (wie bei HTML üblich) als Kommentar zu werten und genau so an den Browser weiterzuleiten? Das wäre eine bessere Formulierung meiner Fragestellung gewesen.
Stimmt, strpos dürfte kein boolean liefern. Aber ich hatte diesen einfachen Test irgendwoher übernommen und er hat funktioniert, bloß nicht hinsichtlich der Versionsnummer, sondern eben nur ob es sich um einen IE handelt.
Na, mal sehen, irgendwo werde ich schon was finden, um aus dem User-Agent auch die Version zu erhalten. Blöd nur, daß sich diese User-Agent-Strings auch fälschen lassen. Ich setze beispielsweise gerne mal beim Aufsuchen bestimmter Websites einen mit der Bezeichnung "Bundestrojaner" ...
Die einzig zuverlässige Kennung ist wirklich das, was Microsoft selbst eingebaut hat. Es muß doch irgendeinen Weg geben, diese Erkennungsmethode so zu verarbeiten, daß der Browser diese Information genauso an den Server weiterleitet, daß der damit was anfangen kann. Was ist denn der User-Agent anderes? Der wird schließlich auch vom Server (also in der Regel per php) ausgewertet. Könnte man nicht die vom IE gelieferte Information so "verpacken", daß sie quasi wie der User-Agent an den Server geschickt wird, um da verarbeitet zu werden?
|
|
jaenicke
Beiträge: 19289
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 09.05.17 05:35
delnu hat folgendes geschrieben : | Was ist denn der User-Agent anderes? Der wird schließlich auch vom Server (also in der Regel per php) ausgewertet. Könnte man nicht die vom IE gelieferte Information so "verpacken", daß sie quasi wie der User-Agent an den Server geschickt wird, um da verarbeitet zu werden? |
Christians Wink mit dem Zaunpfahl hast du wohl übersehen.
USER AGENT LIST
--> www.useragentstring....me=Internet+Explorer
Auf der Seite kannst du genau nachschauen welche User Agents von welchem Browser stammen.
|
|
jfheins
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Di 09.05.17 18:14
delnu hat folgendes geschrieben : | @Christian: Was die Frage der Interpretation durch PHP betrifft, so gebe ich zu, daß ich daran nicht gedacht hatte. ABER wieso überspringt PHP diese Anweisungen, statt sie komplett (wie bei HTML üblich) als Kommentar zu werten und genau so an den Browser weiterzuleiten? Das wäre eine bessere Formulierung meiner Fragestellung gewesen. |
PHP interpretiert kein HTML! Du könntest genau so gut beliebige Zeichenketten dahin schreiben. Der Aufruf läuft ja ungefähr so ab:
- Du tippst die URL in den Browser (z.B. Chrome) ein.
- Der sendet den Request an den Server.
- Der Server sieht an der Dateiendung "Aha, das ist ein PHP Dokument!" und ruft PHP auf, mit der Datei als Argument.
- PHP parst die Datei nach den PHP Tags (<?php und ?>).
a) Alles außerhalb der PHP-Tags wird einfach direkt an den Browser geschickt.
b) Alles innerhalb der Tags wird gemäß PHP Syntax interpretiert und nur eventuelle Ausgaben werden an den Browser geschickt.
- Der Browser bekommt ein Dokument, in dem kein PHP Code mehr drin ist
- Der Browser interpretiert die HTML-Tags, CSS und Javascript so, dass dir (in den meisten Fällen) eine Webseite angezeigt wird.
Es kann also nicht funktionieren, dass HTML-Kommentare Auswirkungen auf den PHP-Programmfluss haben, da das eine vollständig vor dem anderen passiert (und Zeitreisen bei HTTP standardmäßig deaktiviert sind )
Eigentliche Lektion: Verzichte soweit es geht auf Browserweichen!
Nicht ist nerviger als auf eine Seite zu kommen, die einen aussperrt weil man einen "ungetesteten" Browser hat, auf dem vll. nicht alles genau "richtig" dargestellt wird. Allerhöchstens wäre ein Hinweis OK, wie bspw. "Ihr Browser (IE 6) wird nicht unterstützt, wir empfehlen xyz zur Benutzung unserer Website"
Für diesen Beitrag haben gedankt: doublecross
|
|
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 11.05.17 00:18
@jaenicke: Nein, ich habe das NICHT übersehen. Im Gegenteil wies ich darauf hin, daß ich mitunter selbst den User Agent fälsche. Das heißt aber im Klartext: Der User-Agent ist KEINE Garantie dafür, daß dadurch der benutzte Browser erkannt wird. Nur die IE-eigene Kennung kann zuverlässig erkennen, ob es sich um einen IE handelt. Genau das schrieb ich und es ist Fakt.
@jfheins: Danke für die ausführliche Erläuterung der einzelnen Schritte des Funktionsablaufes. Trotzdem bin ich der Auffassung, daß es eine Möglichkeit geben muß, die IE-eigene-Auswertung irgendwie dazu zu nutzen, eine entsprechende Reaktion zu bewirken.
Wenn ich beispielsweise ganz normal html nehme und schreibe:
<!--[if lte IE 6]><b style="display="none"><![endif]-->
dann den Teil ausführen lasse, der mit normalen Browsern funktioniert und danach
<!--[if lte IE 6]></b><![endif]-->
dann wird bei einem ungeeigneten Browser dieser Teil eben nicht dargestellt.
Dafür, wo ich das benötige, reicht das so aber nicht, denn die Sequenz soll nicht nur nicht dargestellt werden, sondern es soll dann komplett aus dem Prozeß ausgestiegen werden.
Klar wäre es schön, ohne Browserweichen auskommen zu können. Aber abgesehen von den vielen Fehlern, die der IE verursacht, ist es nunmal leider so, daß viele Websites die armen IE-Nutzer komplett aussperren und genau das will ich ja vermeiden und da helfen leider nur Browserweichen. Würde ich auf meiner Verlinkungswebsite freelinks.usa.cc keine Browserweichen nutzen, würde sich jeder IE-Nutzer ärgern, daß sehr viele intern verlinkte Websites entweder gar nicht funktionieren oder völlig zerknallt rüberkommen. Die Schuld bekämen nicht die Leute mit den fehlerhaften Websites, sondern man würde sie mir geben. Außerdem bin ich der Ansicht, gute Programmierer weichen schlechten Browsern nicht aus, sondern sehen eine Herausforderung darin, etwas so zu machen, daß es mit allen Browsern funktioniert. Wenn also ein alter Browser genau die Lösung nicht akzeptiert, die im Normalfall syntaktisch richtig wäre, sucht man zuerst nach Alternativen, die dann eben auch mit anderen Browsern funktionieren würden. Beispielsweise störensich andere Browser nicht daran, wenn man die nur beim IE nötige Style-Anweisung "overflow:visible" bei Buttons einsetzt, damit der IE sich bei deren Breite so beschränkt, wie es vernünftige Browser tun. Auch das globale "* {margin:0; pading:0}", das nur beim IE nötig ist, stört bei vielen Browsern nicht wirklich. Aber es gibt eben Sachen, da findet man nichts Passendes. Und da muß man den IE dann eben für die entsprechende Funktion aussperren. Ich habe es nun so gelöst, dann eben für diese eine Sache den IE komplett (also in jeder Version) auszusperren - also eben doch nur per Browserweise möglich. Selbst ein Hinweis, daß der Browser ungeeignet ist, setzt zwangsläufig eine vorherige Browsererkennung voraus. Dann muß man also nicht so faul sein, die Nutzer komplett zu blockieren, statt ihnen wenigstens eine Teilnutzung zu ermöglichen.
Microsofts Weg, sich aus der Verantwortung zu ziehen und neuere IE-Versionen nicht mehr für alte Betriebssysteme bereitzustellen, hat keine technischen Gründe, sondern die wollen ihre neuen Mist-Betriebssysteme verkaufen. Was die unter Sicherheit verstehen, ist jedenfalls nicht Schutz der Anwender. Für mich sähe Sicherheit so aus, daß ich mit meinen Computern das programmieren kann, was ich will. Dazu würde auch gehören, z.B. noch die unter DOS bekannten Interrupts nutzen zu dürfen. Ich habe mir z.B. XP erst geleistet, als es verramscht wurde und fast alle meine danach für je unter 20 € gebraucht erworbenen Computer (im internen Netz sind es momentan ca. 6 von 12) damit ausgestattet. Alle hatten sogar noch gültige Lizenzaufkleber. XP ist für mich ein Kompromiss. Wenn die Technik durch DOS unterstützt würde, wäre ich lieber bei DOS geblieben. Natürlich KEINS von Microsoft.
Weil hier offensichtlich keiner eine wirkliche Lösung für die aufgeworfene Frage kennt - ich wies darauf hin, daß der Useragent unzuverlässig ist - muß ich das Thema leider als erledigt betrachten und werde nicht mehr nach neuen Antworten gucken. Frage beantwortet kann ich aber deshalb auch nicht anklicken.
Danke an alle für die rege Beteiligung, auch wenn sie leider nicht zielführend war.
|
|
jaenicke
Beiträge: 19289
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 11.05.17 06:56
delnu hat folgendes geschrieben : | Weil hier offensichtlich keiner eine wirkliche Lösung für die aufgeworfene Frage kennt - ich wies darauf hin, daß der Useragent unzuverlässig ist - muß ich das Thema leider als erledigt betrachten und werde nicht mehr nach neuen Antworten gucken. Frage beantwortet kann ich aber deshalb auch nicht anklicken.
Danke an alle für die rege Beteiligung, auch wenn sie leider nicht zielführend war. |
Das liegt daran, dass es schlicht keine Lösung in der Form gibt, wie du sie dir vorstellst.
Der Ablauf ist nun einmal, dass der Browser an den Server beim Aufruf einer URL nur bestimmte Informationen übermittelt. Und das sind der User Agent, ggf. bestehende Cookies usw., aber nicht mehr.
Bei darauf folgenden Seitenaufrufen kannst du natürlich durch unterschiedliche Links je nach Browser usw. genau mit der von dir genannten Technik dafür sorgen, dass der Server anhand von speziellen Parametern oder ähnlichem mitbekommt, dass eine solche clientseitige Bedingung erfüllt war. Aber beim ersten Seitenaufruf über eine allgemeine URL ist das schlicht nicht möglich.
Du könntest höchstens eine Seite vorschalten, die bei bestimmten Bedingungen die Seite mit einem bestimmten Parameter neu lädt.
Davon abgesehen verstehe ich aber auch nicht so recht wofür du das serverseitig unbedingt brauchst. Der normale Ablauf einer Browserweiche ist, dass der Server alles ausliefert, aber bestimmte Teile durch den Client nicht oder anders interpretiert werden.
Sprich der Server liefert (Pseudocode):
Quelltext 1: 2: 3: 4: 5:
| echo a echo b echo <!--[if lte IE 6]> echo blub echo <![endif]--> | Der Browser ignoriert dann blub schlicht.
Was du machen willst: Quelltext 1: 2: 3: 4: 5: 6:
| echo a echo b <!--[if lte IE 6]> exit <![endif]--> echo blub | Sprich blub würde gar nicht am Client ankommen.
Ich frage mich nur weshalb?
delnu hat folgendes geschrieben : | Microsofts Weg, sich aus der Verantwortung zu ziehen und neuere IE-Versionen nicht mehr für alte Betriebssysteme bereitzustellen, hat keine technischen Gründe, sondern die wollen ihre neuen Mist-Betriebssysteme verkaufen. |
Ich glaube dir ist nicht klar was sich an den technischen Grundlagen in der Zwischenzeit verändert hat und was da alles an neuen Möglichkeiten hinzugekommen ist.
Für uns wird es auch zunehmend schwer noch Workarounds für ältere Systeme zu schaffen, die ab Vista mit wenigen Zeilen Code erledigt wären. Es gibt komplett neue APIs wie die Core Audio APIs usw., die es unter XP und früher eben noch nicht gab.
Man muss dafür dann immer zusätzlichen Ballast mitschleppen und natürlich auch zuerst implementieren und testen. Für den geringen Prozentsatz an Nutzern lohnt sich das schlicht meistens nicht.
delnu hat folgendes geschrieben : | Was die unter Sicherheit verstehen, ist jedenfalls nicht Schutz der Anwender. Für mich sähe Sicherheit so aus, daß ich mit meinen Computern das programmieren kann, was ich will. Dazu würde auch gehören, z.B. noch die unter DOS bekannten Interrupts nutzen zu dürfen. |
Du widersprichst dir selbst. Wenn ein Angreifer alles programmieren kann, was er will, hat das nichts mit Sicherheit zu tun.
Und dass man sich nicht mehr mit Interrupts (schon für die Tastatureingabe mit reinem Assembler z.B.) und manuellen Einrichtungen schon alleine der Soundkarte für einzelne Programme (und dort die entsprechende Implementierung) herumärgern muss, daran kann ich nichts Negatives finden. Wie lange habe ich da früher auch herumprobieren müssen bis alles ging... von der Ansteuerung im Programm ganz zu schweigen...
Für diesen Beitrag haben gedankt: Christian S., icho2099
|
|
delnu
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 15.05.17 02:18
@jaenicke: Daß ich hier nochmal geguckt habe, war eigentlich ein Versehen.
Aber nun doch noch mal zu Deinen Ausführungen dies:
Zitat: | Du widersprichst dir selbst. Wenn ein Angreifer alles programmieren kann, was er will, hat das nichts mit Sicherheit zu tun. |
Falsch ! ICH will programmieren können, was ICH will. Ich schrieb nicht, daß dies von außen bzw. durch andere möglich sein soll. Das Microsoft-"Sicherheitskonzept" basiert auf falscher Logik, was damit zu tun hat, daß sie Web-Zugriffe direkt ins Betriebs-System integriert haben, statt es zu kapseln. Wenn ich lokal programmiere, kann keiner von außen dran, wenn es keine Zugriffsmöglichkeiten von außerhalb gibt. Klar, es gibt auch Schadsoftware, die nicht über das Internet kommt. Aber da liegt es doch dann am User selbst, ob sich z.B. Leute aus Dummheit jeden Müll installieren. Ich komme z.B. schon jahrezehntelang OHNE Virenscanner klar, ohne jemals Probleme mit Schadsoftware gehabt zu haben, eben weil ich weiß, was ich tue. Microsoft bevormundet aber "mündige" User.
Zitat: | Und dass man sich nicht mehr mit Interrupts (schon für die Tastatureingabe mit reinem Assembler z.B.) und manuellen Einrichtungen schon alleine der Soundkarte für einzelne Programme (und dort die entsprechende Implementierung) herumärgern muss, daran kann ich nichts Negatives finden. |
Ich empfinde es als ein rumärgern, wenn nichts funktioniert, weil Microsoft es blockt. Ich habe gerne mit Assembler einfachere und kürzere Methoden erstellt, als es z.B. Turbo Pascal gemacht hat. Die Bibliotheken und was nicht alles, sind fürchterlich aufgebläht und enthalten Müll, den man nicht braucht. Ich denke da auch mit Schrecken an Clipper, bei dem jedes Leerzeichen zuviel in Quelltext-Kommentaren die Libraries verteufelt stark aufblähte.
Zitat: | Für uns wird es auch zunehmend schwer noch Workarounds für ältere Systeme zu schaffen, die ab Vista mit wenigen Zeilen Code erledigt wären. Es gibt komplett neue APIs wie die Core Audio APIs usw., die es unter XP und früher eben noch nicht gab.
Man muss dafür dann immer zusätzlichen Ballast mitschleppen und natürlich auch zuerst implementieren und testen. Für den geringen Prozentsatz an Nutzern lohnt sich das schlicht meistens nicht.
|
Die "wenigen Zeilen Code" entsprechen einer Unmenge unnützen Festplattenspeicherverbrauchs. Mehr geschriebener Code bedeutet meiner Erfahrung nach IMMER kompaktere Programme. Unnützer Ballast entsteht durch vermeintliche Vereinfachung, während vernünftig programmierte API's jederzeit sogar noch für Windows 98 SE bereit gestellt werden könnten. Aber Microsoft macht sowas natürlich allein deshalb nicht, weil die lieber ihren neuen Schrott verkaufen wollen.
Zitat: | Du könntest höchstens eine Seite vorschalten, die bei bestimmten Bedingungen die Seite mit einem bestimmten Parameter neu lädt. |
Genau darum ging es ja. Bestimmte php-Anweisungen sollen mit dem IE6 gar nicht erst ausgeführt werden und genau darum soll dieses vorzeitige exit erfolgen.
Aber wie dem auch sei: Mir scheint, daß leider auch hier im Forum bestimmte fortschrittliche Programmiertechniken, die eben gerade NICHT z.B. durch JS-Bibliotheken etc. durchführbar sind, anscheinend kaum jemand kennt.
Beispielsweise benutze ich auch schon lange keine normalen externen CSS-Dateien mehr, sondern immer PHP.CSS, um dann bereits innerhalb dieser externen CSS-Dateien PHP-Befehle durchführen zu können. Mich würde nicht wundern, wenn die Leute, die sich fragen, warum ich irgendwas machen möchte, nun auch verwundert sind, wozu denn PHP in CSS.
So hat jeder seine Spezialgebiete und zu meinen gehört es eben, Wege zu suchen, die effektiver sind als vorgekaute, ausgelatschte "Standards".
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 15.05.17 18:07
Delnu hat das Forum auf eigenen Wunsch verlassen. Ich schließe daher diesen Thread, da weitere Antworten nicht sinnvoll sind.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|