Upload de fichiers

moneyline Messages postés 2 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 30 décembre 2003 - 30 déc. 2003 à 16:26
moneyline Messages postés 2 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 30 décembre 2003 - 30 déc. 2003 à 18:17
Bonjour,

j'ai mis en place une page permettant d'Uploader des fichiers sur mon site internet (en l'occurence la méthode de Nix sans composant).

Elle fonctionne, mais je cherche à sécuriser ma page en ne permettant que l'upload de certains types de fichiers.

Je ne souhaite uploader que les fichiers pdf, txt et doc.

Pour cela j'ai supprimer les cases autre que ces types de fichiers mais cela ne fonctionne pas

Qui pourrait s'il vous plaît me guider et m'indiquer la procédure pour détecter le type de fichier et renvoyer un message quand le type n'est pas valable.

Merci de votre aide

<!----------- Fichier uploadfichier.asp --------->
<!--#include file= "clsUplFich.asp"-->
<%
' *****************************************************************************
' Réalisé par Nicolas SOREL ( Nix pour les intimes :) )
' Pour le site ASPFr.com
' Retrouvez d'autres scripts ASP sur www.ASPFr.com
' Vous avez le droit d'utiliser ce script dans vos pages mais si vous souhaitez
' l'exposer sur un autre site de programmation merci de me contacter
' (nix@codes-sources.com)
' *****************************************************************************
%>
<html>
<head>
<title>Envoyer des fichiers</title>
</head>

<%
Select Case Request.QueryString("Etape")
Case ""
%>

<form action="uploadfichier.asp?Etape=1" method="post" enctype="multipart/form-data">


Sélectionnez le(s) fichier(s) que vous souhaitez uploader.

FICHIER1 :

TEXTE :

TEXTAERA : <textarea cols="" rows="" name="txtarea"></textarea>


</form>

<%
' On Error Resume Next
Case "1"
Dim MonUpload
Dim i

Set MonUpload = New UplFichier

' .NbFichiers Retourne le nombre de fichiers Uploadé
For i = 1 To MonUpload.NbFichiers
Response.Write " Fichier N° " & i & "
"
' NomFichier(ID) Retourne le nom du fichier uploadé
Response.Write "Nom du fichier : " & MonUpload.NomFichier(i) & "
"
' TailleFichier(ID) Retourne la taille du fichier uploadé
Response.Write "Taille : " & MonUpload.TailleFichier(i) & " octets
"
' ExtensionFichier(ID) Retourne l'extension du fichier uploadé
Response.Write "Extension : " & MonUpload.ExtensionFichier(i) & "
"
' TypeFichier(ID) Retourne le type mime du fichier uploadé
Response.Write "Type mime : " & MonUpload.TypeFichier(i) & "
"
' NomForm(ID) Retourne le nom du champ dans lequel était le fichier uploadé
Response.Write "Nom de l'Input : " & MonUpload.NomForm(i) & "
"
' CheminFichierDistant(ID) Retourne le chemin distant sur lequel le fichier uploadé se trouvait
Response.Write "Chemin distant : " & MonUpload.CheminFichierDistant(i) & "

"

' .NouveauNom Optionnel , si vous souahitez forcer le nom du fichier en local
' Par défaut, le nom du fichier Uploadé sera utilisé
' Exemple :
' MonUpload.NouveauNom = "NouveauNomDuFichier.txt"

' SauveFichier(ID) sauvegarde le fichier Uploadé
MonUpload.SauveFichier(i)

' ID représente le N° du fichier uploadé.
' Si vous n'avez qu'un champ pour uploader, alors le ID sera 1
' Dans cet Exemple, il y a plusieurs fichiers uploadé donc, je l'ai
' mis dans une boucle pour vous montrer comment faire
Next
%>

<%
' .ChampForm(NomDuChamp) permet de récupérer un Champ texte,
' il fonctionne comme l'Objet Request()
%>
TEXTE : <%= MonUpload.ChampForm("txttest")%>

TEXTAERA : <% =MonUpload.ChampForm("txtarea")%>


<%
Set MonUpload = Nothing
End Select
%>

</html>
<!----------- Fin Fichier uploadfichier.asp --------->

<!----------- Fichier clsUplFich.asp --------->
<!--#include file="clsUplFich.asp"-->
<%
Option Explicit

' *****************************************************************************
' Cette Class a été réalisé par Nicolas SOREL ( Nix pour les intimes :) )
' Pour le site ASPFr.com
' Retrouvez d'autres scripts ASP sur www.ASPFr.com
' Vous avez le droit d'utiliser ce script dans vos pages mais si vous souhaitez
' l'exposer sur un autre site de programmation merci de me contacter
' (nix@codes-sources.com)
' *****************************************************************************
Class UplFichier

Private ToutEnvoi

Private VarFichierBin
Private VarTailleFichier
Private VarTailleBinFichier

Private NomDesFichier()
Private TailleDesFichier()
Private NbDeFichiers
Private LesFichiers()
Private NomDesForm()
Private CheminLocal
Private CheminDistant()
Private LocalNomFichier
Private NomChampTXT()
Private LesChampTXT()

Private Property Let AjoutChampTXT(LeTxt)
ReDim Preserve LesChampTXT(UBound(LesChampTXT) + 1)
LesChampTXT(UBound(LesChampTXT)) = LeTxt
End Property

Private Property Let AjoutChampNOM(LeNom)
ReDim Preserve NomChampTXT(UBound(NomChampTXT) + 1)
NomChampTXT(UBound(NomChampTXT)) = LeNom
End Property

Private Property Let AjoutNomFichier(LeNom)
ReDim Preserve NomDesFichier(UBound(NomDesFichier) + 1)
NomDesFichier(UBound(NomDesFichier)) = LeNom
End Property

Private Property Let AjoutTailleFichier(LaTaille)
ReDim Preserve TailleDesFichier(UBound(TailleDesFichier) + 1)
TailleDesFichier(UBound(TailleDesFichier)) = LaTaille
End Property

Private Property Let AjoutCheminDistant(LeCheminDistant)
ReDim Preserve CheminDistant(UBound(CheminDistant) + 1)
CheminDistant(UBound(CheminDistant)) = LeCheminDistant
End Property

Private Property Let AjoutFichier(LeFichier)
ReDim Preserve LesFichiers(UBound(LesFichiers) + 1)
LesFichiers(UBound(LesFichiers)) = LeFichier
End Property

Private Property Let AjoutNomForm(LeNomForm)
ReDim Preserve NomDesForm(UBound(NomDesForm) + 1)
NomDesForm(UBound(NomDesForm)) = LeNomForm
End Property

Public Property Let Dossier(LeDossier)
CheminLocal = LeDossier
End Property

Public Property Let NouveauNom(NouvNomFichier)
LocalNomFichier = NouvNomFichier
End Property

Public Function SauveFichier(Lequel)
On Error Resume Next
Dim fso, fs
If LocalNomFichier = "" Then
LocalNomFichier = NomDesFichier(Lequel)
End If
Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = fso.OpenTextFile(CheminLocal & LocalNomFichier, 2, True)
If Err.number <> 0 Then Response.Write "Erreur lors de l'écriture du fichier : " & CheminLocal & NomDesFichier(Lequel) & vbCrLf & Err.description & "
":LocalNomFichier = "":Exit Function
fs.Write LesFichiers(LeQuel)
If Err.number <> 0 Then Response.Write "Erreur lors de l'écriture du fichier : " & CheminLocal & NomDesFichier(Lequel) & vbCrLf & Err.description & "
":LocalNomFichier = "":Exit Function
Set fs = Nothing
Set fso = Nothing
LocalNomFichier = ""
End Function

Public Property Get ChampForm(Lequel)
For i = 1 To UBound(NomChampTXT)
If NomChampTXT(i) = Lequel Then
ChampForm = LesChampTXT(i)
Exit For
End If
Next
End Property

Public Property Get NomFichier(Lequel)
NomFichier = NomDesFichier(Lequel)
End Property

Public Property Get CheminFichierDistant(Lequel)
CheminFichierDistant = CheminDistant(Lequel)
End Property

Public Property Get TailleFichier(Lequel)
TailleFichier = TailleDesFichier(Lequel)
End Property

Public Property Get NomForm(Lequel)
NomForm = NomDesForm(Lequel)
End Property

Public Property Get NbFichiers()
NbFichiers = NbDeFichiers
End Property

Private Property Get HttpContentType()
HttpContentType = Request.ServerVariables ("HTTP_CONTENT_TYPE")
End Property

Public Property Get TypeFichier(Lequel)
TypeFichier = TypeDeFichier(NomDesFichier(Lequel))
End Property

Public Property Get ExtensionFichier(Lequel)
ExtensionFichier = Right(NomDesFichier(Lequel), Len(NomDesFichier(Lequel)) - InStrRev(NomDesFichier(Lequel),"."))
End Property

Private Function Preliminaires()
VarFichierBin = Request.BinaryRead(Request.TotalBytes)
VarTailleBinFichier = LenB(VarFichierBin)
End Function

Private Sub Class_Initialize()
ReDim NomDesFichier(0)
ReDim LesFichiers(0)
ReDim TailleDesFichier(0)
ReDim NomDesForm(0)
ReDim CheminDistant(0)
ReDim LesChampTXT(0)
ReDim NomChampTXT(0)
CheminLocal = Server.MapPath(".") & "" ' Dossier d'upload par defaut
LocalNomFichier = "" ' Nom du fichier si l'on souhaite forcer un autre nom que le fichier envoyé
Call Preliminaires
Call LetsGOOOO
End Sub

Private Sub Class_Terminate()
' J'ai mis ces lignes en commentaire car des fois, il me dit type incompatible ?!?
'Set NomDesFichier = Nothing
'Set LesFichiers = Nothing
'Set TailleDesFichier = Nothing
End Sub

Private Function Upl2ADO()
On Error Resume Next
Upl2ADO = False
Dim MonObjRs
Set MonObjRs = CreateObject("ADODB.Recordset")
MonObjRs.Fields.Append "TmpBin", 201, VarTailleBinFichier
MonObjRs.Open
MonObjRs.AddNew
MonObjRs("TmpBin").AppendChunk VarFichierBin
MonObjRs.Update
ToutEnvoi = MonObjRs("TmpBin")
MonObjRs.Close
Set MonObjRs = Nothing
If Err.number <> 0 Then Response.Write "Erreur lors de l'upload du/des fichier(s) : " & vbCrLf & Err.description & "
" : Exit Function
Upl2ADO = True
End Function

Public Function LetsGOOOO()
Dim LesLimites, LimitePosition
Dim CompteFichier
Dim DernierFichierDebut, DernierFichierFin, FichierEnCours
Dim DebutNomFichier, FinNomFichier, NomDuFichier, DernierFichier
Dim DebutFichier, FinFichier, DonneesDuFichier
Dim LeContentType, TailleDuFichier, NomInput
Dim EstFichier

If Not VarTailleBinFichier > 0 Then
Response.Write "Aucun fichier n'a été sélectionné"
Exit Function
End If

If Upl2ADO = True Then
' On Récupère l'entête HTTP
LesLimites = HttpContentType

' On met notre compteur de Fichier à 0
CompteFichier = 0

' On cherche les limites (les Boundaries)
LimitePosition = InStr(1, LesLimites, "boundary=") + 8
LesLimites = "--" & Right(LesLimites, Len(LesLimites) - LimitePosition)

' ********************************************
' ** Les choses sérieuses commencent ici :) **
' ********************************************

' On cherche le 1er fichier
DernierFichierDebut = InStr(1, ToutEnvoi, LesLimites)
DernierFichierFin = InStr(InStr(1, ToutEnvoi ,LesLimites) + 1 , ToutEnvoi , LesLimites) - 1
DernierFichier = False

Do While DernierFichier = False
FichierEnCours = Mid(ToutEnvoi, DernierFichierDebut, DernierFichierFin - DernierFichierDebut)
DebutNomFichier = InStr(1, FichierEnCours, "filename=") + 10
FinNomFichier = InStr(DebutNomFichier, FichierEnCours, Chr(34))

' On vérifie que le champ du fichier n'est pas vide
If DebutNomFichier <> FinNomFichier Then
CompteFichier = CompteFichier + 1
' On récupère le(s) nom(s) du/des champ(s) Input du formulaire
NomInput = InStr(1, FichierEnCours, "name=""")
If NomInput > 0 Then
NomInput = Mid(FichierEnCours, NomInput + 6, InStr(NomInput + 6, FichierEnCours, """") - NomInput - 6)
End If
AjoutNomForm = NomInput

' On récupère le chemin du fichier (distant) puis on extrait juste le non du fichier
NomDuFichier = InStr(1, FichierEnCours, "filename=""")
EstFichier = False
If NomDuFichier > 0 Then
EstFichier = True
NomDuFichier = Mid(FichierEnCours, NomDuFichier + 10, InStr(NomDuFichier + 10, FichierEnCours, """") - NomDuFichier - 10)
End If

' Ici la petite astuce, on vérifie si cet "input" contient un Fichier
If EstFichier = True Then
AjoutCheminDistant = NomDuFichier
NomDuFichier = Right(NomDuFichier, Len(NomDuFichier) - InStrRev(NomDuFichier,""))

' On repère le début du fichier qui se trouve après le Content-Tpye
LeContentType = InStr(1, FichierEnCours, "Content-Type:")
If LeContentType > 0 Then
DebutFichier = InStr(LeContentType, FichierEnCours, vbCrLf) + 4
End If
FinFichier = Len(FichierEnCours)

' Calcul de la taille du fichier
TailleDuFichier = FinFichier - DebutFichier

' Recup. du fichier
DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

AjoutFichier = DonneesDuFichier
AjoutNomFichier = NomDuFichier
AjoutTailleFichier = Len(DonneesDuFichier) 'LaTaille

Else
' C'est ici que cela se passe pour récupérer les valeurs
' tapées dans un champ text, textaera, radio button, checkbox etc...
CompteFichier = CompteFichier - 1
DebutFichier = InStr(InStr(1, FichierEnCours, "name=""") + 6, FichierEnCours, """") + 5
FinFichier = Len(FichierEnCours)

' Calcul de la taille du texte
TailleDuFichier = FinFichier - DebutFichier

' Recup. du texte
DonneesDuFichier = Mid(FichierEnCours, DebutFichier, TailleDuFichier)

AjoutChampNOM = NomInput
AjoutChampTXT = DonneesDuFichier
End If
End If
' On va au fichier suivant
' On repère le début et la fin du fichier suivant
DernierFichierDebut = InStr(DernierFichierFin + 1, ToutEnvoi, LesLimites)
DernierFichierFin = InStr(DernierFichierDebut + 1 , ToutEnvoi, LesLimites) - 1
If Not DernierFichierFin > 0 Then DernierFichier = True
Loop
NbDeFichiers = CompteFichier
' ************************
' ** La Fin du bazar :) **
' ************************

Else
Response.Write "Il y a eu une erreur lors de l'upload"
End If

End Function

Private Function TypeDeFichier(LeFichier)
Dim TmpExt
TmpExt = Right(LeFichier, Len(LeFichier) - InStrRev(LeFichier,"."))
Select Case LCase(TmpExt)
Case "txt"
TypeDeFichier = "text/plain"
Case "doc"
TypeDeFichier = "application/msword"
Case "pdf"
TypeDeFichier = "application/pdf"
' Liste non exhaustive, vous pouvez en rajouter autant que vous voulez
End Select
End Function

End Class
%>
<!----------- Fin Fichier clsUplFich.asp --------->

2 réponses

cs_fabrice69 Messages postés 1765 Date d'inscription jeudi 12 octobre 2000 Statut Membre Dernière intervention 11 décembre 2013 5
30 déc. 2003 à 17:46
Pourquoi mettre l'intégralité du code de Nix dans ce message.
Ceci n'a aucune utilité.
Le moyen d'être sur que le fichier que tu remontes est bien du type que tu souhaite (du moins de l'extension voulue) est de tester cette extension une fois le fichier sur le serveur.
If Extension = TonExtensionVoulu Alors
Conserver le fichier
Sinon
Rejeter le Fichier en l'effacant du server
Fin D'IF

Romelard Fabrice (Alias F___)
0
moneyline Messages postés 2 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 30 décembre 2003
30 déc. 2003 à 18:17
Bonsoir Merci d'avoir répondu aussi rapidement à ma demande.

Je comprends le principe de votre explication mais je suis malheuresemet incapable de le mettre en pratique.

Le code à ajouter ressemblerait-il a cela

Select Case LCase(TmpExt)
Case "txt"
TypeDeFichier = "text/plain"
Case "doc"
TypeDeFichier = "application/msword"
Case "pdf"
TypeDeFichier = "application/pdf"

If TypeDeFichier <> "text/plain" Then delete TypeDeFichier

'Et la je coince

End If

' Liste non exhaustive, vous pouvez en rajouter autant que vous voulez
End Select
End Function
End Class
0
Rejoignez-nous