Seite 1 von 2
Download-Modul mit Prüfung auf Berechtigung
Verfasst: Di 8. Feb 2005, 07:29
von achiboy
Hallo,
ich habe ein Modul geschrieben, das beim Download einer Datei die Berechtigung prüft und danach die Datei zum öffnen oder speichern anbietet. Es werden nur Dateienn zur Verfügung gestellt, die in einem Unterverzeichnis von cms/upload/download/... liegen.
Ich habe nur noch ein Problem. Bei einigen IE-Konfigurationen haben Besucher gemeldet, dass beim direkten Öffnen von Downloads ein Fehler auftritt, der in etwa lautet: "Es ist ein Fehler aufgetreten. Die Datei konnte nicht gefunden werden".
Bei meiner IE-Installation geht das und mit Firefox sowieso. Woran könnte das liegen?
Hier der code
Code: Alles auswählen
<?php
if (isset($HTTP_POST_VARS['id']))
{
$id = intval($HTTP_POST_VARS['id']);
}
elseif (isset($HTTP_GET_VARS['id']))
{
$id = intval($HTTP_GET_VARS['id']);
}
else
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
}
$sql = "SELECT dirname, filename
FROM ".$cfg["tab"]["upl"]."
WHERE idupl = ".$id;
$db->query($sql);
$db->next_record();
if (!stristr ($db->f("dirname"), "download"))
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
} else {
$verzeichnis = $db->f("dirname");
$dateiname = $db->f("filename");
}
$suchpfad = '0=' . str_replace("/","%2F",substr($verzeichnis, 0, -1)).'&';
$sql = "SELECT a.public, a.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
b.container = '".$suchpfad."'";
$db->query($sql);
if (!$db->next_record())
{
$sql = "SELECT d.public, d.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS d,
".$cfg["tab"]["cat_art"]." AS e,
".$cfg["tab"]["art_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
e.idart = a.idart AND
e.idcat = d.idcat AND
b.container = '".$suchpfad."'";
$db->query($sql);
$db->next_record();
}
if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) ||
$perm->have_perm())
{
if ( $file_extern == "1" )
{
Header("Location: $dateiname");
}
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$dateiname."\"");
readfile($cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"] . $verzeichnis . $dateiname);
} else {
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
ob_end_clean();
header("Location: $link");
exit;
}
?>
Re: Download-Modul mit Prüfung auf Berechtigung
Verfasst: Mi 9. Feb 2005, 16:12
von emergence
achiboy hat geschrieben:Ich habe nur noch ein Problem. Bei einigen IE-Konfigurationen haben Besucher gemeldet, dass beim direkten Öffnen von Downloads ein Fehler auftritt, der in etwa lautet: "Es ist ein Fehler aufgetreten. Die Datei konnte nicht gefunden werden".
was heisst -> beim direkten öffnen von downloads ?
es müsste auch ne url dort stehen was nicht geöffnet werden kann...
ein blick ins apache access.log sollte vielleicht aufschluss darüber geben welche datei nicht gefunden werden kann... (falls es wirklich so ein fehler sein sollte)
seitens einstellungen des browsers wüsste ich momentan nicht was das sein könnte...
Re: Download-Modul mit Prüfung auf Berechtigung
Verfasst: Do 10. Feb 2005, 07:27
von achiboy
emergence hat geschrieben:was heisst -> beim direkten öffnen von downloads ?
...
ich klicke auf den Download link -> dieser verweist auf die Seite mit dem oben aufgeführten modul -> es erscheint ein dialogfenster, das mich fragt, ob ich das dokument öffnen will oder ob ich es speichern will. -> da klicken die leute auf öffnen.
Der Download wird vollzogen -> das entsprechende Programm wird gestartet -> es erscheint eine Fehlermeldung.
Verfasst: Mi 2. Mär 2005, 12:13
von CyberDan
läuft das Modul bei jemandem? Wie soll das funktionieren?
Re: Download-Modul mit Prüfung auf Berechtigung
Verfasst: Mi 2. Mär 2005, 12:27
von timo
achiboy hat geschrieben:Der Download wird vollzogen -> das entsprechende Programm wird gestartet -> es erscheint eine Fehlermeldung.
Ähm und welche?
Fehlermeldungen beim direkten Öffnen deutet auf eine Fehlkonfiguration auf Client-Seite hin...
Verfasst: Mo 7. Mär 2005, 07:50
von achiboy
et voilà. das sage ich auch. nur scheint diese Fehlkonfiguration sehr verbreitet zu sein. Deshalb suche ich den Fehler immer noch auf meiner Seite.
Kann es sein, dass die Cache-Einstellungen so sind, dass die Datei im Temp-Verzeichnis des Besuchers schon wieder gelöscht ist, wenn dessen Programm (z.B. PDF-Reader) darauf zugreifen will?
Verfasst: Mo 7. Mär 2005, 10:04
von emergence
sag mal betrifft das alle dateien ? (oder eventuell nur pdf's ?)
welche server umgebung ?
Verfasst: Mo 7. Mär 2005, 10:15
von achiboy
Es passiert auch bei Word und Excel.
Serverumgebung:
Serverbetriebssystem Apache/1.3.31 (Unix) mod_auth_passthrough/1.8 FrontPage/5.0.2.2510a mod_log_bytes/1.2 mod_bwlimited/1.4 mod_ssl/2.8.19 OpenSSL/0.9.7d
Installierte PHP-Version 4.3.8
safe_mode Deaktiviert
magic_quotes_gpc Aktiviert
magic_quotes_runtime Deaktiviert
gpc_order GPC
Deaktivierte Funktionen nothing disabled
Gettext extension loaded
sql.safe_mode Deaktiviert
Verfasst: Mo 7. Mär 2005, 10:19
von CyberDan
ich würde das Modul ja auch gerne mal testen, nur kriege ich auf jeder Seite, auf der ich es einbaue die Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /..../includes/include.con_editcontent.php(571) : eval()'d code:9)
Verfasst: Mo 7. Mär 2005, 10:36
von achiboy
Downloadliste
Input?>
<table cellspacing="0" cellpadding="0" cellpadding="4">
<tr>
<td style="font-size:11px">Upload-Zweig:</td>
<td>
<select name="CMS_VAR[0]">
<option value="0"></option>
<?php
$sql = "SELECT DISTINCT dirname from ".$cfg["tab"]["upl"]." WHERE dirname LIKE '%download%' ";
$db->query($sql);
while ( $db->next_record() ) {
$upload_dir=substr_replace($db->f("dirname"),'',(strlen($db->f("dirname"))-1));
if ( "CMS_VALUE[0]" == $upload_dir) {
echo '<option selected="selected" value="'.$upload_dir.'">'.$db->f("dirname").'</option>';
} else {
echo '<option value="'.$upload_dir.'">'.$db->f("dirname").'</option>';
}
}
?>
</select>
</td>
</tr>
<!-- <tr>
<td style="font-size:11px">File-Typ:</td>
<td>
<select name="CMS_VAR[1]">
<option value="0"></option>
<?php
$sql = "SELECT DISTINCT filetype from ".$cfg["tab"]["upl"]; //." WHERE dirname='CMS_VALUE[0]/'";
$db->query($sql);
while ( $db->next_record() ) {
$upload_file=$db->f("filetype");
if ( "CMS_VALUE[1]" == $upload_file) {
echo '<option selected="selected" value="'.$upload_file.'">'.$db->f("filetype").'</option>';
} else {
echo '<option value="'.$upload_file.'">'.$db->f("filetype").'</option>';
}
}
?>
</select>
</td>
</tr> -->
</table>
<?php
Output<?php
$sql = "SELECT idcat, public
FROM ".$cfg["tab"]["cat_lang"]."
WHERE idcat = ".$idcat;
$db->query($sql);
$db->next_record();
if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) || $perm->have_perm())
{
//Datenbankanfrage wird definiert (was, wo und wie sortiert)
// $sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE filetype = 'CMS_VALUE[1]' AND dirname ='CMS_VALUE[0]/' order by created desc";
// $sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE dirname ='CMS_VALUE[0]/' order by description";
$sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE dirname ='CMS_VALUE[0]/' order by description, filename";
//Verbindung zur Datenbank wird hergestellt
$db->query($sql);
//Zeigt die Datensätze in der Tabelle an
// echo 'Insgesamt stehen ' . $db ->num_rows() . ' Dokumente zur Verfügung:<br><br>';
echo '<div class="list"><table width="100%" border="0" cellspacing="2" cellpadding="5">'."\n";
echo ' <tr><td class="headings">Datei</td><td class="headings">Typ</td><td class="headings">Grösse</td></tr>'."\n";
//Link zur Datei im Upload-Verzeichnis
$href = $cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"];
$i = 1;
$pdfvorhanden = false;
while ($db->next_record())
{
$filetyp = strtolower($db->f("filetype"));
if ($filetyp == "pdf")
{
$filetyp = $filetyp." *";
$pdfvorhanden = true;
}
if ($db->f("description") != "")
{
$bezeichnung = $db->f("description");
} else {
$bezeichnung = $db->f("filename");
}
// echo "<tr class=\"textsmall line_color0\"><td><a title=\"Download: ".$bezeichnung."\" href=\"".$href.$db->f("dirname").$db->f("filename")."\">".$bezeichnung."</a></td><td>".$filetyp."</td><td style=\"text-align:right\">".round($db->f("size")/1024,1)." KB</td></tr>";
echo "<tr class=\"textsmall line_color0\"><td><a title=\"Download: ".$bezeichnung."\" href=\"front_content.php?idcatart=89&lang=1&client=1&id=".$db->f("idupl")."\">".$bezeichnung."</a></td><td>".$filetyp."</td><td style=\"text-align:right\">".round($db->f("size")/1024,1)." KB</td></tr>";
$i++;
}
echo '</table></div>';
if ($pdfvorhanden)
{
echo '<div class="textsmall"><br />* Um diese Dokumente zu öffnen, brauchen Sie den Acrobat Reader.<br />Sie können diesen <a class="klein" onfocus="this.blur()" href="
http://www.adobe.com/products/acrobat/readstep.html" target="_blank">kostenlos herunterladen</a>.<br /></div>';
}
} else {
echo 'nicht berechtigt' ;
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
echo '<meta http-equiv="refresh" content="0;'.$link.'">';
}
?>
Download-Load
Output<?php
if (isset($HTTP_POST_VARS['id']))
{
$id = intval($HTTP_POST_VARS['id']);
}
elseif (isset($HTTP_GET_VARS['id']))
{
$id = intval($HTTP_GET_VARS['id']);
}
else
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
}
$sql = "SELECT dirname, filename
FROM ".$cfg["tab"]["upl"]."
WHERE idupl = ".$id;
$db->query($sql);
$db->next_record();
if (!stristr ($db->f("dirname"), "download"))
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
} else {
$verzeichnis = $db->f("dirname");
$dateiname = $db->f("filename");
}
$suchpfad = '0=' . str_replace("/","%2F",substr($verzeichnis, 0, -1)).'&';
$sql = "SELECT a.public, a.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
b.container = '".$suchpfad."'";
$db->query($sql);
if (!$db->next_record())
{
$sql = "SELECT d.public, d.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS d,
".$cfg["tab"]["cat_art"]." AS e,
".$cfg["tab"]["art_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
e.idart = a.idart AND
e.idcat = d.idcat AND
b.container = '".$suchpfad."'";
$db->query($sql);
$db->next_record();
}
if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) ||
$perm->have_perm())
{
if ( $file_extern == "1" )
{
Header("Location: $dateiname");
}
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$dateiname."\"");
readfile($cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"] . $verzeichnis . $dateiname);
} else {
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
ob_end_clean();
header("Location: $link");
exit;
}
?>
Hier ist der gesamte Source. Ich habe keine Probleme damit

