iFrame HTTP Inhalt innerhalb einer HTTPS Seite

Hallo.

Im Zuge des Umstiegs auf HTTPS ist bei mir einiges kaputt gegangen. Ich konnte alles lösen bis auf eine Sache: das Bild einiger der Überwachungskameras wird nicht mehr wie früher angezeigt. Der Grund: es ist nicht erlaubt unverschlüsselte Inhalte (HTTP) innerhalb von iFrame aufzurufen, da die Hauptseite verschlüsselt ist (HTTPS nutzt). Leider unterstützen diese Kameras kein HTTPS, es kann nur HTTP verwendet werden. Zudem muss am Anfang die Bild-URL direkt in iFrame stehen, damit entsprechende Kennwortabfrage im Browser angezeigt wird. Die Kennwortabfrage nutzt WWW-Auth Basic. Das sind nun Vorgaben die ich nicht ändern kann.

Es ist möglich das src in <img /> per JavaScript zu ändern und http ansteuern, aber dann werde ich nicht mehr nach dem Kennwort gefragt. Ich bekomme eine (401?) Fehlermeldung im Log der Console angezeigt.

Ich will auch keinen Proxy! Ich will Bilder direkt abholen und nicht pbpaced.net sie holen lassen und mir zuzuschicken. Die Aktualisierungsgeschwindigkeiten sind einfach zu hoch (manche Kameras senden 20 FullHD Bilder pro Sekunde), das packt kein Server rechtzeitig um ein vernünftiges Echtzeitbild zu erhalten.

Ich bitte sehr um Hilfe. Mir sind leider die Ideen ausgegangen.

Gruß Markus

Die Kamerabild-URLs sind in einer Datenbank gespeichert und werden direkt im Dokument ausgegeben. Die ##[IP]## Platzhalter werden durch IP-Adressen ersetzt.

hauptseite.php

Zusammenfassung
<table class="GU">
<tbody>
<tr><td><b>Bild der &Uuml;berwachungskamera</b></td></tr>
<tr><td>
<input type="button" id="Einblenden_ID9" value="Einblenden" class="K S" onclick="javascript:Einblenden_ID9();"/>
<input type="button" id="Ausblenden_ID9" value="Ausblenden" class="K V" onclick="javascript:Ausblenden_ID9();"/>
<input type="button" id="Aktualisierung_ID9" value="Auto-Aktualisierung" class="K V" onclick="javascript:iFrameLaden_ID9();"/>
<input type="button" id="Benutzerdaten_ID9" value="Benutzerdaten Leeren" class="K V" onclick="javascript:AuthLeeren_ID9();"/>
</td></tr>
<tr><td><iframe width="640" height="480" border="0" scrolling="no" class="O V" id="iFrame_ID9" style="border:none; display:none;"></iframe></td></tr>
</tbody>
</table>

<style type="text/css">
input[type="button"].S { display:inline; }
input[type="button"].V { display:none; }
iframe.S { display:block; }
iframe.V { display:none; }
</style>

<script type="text/javascript" charset="UTF-8">
var uA_ID9=Browser_ID9(window.navigator.userAgent.toLowerCase());
if (uA_ID9==='IE' || uA_ID9==='Edge')
{ document.getElementById('Benutzerdaten_ID9').className='K S'; }

function Browser_ID9(uA) /* userAgent */
{
if (uA.indexOf('edge')!==-1) { return 'Edge'; }
if (uA.indexOf('edg')!==-1) { return 'Edge Chromium'; }
if (uA.indexOf('opr')!==-1 && !!window.opr) { return 'Opera'; }
if (uA.indexOf('chrome')!==-1 && !!window.chrome) { return 'Chromium'; }
if (uA.indexOf('trident')!==-1) { return 'IE'; }
if (uA.indexOf('firefox')!==-1) { return 'FireFox'; }
if (uA.indexOf('safari')!==-1) { return 'Safari'; }
return 'Unbekannt';
}

function Einblenden_ID9()
{
document.getElementById('Einblenden_ID9').className='K V';
document.getElementById('Ausblenden_ID9').className='K S';
	if (uA_ID9==='IE' || uA_ID9==='Edge')
	{ document.getElementById('Benutzerdaten_ID9').className='K V'; }
document.getElementById('iFrame_ID9').calssName='O S';
document.getElementById('iFrame_ID9').src='http://##[IP]##:65532/image/jpeg.cgi';
	if (uA_ID9==='FireFox' || uA_ID9==='Edge Chromium')
	{ document.getElementById('Aktualisierung_ID9').className='K S'; }
	else
	{ setTimeout('iFrameLaden_ID9()', 250); }
}

