2009-09-05 19 views
0

tous. Je suis un nouveau venu dans le développement web, alors soyez gentil. Toutes mes excuses si je publie un sujet qui a déjà été discuté; J'ai cherché mais je n'ai pas trouvé ce que je cherchais dans un autre fil. Contexte: J'ai un site qui permet le téléchargement de fichiers, mais une fois téléchargé, ils n'auront pas besoin d'être vus par quiconque sauf moi. J'ai implémenté des mesures de sécurité telles que le fait que le script de téléchargement php n'autorise que certaines extensions, chmoding les fichiers téléchargés en 0644 et en utilisant -ExecCGI pour diverses extensions dans un fichier htaccess dans le dossier uploads.sécurité de téléchargement de fichier, htaccess et modification des extensions

Les questions (trois d'entre eux, ne sont pas vous chanceux):

1) Je voudrais avoir mon fichier htaccess extensions php comme rewrite autre chose. J'ai trouvé un peu de code pour le faire, mais ne peut pas sembler le faire fonctionner:

RewriteEngine On 
RewriteCond %{REQUEST_METHOD} ^PUT$ [OR] 
RewriteCond %{REQUEST_METHOD} ^MOVE$ 
RewriteRule ^(.*)\.php /site_redone/uploads/$1.nophp 

la structure du site va comme ceci (au moins pour l'instant alors que je refais le site): monsite .com/site_redone/uploads

Je sais que l'hôte de mon serveur partagé permet mod_rewrite. Ils exécutent PHP 5.2.10. Je ne sais pas si mon problème est un problème de chemin (je n'ai pas encore bien compris cette partie), mais j'ai essayé plusieurs permutations de chemin dans la partie RewriteRule en vain.

2) J'ai actuellement les noms de fichiers en cours d'ajout avec une sorte d'horodatage (time()) pour éviter l'écrasement par un fichier du même nom, par exemple, myfile.doc devient myfile1252087685.doc. Je peux stocker l'extension dans une base de données MySQL et juste réécrire le nom du fichier pour terminer en .txt ou quelque chose dans mon script de téléchargement php, mais je ne suis pas sûr que cela va accomplir la même chose que la tentative de mod_rewrite ci-dessus.

3) Y a-t-il un moyen de placer le fichier htaccess dans un répertoire plus élevé à partir du dossier uploads afin qu'il ne puisse pas être écrasé par mes ne'erdowell alors qu'il se trouve dans le dossier uploads? Je veux seulement que cela affecte le dossier de téléchargement, pas le répertoire dans lequel il est placé, cependant. Je suppose que cela implique en quelque sorte l'utilisation de Directory, mais je ne sais pas comment le faire. Ai-je mentionné que je suis nouveau à ce sujet?

Merci d'avance!

Répondre

0

Je pense que l'expression rationnelle RewriteRule correspond au chemin entier, pas à celui relatif à l'emplacement du fichier .htaccess. Pas sûr à ce sujet cependant.

Ainsi, vous pouvez essayer un regex comme ceci:

^.*/([^/]*).php$ 

Ou peut-être:

^/site_redone/uploads/([^/]*)\.php$ 

Je ne l'ai jamais mis un RewriteRule mod_rewrite dans un sous-répertoire avant, donc ce qui précède est suggéré Je ne pense pas que <Directory> est autorisé dans .htaccess, mais il y a une autre directive similaire qui fonctionne. (FilesMatch ou quelque chose?)

Attendez ... n'avez-vous pas dit que vous voulez refuser l'accès Web à l'ensemble du dossier? vous pouvez modifier tout ce qui commence par /site_redone/uploads/ vers un script php qui affiche une page d'erreur avec un code d'erreur http d'accès refusé.Donc, une expression comme ceci: ^/site_redone/uploads/.*$

+0

Merci pour votre réponse rapide, Jason! D'après les tutoriels sur modrewrite.com, ma compréhension (certes fragile) de la regex est relative au fichier htaccess, mais la seconde moitié de la RewriteRule nécessite le chemin complet. Mais peu importe, votre regex et les variations similaires que j'ai essayées ne me donnent aucun amour. Tant pis. Je suis moins préoccupé par les personnes qui consultent le dossier que par le téléchargement de code malveillant, mais mon fichier htaccess actuel devrait empêcher le visionnage public et l'exécution de code. Je ne suis pas aussi bien informé sur la sécurité que je ne devrais probablement l'être, alors j'essaie de couvrir toutes mes bases. –

0

Eh bien, il semble que ce que j'essayais de faire n'est pas réellement possible, du moins pas la façon dont j'essayais de le faire. J'ai reçu de l'aide sur le forum de modrewrite.com qui m'a informé que parce que j'utilise le téléchargement de fichiers via un formulaire html, la règle de réécriture ci-dessus ne sera pas capable d'agir sur le nom du fichier. Cet extrait de code ci-dessus peut être, et je cite, "WebDAV ou similaire qui ressemble plus à FTP." Je vais devoir rester avec php pour éliminer les indésirables. Quoi qu'il en soit, j'espère que cela aidera quelqu'un!