Eigene Session-IDs in einem Modul funktionieren nicht!?

Begonnen von MikePapa, 05 März 2005, 13:17:55

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

MikePapa

Hallo,

ich "spiele" gerade mit einigen Möglichkeiten, um Bilder nur darstellen zu lassen, wenn sie auch von meiner HP aus aufgerufen wurden.
Eine Variante beinhaltet den Einsatz von Session IDs.

Die Standalone-Fassung, also 2 php-Dateien ohne das vkpMX2, funktioniert einwandfrei.
Sobald ich allerdings diese als Modul einbinde,  erhalte ich keine Bilderanzeige mehr.

Kurzer Auszug der auszuführenden Datei:

session_start();

// Challenge-ID
mt_srand((double)microtime()*1000000);
$random = mt_rand();
$random = md5(uniqid($random,TRUE));
$sess_challenge_id = $random;

if(!session_is_registered("sess_challenge_id")):
  session_register("sess_challenge_id");
endif;

Als IMG wird dann nicht sofort das Bild, sondern die andere Datei ALS Bild (mit der ID als Anhang) aufgerufen, welche wie folgt beginnt:




session_start();

if(session_is_registered("sess_challenge_id")
and $sess_challenge_id == $challenge):

  session_unregister("sess_challenge_id");

Wenn diese Bedingung erfüllt ist, wird das korrekte Bild dargestellt, ansonsten ein Blank-Gif... welches im Falle meiner MX-Einbindung leider auch dargestellt wird.

Kann ich im MX-System keine eigene Session IDs  verwenden??


Gruß

MP

NeMeSiSX2LC

Das müsste doch mit den Function SessionSetVar und GetVar aus MX gehen. Musste mal hier im Forum suchen Tora hatte da mal eine Function Liste reingestellt

Ach und session_start() kann im MX ruhig weggelassen werden da es schon eine Session Startet.

Was das übergeben per URL angeht ka glaub aber MX unterdrück das anhängen...
CMS-Version: pragmaMx 0.1.8, 1.20.4.5/2006-03-10     
PHP-Version: 5.1.2
MySQL-Version: 5.0.15-max-log
Server-Version: Apache/2.0.55
phpMyAdmin-Version: 2.7.0-pl1

MikePapa

OK, ich habe die Quelle des Codes nun gefunden:  http://www.drweb.de/php/php_bilderklau.shtml


Ich habe den Bildaufruf nun abgeändert:

Anstatt
printf("<td width=\"%s\" height=\"%s\" background=\"http://www.militarypolice.de/modules/ranks/read_image.php?img=%s&challenge=%s\">",$width,$height,rawurlencode($pic),$sess_challenge_id);
nutze ich nun
printf("<td width=\"%s\" height=\"%s\" background=\"modules.php?name=ranks&file=read_image&img=%s&challenge=%s\">",$width,$height,rawurlencode($pic),$sess_challenge_id);

DANN scheint es zu funktionieren!!


Ich wollte allerdings nicht den "Umweg" über die modules.php gehen, um die Ladezeiten deutlich zu verringern. Ohne die Session-IDs ist es auch problemlos möglich, den zuerst genannten Aufruf zu nutzen.


MikePapa

Kommando zurück. Funktioniert leider doch nicht. :(

Die von Dir erwähnte Liste habe ich gefunden und mir auch angeschaut, schaffe allerdings nicht die Einbindung/Umprogrammierung, so daß es nun doch mit der Bilderanzeige klappt (weil ich die Funktion nicht kapiere ;)).

Kann bitte jemand für einen offensichtlichen mx-DAU hier Hilfestellung geben: Wie nutze ich weitere Session-IDs im MX?

Beste Grüße

MP

NeMeSiSX2LC

Ok ich schreibs lieber gleich nicht das es heisst ich Antworte nicht mehr :) Hab mich damit noch nicht auseinander gesetzt. Da is Tora experte...
CMS-Version: pragmaMx 0.1.8, 1.20.4.5/2006-03-10     
PHP-Version: 5.1.2
MySQL-Version: 5.0.15-max-log
Server-Version: Apache/2.0.55
phpMyAdmin-Version: 2.7.0-pl1

MikePapa

#5
OK, dann warte ich auf Tora :)