function Ausblenden_ID9()
{
    document.getElementById('Einblenden_ID9').className='K S';
    document.getElementById('Ausblenden_ID9').className='K V';
	if (uA_ID9==='IE' || uA_ID9==='Edge')
	{ document.getElementById('Benutzerdaten_ID9').className='K S'; }
    document.getElementById('iFrame_ID9').src='about:blank';
    document.getElementById('iFrame_ID9').className='O V';
    if (uA_ID9==='FireFox' || uA_ID9==='Edge Chromium')
    { document.getElementById('Aktualisierung_ID9').className='K V'; }
}

function iFrameLaden_ID9()
{
document.getElementById('Aktualisierung_ID9').className='K V';
document.getElementById('iFrame_ID9').src='./Kamerabild/?DateiPfad=http%3A%2F%2F##[IP]##%3A65532%2Fimage%2Fjpeg.cgi&X=640&Y=480&Z=50';
}

function AuthLeeren_ID9() // Nur IE und Edge(alt)
{
var Ergebnis;
	try { Ergebnis=document.execCommand('ClearAuthenticationCache', true); }
	catch(e) { ; }
	if (Ergebnis!==true)
    { alert('Das Löschen des HTTP-Auth Cache war erfolglos!'); }
}
</script>

kamerabild.php

Zusammenfassung
<?php
require_once('./../Bausteine/funktion_GetWert.php');
require_once('./../Bausteine/funktion_PostWert.php');
require_once('./../Bausteine/funktion_ZuInteger.php');

$DateiPfad=PostWert('DateiPfad'); if ($DateiPfad==='') { $DateiPfad=GetWert('DateiPfad'); }
$X=PostWert('X'); if ($X==='') { $X=GetWert('X'); }
$Y=PostWert('Y'); if ($Y==='') { $Y=GetWert('Y'); }
$Z=PostWert('Z'); if ($Z==='') { $Z=GetWert('Z'); }
    if (ZuInteger($Z)===false) { $Z=1000; }
    elseif ($Z<50) { $Z=50; } // Maximal 20 Bilder pro Sekunde
?><!DOCTYPE html>
<html>
<head>
<?php require('./../Bausteine/metadaten.php'); ?>
<meta http-equiv="refresh" content="600"/><!-- Behebt das Speicherleck-Problem. Löscht alle 10 Min. gesammelte Daten - nützlich im Dauerbetrieb! -->
<style type="text/css">
body { margin:0px; padding:0px; border:0px; overflow-x:hidden; overflow-y:hidden; }
img  { margin:0px; padding:0px; border:0px; }
</style>
<title>Kamerabild</title>
<?php
if ($DateiPfad!=='')
{
?>
<script type="text/javascript">
/* Bild erst laden und dann anzeigen, sonst ist dauernd eine Sanduhr zu sehen. */
function Kamerabilder()
{ setInterval('LadeBild()', <?php echo $Z; ?>); }
function LadeBild()
{
BildNeu=new Image();
BildNeu.src='<?php echo $DateiPfad; ?>?D=' + new Date().getTime() + '&Z=' + Math.random();
setTimeout('AktualisiereBild(BildNeu)', <?php echo $Z; ?>*0.8);
}
function AktualisiereBild(Bild)
{
BildElement=document.getElementById('Bild');
BildElement.src=Bild.src;
Bild=null;
}
</script>
<?php
}
?>
</head>
<?php
if ($DateiPfad==='')
{
?>
<body>
<span>Fehler: Der Dateipfad zum Bild fehlt.</span>
</body>
<?php
}
else
{
?>
<body onload="javascript:setTimeout('Kamerabilder()', 100);">
<img id="Bild" src="<?php echo $DateiPfad; ?>" <?php if ($X!==false) { ?>width="<?php echo $X; ?>" <?php } if ($Y!==false) { ?>height="<?php echo $Y; ?>"<?php } ?>/>
</body>
<?php
}
?>
</html>

Da du alle Ausweichmöglichkeiten ausgeschlossen hast, ist die einzige wirkliche Alternative den Provider des Kameradienstes zu kontaktieren und zu fragen ob die eine Adresse mit HTTPS bereitstellen können oder bereits haben.