Verfasst: Mo 7. Mär 2005, 10:41
von kummer
du prüft zwar auf die berechtigung des benutzers, um den link darzustellen. aber können nicht in tat und wahrheit alle den download vornehmen, wenn sie den pfad zur datei kennen?
Verfasst: Mo 7. Mär 2005, 10:45
von achiboy
das stimmt theoretisch absolut. Deshalb habe ich dieses Load-Verfahren ausgedacht. Denn so wird der Benutzer den Pfad nicht sehen.
So viel ich weiss, gibt es ja keine Möglichkeit, den Zugriff innerhalb der Dateiverwaltung zu steuern oder?
Verfasst: Di 15. Mär 2005, 09:04
von achiboy
ich habe beim googeln gesehen, dass das Problem verbereitet ist.
Microsoft hat den Fehler auch entdeckt.
http://support.microsoft.com/?scid=kb;d ... sid=global
Das Problem tritt aber nicht nur bei HTTPS sondern auch bei HTTP auf.
Wo wird bei Contenido, das Session-Handling gemacht und die Header() gesetzt?
Verfasst: Mi 16. Mär 2005, 08:06
von achiboy
so, ich habe es geschafft. ich musste mit ob_end_clean den buffer leeren und dann die richtigen header setzen.
Verfasst: Mi 16. Mär 2005, 11:26
von HerrB
Kannst Du das nochmal posten (bzw. Deinen ersten Eintrag überarbeiten)?
Gruß
HerrB