Trotzdem Danke, NeMeSiSX2LC !

In der 2. Datei scheint es nicht möglich zu sein, die Session-Befehle zu verwenden.
U.a. habe ich dort den Eintrag per mxSessionDelVar gelöscht und anschließend in der 1. Datei nochmal ausgelesen... sie war leider noch da :(
Dann brauch ich mich nicht wundern, daß die Abfrage nach einer gültigen Session-ID nicht funktioniert.



Gruß

MP

Andi

#6
Hi :)

gutes Ding, das Ding....

Habe es etwas umgebaut, nicht nur wegen der Kompatibilität zum mX, sondern auch weil es für eine Uralt PHP-Version geschrieben ist.

Quellcode "view_image.php":
<?php
include('mainfile.php');

$pic    "logo.gif";

$path 'images/';

/// transparentes Bild
$blind_gif 'images/pixel.gif';

if (isset(
$_GET['img'])) {
$_GET['img'] = rawurldecode($_GET['img']);
if (file_exists($path.$_GET['img'])) {
$pic $_GET['img'];
}
}

// Cache deaktivieren
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " gmdate("D, d M Y H:i:s") ." GMT");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");

// Challenge-ID
mt_srand((double)microtime()*1000000);
$sess_challenge_id md5(uniqid(mt_rand(),TRUE));

mxSessionSetVar('sess_challenge_id'$sess_challenge_id);

// Grafik auslesen
$img    = @GetImageSize($path.$pic);
$width  intval($img[0]);
$height intval($img[1]);

// HTML-Tabelle anzeigen
printf("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"%s\" height=\"%s\">\n",$width,$height);
print 
"<tr>\n";
printf("<td width=\"%s\" height=\"%s\" background=\"read_image.php?img=%s&challenge=%s\">"$width$heightrawurlencode($pic), $sess_challenge_id);
printf("<img border=\"0\" src=\"%s\" width=\"%s\" height=\"%s\" alt=\"%s\" title=\"%s\">",$blind_gif$width$heightrawurlencode($pic), rawurlencode($pic));
print 
"</td>\n";
print 
"</tr>\n";
print 
"</table>\n";

?>


Quellcode read_image.php:
<?php
include('mainfile.php');

$path 'images/';

/// Fehlerbild, welches bei Bildklau oder Direktaufruf angezeigt wird
$error_pic 'images/finger.jpg';

$sess_challenge_id mxSessionGetVar('sess_challenge_id');
$get_challenge_id  = (empty($_GET['challenge'])) ? '' $_GET['challenge'];
$img = (empty($_GET['img'])) ? $error_pic $path.rawurldecode($_GET['img']);

// Challenge-ID OK -> Bild anzeigen
if($sess_challenge_id && $sess_challenge_id && $sess_challenge_id == $get_challenge_id) {

  
// Challenge-ID aus Session entfernen
mxSessionDelVar('sess_challenge_id');

  
$read = @GetImageSize($img);
  
$type $read[2];

  
// Nun bestimmen wir den Datei-Typ, damit wir dem Browser sagen können
  // welcher Grafik-Typ er nun vorgeschmissen bekommt
  
switch($type)
    {
    case 
1:
      
$mime "image/gif";
    break;
    case 
2:
      
$mime "image/jpeg";
    break;
    case 
3:
      
$mime "image/png";
    break;
    case 
4:
      
$mime "application/x-shockwave-flash";
    break;
    }

  
// Nun senden wir die Header und lesen mit readfile() unsere
  // Grafik aus und senden diese direkt an den Browser
  
header("Content-Type: $mime");
  
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
  
header("Pragma: no-cache");
  
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
  
readfile($img);
}
// Unerlaubter Zugriff -> Transparentes GIF *ätsch*
else {
header("Content-type: image/gif");
  
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  
header("Last-Modified: " gmdate("D, d M Y H:i:s") ." GMT");
  
header("Pragma: no-cache");
  
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
  
readfile($error_pic);
}

?>


Die Pfade zu den Grafiken und den Bildern müssen entsprechend angepasst werden.
Die view_image.php kann so jetzt auch mit anderen Bildern verwendet werden, indem man den Bildnamen als _GET Paramter 'img' übergibt.

