2016-07-20 15 views
0

Ist es möglich, eine .htaccess Datei zu öffnen und alle Spalten in PHP auskommentieren?PHP - Datei öffnen und alle Spalten auskommentieren - htaccess

Ich benutze die IMAP-Funktionalitäten von PHP und speichern die E-Mail-Anhänge auf dem Server. Wenn ein Benutzer eine E-Mail mit einer .htaccess-Datei zu Hackerzwecken sendet, werde ich jede Zeile in der .htaccess-Datei auskommentieren, bevor sie auf dem Server gespeichert wird.

if ($emails[$i]['attachments'][$n]['name'] == '.htaccess') { 
        /* Uncomment all the lines with # */ 
       } 

Meine aktuellen .htaccess-Datei wie folgt aussieht:

Order allow, deny 
Deny from all 

RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo 
RemoveType .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo 
php_flag engine off 

So kann ein Benutzer nicht direkt auf die Dateien zugreifen, sondern um den Inhalt zu einem benutzerspezifischen Unterordner hochgeladen, so dass es für sie möglich ist, Lade einen .htaccess hoch, der die definierten Regeln überschreibt.

Ich lasse die Benutzer die Anhänge nicht direkt herunterladen. Sie sehen einen Link, der erzeugt wird, wie folgt:

$msgfile = '../php/downloads/msgAttachmentDownload.php?download=' . urlencode(base64_encode($r16['id'])); 
$fileLink = '<a target="_blank" href =" ' . $msgfile . '"><i class="fa fa-download fa-fw"></i> ' .$r16['filename']. ' (' . $msgfilesize . ' MB)</a>'; 

Im msgAttachmentDownload.php packe ich die URL aus der Datenbank und laden Sie es:

$file = '../..' . $r2['fileurl'] . $r2['filename']; 
     if (file_exists($file)) { 
      header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename="' . basename($file) . '"'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate'); 
      header('Pragma: public'); 
      header('Content-Length: ' . filesize($file)); 
      readfile($file); 
      exit; 
     } 

So sind die Benutzer nie den wirklichen Weg sehen zu die Datei auf dem Server, wenn ich richtig liege.

Wäre großartig, Ihre Vorschläge zu hören, und ich hoffe, dass diese Frage und die Lösung ein guter Rat für andere Menschen sein wird.

+0

Müssen Sie * * die Anlagen unter der Docroot speichern? Es könnte besser sein, sie draußen zu speichern und stattdessen eine Art von Ressourcenverwaltungsskript für den Zugriff zu verwenden? – CD001

+0

Ich stimme mit CD001 überein, dies scheint besser gelöst zu sein, wenn ich einen Dateispeicher an einer anderen Stelle auf der Festplatte habe, als ihn direkt in Docroot zu speichern. – cardonator

+0

Es ist eine schlechte Idee, alle E-Mail-Anhänge zu übernehmen und sie direkt öffentlich zugänglich zu machen. Du setzt dich allen möglichen Sicherheitsproblemen aus. –

Antwort

0

Die kurze Antwort auf Ihre Frage ist: "Ja, das kannst du leicht machen." Sie sollten sich die PHP-Funktion fgets ansehen. Sie könnten etwas tun, wie das, was Sie durch das Sammeln jede Zeile tun wollen, Formatierung es, wie Sie wollen, und dann auf diese Weise alle Zeilen zurück, um die neue Datei auf der Festplatte zu schreiben:

<?php 
$file = @fopen("/path/to/.htaccess", "r"); 
if ($file) 
{ 
    while (($line = fgets($file, 4096)) !== false) 
    { 
     // reformat line and store in an array or something 
    } 
    if (!feof($file)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($file); 
} 

// write stored array to a new file or the same file 
?> 

Je länger Antwort auf Ihre Frage ist, dass dies scheint eine sehr schlechte Lösung, um Menschen den Zugriff auf Dateien von Ihrer Website, die sie hochladen/senden in Anlagen. Es wäre viel sicherer für Sie, sie an einen Ort außerhalb Ihres Dokumentenstammverzeichnisses hochzuladen und eine php-Datei mit dem Namen von download-file.php?file_id=12345 oder sogar zu haben, als Personen den direkten Zugriff auf Dateien zu erlauben, die vom Kunden gesendet wurden.

Es gibt jedoch Zeiten, in denen das nicht möglich oder praktisch ist, also hoffentlich hilft die erste Lösung Ihnen, zu bekommen, was Sie zu tun versuchen.

+0

Thx viel. Ich werde es versuchen. Wie Sie sehen können, habe ich meine Frage angepasst und verwende bereits Ihre "längere Antwort" -Methode. :-) –

+0

Kein Problem, lassen Sie mich wissen, wenn die Antwort in irgendeiner Weise unklar ist. – cardonator

0

einfachste Weg, dies zu tun ist durch str_replace oder einen regulären Ausdruck:

$htfile=file_get_contents('.htaccess'); 
$htfile=str_replace('#','',$htfile); 
file_put_contents('.htaccess',$htfile); 

aber diese nicht gute Idee ist, Ihre .htaccess zu ändern, wenn Sie entscheiden wollen, die Datei herunterladen können oder nicht, können Sie tun dies in Ihrem Controller

+0

Jeder Benutzer sollte in der Lage sein, die Anhänge seiner E-Mails herunterzuladen. Aber leider kann man eine .htaccess-Datei per Mail senden und so auf dem Server speichern. Um Funktionalitäten der .htaccess-Dateien zu verhindern, möchte ich nicht sagen, dass es überhaupt nicht möglich ist, .htaccess-Dateien abzurufen, ich möchte nur jede Zeile auskommentieren. –

+0

also den Dateinamen ändern? vielleicht Benutzer-ID vor dem Dateinamen oder etwas ähnliches, oder speichern Sie den ursprünglichen Dateinamen in db und speichern Sie, was Sie auch wählen. Wenn Sie es wieder an den Benutzer senden möchten, erhalten Sie nur original fname von db – neuronet