So wie ich das verstanden habe nutzt du aktuell IP Adressen für die Iframe Adresse und HTTPS über IP ist zwar möglich aber außerordentlich selten. Es besteht also die Möglichkeit dass der Provider bereits HTTPS anbietet, du aber auf eine Domain umstellen musst damit es funktioniert.

Grüße
Balmung

Hallo.

Es handelt sich um ältere Überwachungskameras, neue Firmware wird es nicht geben. Die Kameras sind über HTTPS überhaupt nicht erreichbar. Es bleibt nur HTTP übrig. Auch das WebInterface der Kameras ist veraltet. Daher komme ich nicht an das Bildmaterial ran. Aus diesem Grund habe ich mir selbst eine Live-Bild-Präsentation gebastelt (der Quellkode ist teilweise oben zu sehen). Dies mit Bewegungserkennung und Auto-Aufnahme auf FTP reicht mir aus.

Nicht ganz. Die Bilder der Kameras können nicht verschlüsselt werden. Es soll zumindest unverschlüsselt funktionieren. Die Kameras bieten HTTPS Funktion nicht an.

Eine PHP Seite die auf bplaced liegt wird mit HTTPS abgeholt. Sie beinhaltet ein iFrame Element.
Der iFrame Inhalt wird anfangs mit Bild (CGI mit ContentType: JPEG) danach mit HTML gefüllt – ein Einzelbild der Kamera (damit Kennwortabfrage erscheint) danach ein HTML mit JavaScript, welches periodisch Bilder abholt und sie im iFrame anzeigt. Ich nutze IP Adressen und Ports um Kameras zu erreichen jedoch nur über HTTP (ohne S).

Als FreeStyle Benutzer konnte ich früher nur HTTP nutzen. Die Kamerabilder konnten (unverschlüsselt) empfangen werden (HTTP bplaced-Seite und HTTP Bild in iFrame). Nun als bplaced Pro Benutzer wird automatisch alles in HTTPS umgewandelt. HTTPS bplaced-Seite und HTTP Bild in iFrame das geht nicht gut. Allgemein ist es prima wenn alles in HTTPS umgewandelt wird. Aber mit einer Ausnahme für die Kameraseite bitte.

Da der unverschlüsselte Inhalt (Kamerabild) nicht in iFrame gezeigt werden kann, werde ich wohl einen anderen Weg beschreiten müssen. Es wird vermutlich auf ein Popup oder neue Seite im Tab auslaufen. Diese soll HTTP nutzen nicht HTTPS. Ich bekomme die Bilder der Kameras nicht verschlüsselt, das ist mir klar. Es soll alles so ähnlich wie früher unverschlüsselt funktionieren. Tab Inhalt mit HTTP bplaced-Seite und HTTP Bild in iFrame.

Nun kommt mein Problemchen.

Wie deaktiviere ich HTTPS für eine einzige PHP Seite? (zum Beispiel: test.php) Wenn ich jetzt eine beliebige PHP aufrufe wird sofort HTTPS verwendet. Für den parametrisierten Aufruf meiner kamerabild.php (GET) darf kein HTTPS genutzt werden! Nur HTTP.


Meine neuen Kameras haben einen eigenen DynDNS Namen und das passende Zertifikat. Sie unterstützen auch die Verschlüsselung – HTTPS ist möglich. Für diese Kameras ist ein iFrame HTTPS Inhalt (Bild) auf einer HTTPS Seite möglich. Bei den älteren Kameras muss ich leider tricksen!

Gruß Markus

Achso, d.h. die Kameras selbst bieten ein HTTP Interface an.

Ich weiß leider nicht ob man bei bplaced das HTTPS für eine einzelne Seite deaktivieren kann.

Du schriebst am Anfang:

Es ist möglich das src in <img /> per JavaScript zu ändern und http ansteuern, aber dann werde ich nicht mehr nach dem Kennwort gefragt

Theoretisch könntest du hier auch dein PHP Script die Passwortabfrage machen lassen, und dann in der Bild-URL für den img Tag direkt Benutzer und Passwort mit ausgeben. Das sieht dann etwa so aus:

<img src="http://username:password@ip-adresse/pfad/zum/bild">

Das Passwort ist dann im Seitenquelltext sichtbar, aber theoretisch sollten nur diejenigen, die am PHP auth vorbeigekommen sind, das sehen können.

Dies funktioniert leider nur bei einigen wenigen Browsern.
Wie auch immer ich teste es mal bei der Gelegenheit.
Wenn ich es richtig weiss, sollen künftig derartige Aufrufe keine Zugangsdaten mehr übermitteln.