Der Umweg über die modules.php ist nicht nötig. Es genügt die mainfile zu includen. Die beiden Scripte müssen im mx-root liegen.
Das sind auch keine "eigenen Session-IDs" sondern ganz normale Session-Variablen. Anstatt mxSessionXXXvar könnte man auch die Sessionvariable $_SESSION['sess_challenge_id'] direkt bearbeiten.
schön´s Grüssle, Andi

NeMeSiSX2LC

CMS-Version: pragmaMx 0.1.8, 1.20.4.5/2006-03-10     
PHP-Version: 5.1.2
MySQL-Version: 5.0.15-max-log
Server-Version: Apache/2.0.55
phpMyAdmin-Version: 2.7.0-pl1

Andi

schön´s Grüssle, Andi

MikePapa

Andi:  :thumbup:  :thumbup:  :thumbup:

Vielen Dank! Ich werde das direkt für mein Modul durchtesten!!

Mit diversen htaccess-Anweisungen habe ich zwar das Fremdverlinkungen schon mal unterbunden, aber das einfache Abspeichern von Grafiken eines bestimmten Moduls wollte ich nun doch nicht so einfach hinnehmen.

DANKE!

Gruß

MP

MikePapa

Sorry, daß ich hier nochmal drauf antworte und meinen letzten Beitrag nicht einfach editiere... aber das Editierte könnte übersehen werden, da der ursprüngliche Beitrag bereits gelesen wurde.

Also:

Ich habe den geänderten Code nun eingebaut. Das Modul, das ich erstellen möchte, zeigt nach einer Länderauswahl (2 Länder können gleichzeitig gewählt werden) u.a. Grafiken der verschiedenen  Dienstgrade zum Vergleich an.
Hierzu gibt es diverse Auswahloptionen (Mannschaften/Unteroffiziere/Offiziere).
Nach der Auswahl wird in einer Ausgabefunktion eine Tabelle erstellt, in welche nun die Grafiken geladen werden sollen. Hierzu benutze ich eine Schleife:

while(list($id,$bezeichnung,$zusatz) = sql_fetch_row($result)) {
if ($bezeichnung && $zusatz != "-") {

Wenn die Bedingung erfüllt ist, wird die entsprechende Grafik geladen, ansonsten erscheint halt ein Text, daß es diesen Dienstgrad in dem jeweiligen Land nicht gibt bzw. es für diesen kein Dienstgradabzeichen gibt.

Egal, wie ich den "Grafikaufruf-Code" ;) nun integriere.... es wird immer nur die letzte anzuzeigende Grafik korrekt dargestellt. Für alle anderen erscheint die "Fehlergrafik".


Ich habe 2 Varianten probiert:
- Toras Code in die o.g. If-Schleife integriert
- und auch den Aufruf per include("view_image.php");



Weiterhin fiel beim Laden der Seite (auch wenn das Ergebnis im Endeffekt nicht korrekt war) auf, daß die Ladezeit für die Grafiken enorm ist. Ich vermute(!), daß dies durch das includen der mainfile.php für die Ausgabe der einzelnen Bilder zustandekommt. Kann dies u.U. anders gelöst werden?


Ist es tatsächlich so, daß ich Toras Umsetzung in einer Schleife nicht nutzen kann oder habe ich lediglich etwas falsch umgesetzt?


Ich hoffe, ich konnte alles verdeutlichen!? ;)


Gruß

"MikePapa"



PS: Falls es weiterhilft, kann ich gerne einem Profi das noch nicht fertige Modul zumailen. Vielleicht wird das Problem dann klarer.

jubilee

#11
Öhmm ....
Zitatif ($bezeichnung && $zusatz != "-") {
Ist die Variable $bezeichnung ein boolscher Wert (1 oder 0 bzw. true oder false ??)
Wenn nicht, ist diese Art der Verknüpfung nicht zulässig (denke ich)
Das sollt edann so aussehen :

Zitatif (($bezeichnung !="-") && ($zusatz != "-")) {

Versuch es bitte einmal damit.
MfG
jubilee


MikePapa

#12
Die Bezeichnung enthält den Dienstgrad... also Unteroffizier, Major etc.
Wenn in der DB dieser Wert nicht eingetragen ist, dann existiert dieser Dienstgrad in der jeweiligen Armee nicht.

Im Feld Zusatz steht in der DB entweder "-" oder "a", "b", "c", "d". Dies resultiert aus den unterschiedlichen Strukuren. Ausschlaggebend ist im Prinzip die Besoldungsstufe. In Deutschland gibt es für die Stufe OR-1 beispielsweise 1 Dienstgrad, in anderen Ländern können es 2 oder mehr sein....daher dann der Zusatz, damit die Grafiken in 1 Tabellenzelle geschrieben werden.
Das "-" kennzeichnet, daß es für den jeweiligen Dienstgrad kein Abzeichen gibt.

Wenn also ein Dienstgrad angegeben ist und lt. Datenbank dieser auch ein Abzeichen hat, dann soll die entsprechende Grafik ausgegeben werden.


Das Modul an sich funktioniert einwandfrei! Ich möchte halt lediglich noch die einzelnen Grafiken "schützen"... so gut wie es geht.

Andi

Moin :)

Zitates wird immer nur die letzte anzuzeigende Grafik korrekt dargestellt
Ja, ist klar, für jedes einzelne Bild wird eine neue id in die Session geschrieben, die die alte id überschreibt. Weiterhin wird bei jedem Aufruf innerhalb der read_image.php die id aus der Session gelöscht.
Das Ganze funktioniert immer nur mit einem anzuzeigendem Bild auf einer Seite. Bei mehreren Bildern kommt das alles durcheinander und es entsteht dieser Effekt.
Um das zu ändern müsste ich mir erst noch selbst Gedanken machen..., irgendwie eine spezielle id für jedes einzelne Bild oder sowas....
ZitatIst es tatsächlich so, daß ich Toras Umsetzung in einer Schleife nicht nutzen kann
Nicht nur meine Änderung, das Original müsste sich genauso verhalten.

ZitatWeiterhin fiel beim Laden der Seite (auch wenn das Ergebnis im Endeffekt nicht korrekt war) auf, daß die Ladezeit für die Grafiken enorm ist. Ich vermute(!), daß dies durch das includen der mainfile.php für die Ausgabe der einzelnen Bilder zustandekommt. Kann dies u.U. anders gelöst werden?
Das war eigentlich zu erwarten. Nicht nur das includen der mainfile, sondern auch der ganze Overhead zum generieren der Dummytabelle und das auslesen/versenden der Grafik über PHP brauchen ganz schön Resourcen.
Auch deswegen ist das Prinzip eigentlich nur für ein angezeigtes Bild zu empfehlen.

Etwas müsste man sparen können, wenn man die Sessionspezifischen Dinbge aus der mainfile/mx_baseconfig ausgliedert und in eine extra Datei auslagert, die dann in der read_image.php includet wird. Wird aber nur minimal sein...
schön´s Grüssle, Andi

MikePapa

Eine solche Antwort bezüglich der Ladezeiten habe ich befürchtet... ;)

Allerdings dürften die Session-IDs doch eigentlich gar keine Probleme machen, da nach dem Aufruf des 1. Bilders die ID gelöscht wird, bevor in der Schleife erneut eine ID für das 2. Bild (etc.) gesetzt wird. Oder liege ich da falsch?






Andi

Hi :)
ZitatAllerdings dürften die Session-IDs doch eigentlich gar keine Probleme machen, da nach dem Aufruf des 1. Bilders die ID gelöscht wird,

Theoretisch ja, aber praktisch wird der HTML-Code erst am Ende der Schleife bzw. des ganzen Scriptes an den Browser gesendet. Erst wenn diese Daten beim Browser angekommen sind, fordert der wieder die Bilder vom Server an. Da ist aber in der Zwischenzeit nur die id des letzten Bildes in der Session gespeichert.
schön´s Grüssle, Andi

MikePapa

OK, jetzt habe sogar ich das kapiert :)  Eigentlich auch logisch, da nur das letzte Bild korrekt angezeigt wird.

Dann werde ich mit meinen neuen Erkenntnissen mal ein wenig rumexperimentieren.
Danke für Deine Hilfe und die Umsetzung des Scripts, Tora!

Beste Grüße

"MikePapa"