SQL Serveur-Conserver le 'path' ou le fichier

Fermé
Car0 - 16 déc. 2004 à 17:58
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 7 janv. 2005 à 17:58
Bonjour,

J'ai une application qui permet de publier des documents pour l'intranet. Ces documents sont alors disponibles pour tous les usagers de l'intranet. Certains utilisateurs me demandent maintenant la possibilité de protéger leur fichier par un mot de passe, pour qu'il soit accessible seulement à leur section par exemple. Et donc, me voilà en train de réfléchir à la manière d'implémenter une telle chose, si cela est possible, etc etc.

Question implémentation :
J'ai une bd SQL Serveur où je conserve le path pour accéder aux divers fichiers. Sauf les exécutables, n'importe quel type de fichier peut être téléchargés.

Le problème :
le path... bien ne reste qu'un simple path. Si le nom du fichier est connu, il est toujours possible de le taper directement dans la barre d'adresse et alors, peu importe le mot de passe qui aurait pu être ajouté.

Ma solution:
Conserver le fichier plutôt que le path dans la bd et ajouter un champ mot de passe.

J'ai pensé aussi aux utilitaires de certains logiciels qui permettent de sauver un document avec un mot de passe mais ce n'est pas assez général comme solution.


J'aimerais avoir des commentaires sur ma "solution". J'ai conscience que sauvegarder des fichiers plutôt que des paths est pas mal plus lourd sur la bd et aussi sur le temps de réponse mais je ne sais trop à quel point... Peut-être aussi que certains ont d'autres idées?

Merci!
Caroline
A voir également:

5 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
16 déc. 2004 à 18:15
Conserver le fichier plutôt que le path dans la bd et ajouter un champ mot de passe.


ça me semble une bonne solution.

Les champs de type IMAGE dans SQL Server permettent de stocker des fichiers jusqu'à 2 Go.

Après il suffira de faire un CGI (ou autre (ASP, php, etc.)) qui renvoi (ou non) le fichier de la base en fonction des droits utilisateur.


Note que je te conseille vivement de bien penser ta gestion des utilisateurs.
- prévoir un site web pour gérer les utilisateurs ?
- prévoir des admins qui pourront administrer ces utilisateurs ?
- crééer des groupes d'utilisateurs ? (compta, logistique, etc.) afin de pouvoir donner des droits d'accès à des groupes de fichiers.
- droits en lecture seule, en lecture/écriture ?
- historique des modifications ?
- etc.


Enfin, ne jamais stocker directement les mots de passe en base.
Il ne faut stocker que le hash du mot de passe (par exemple un SHA-1 du mot de passe).

Ainsi si un développeur ou un utilisateur mal intentionné tombe par hasard sur la base de données, il ne pourra pas retrouver le mot de passe à partir du hash.
0
Merci sebsauvage.

Et merci pour tes autres conseils. En fait, la gestion des utilisateurs et l'application qui les gère (asp) existent déjà. L'application de publication de fichier n'est qu'une parmi un lot d'autres et les mesures dont tu parles ont déjà des standards d'implémentation(hé... et pas de hash. Les 20 ans d'expérience de mon supérieur contre mon tout rescent diplôme en programmation... ça fait pas le poid, même si j'ai essayé ;-)

Pour les autres qui lisent, y'a des fonctions sympa pour hasher un mot de passe sans passer par l'étude des types de crypto. Dans mysql: password(). Dans sqlserver: pwdencrypt() (quoique je suis tombé sur une étude "comment cracker les mdp de Sql server 2000... y'a peut-être mieux maintenant)

Caroline
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
16 déc. 2004 à 19:35
Les 20 ans d'expérience de mon supérieur

baha... :-(
C'est le genre d'argument qui me fait pouffer.
L'informatique actuelle n'a plus rien à voir avec ce qu'elle était il y a 20 ans, la sécurité informatique non plus !

Quand quelqu'un me sort ce genre d'argument, j'ai tendance à lui répondre: "Si tu crois que tu n'a plus rien à apprendre, c'est que tu es mort !".

Il devrait peut-être se documenter un peu, lire, par exemple "Applied cryptography".

Mébon... passons sur cet énervement passager.


Bon courage à toi.


(ça me rappelle un prof de Cobol, qui était arrivé en même temps que les murs de l'IUT (il y a 30 ans) et qui nous soutenais mordicus qu'on pouvait très bien faire le système de navigation d'un Rafale en Cobol.
Certes, mais ce n'est pas raisonnable.)
0
Bonjour!
Pour ceux que ça intéresserait, j'ai trouvé une bien meilleure solution pour mettre en place ma sécurité sur les fichiers par mot de passe. Ça suppose simplement que tous les fichiers sont sous un répertoire racine et que ce répertoire ne contient pas de fichiers qui doivent pouvoir être accéder directement (ce qui était mon cas)

1- On bloque le répertoire racine en passant par IIS (pas d'accès en lecture)
=>Taper l'url directement dans la barre d'adresse donnera un acces denied.

2- et on crée une page asp qui va scanner le fichier en binaire et le renvoyer au client
=>Notre script a accès au fichier puisqu'il passe par le système de fichier de la machine "c:/...etc" et non pas par IIS.

En procédent ainsi, le client est obligé de passer par notre page asp, qui peut alors d'abord vérifier si un mot de passe est nécessaire.

Tant mieux si le script suivant peut aider quelqu'un.
Voici mon algorithme "en français":

1-Lire les paramètres (GET ou POST) "id du fichier" et "mot de passe" donné par l'usager

2-Interroger la base de donnée pour obtenir les infos sur le fichier demandé (on ajoute une clause WHERE ... AND motdepasse = "mot de passe" si un mot de passe a été donné par l'usager)

3.1-Si aucun document n'est trouvé, préparer l'affichage d'un message d'erreur "Fichier inexistant ou mot de passe invalide"

3.2-Autrement, si aucun mot de passe n'a été précisé mais qu'un mot de passe est requis (selon les infos sur le fichier), préparer l'affichage du formulaire "Veuillez entrer un mot de passe"

3.3-Autrement, préparer l'affichage du fichier

4.1-Si un message d'affichage a été préparé, l'afficher
4.2-Sinon envoyer le fichier

La partie un brin plus compliquée concerne la manière d'afficher le fichier (le 4.2). Il reste ensuite a appeler le script afficherpage.asp?fileid=x dans le href de la balise A plutôt que de mettre le path du fichier directement.

Pour 4.2:
'set filename plus haut

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 'adTypeBinary
objStream.LoadFromFile( filename ) 'filename correspond au chemin complet du fichier
	
Response.Expires = 0      'faire sûr que le buffer est prêt et VIDE
Response.Buffer = true
Response.Clear

Response.ContentType = getMime(filename) 'important! C'est ça qui permet au navigateur d'ouvrir le bon type d'application (de lancer Acrobat reader ou Word par exemple)
Response.BinaryWrite objStream.Read(-1)	'adReadAll = -1 'Le fichier
Response.End
objStream.Close	
set objStream = Nothing


Et la fonction getMime:
function getMime(filename)
    dim temp
    temp = Lcase (right(fileName, len(fileName) - InStrRev(fileName,".")))		'on lit les x derniers caracteres de la fin de la chaine jusqu'a la position du dernier ".", puis on convertie en minuscules
    select case temp
	case "doc" 		temp = "application/msword"
	case "mdb"		temp = "application/msaccess"
	case "pdf"		temp = "application/pdf"
	case "rtf"			temp = "application/rtf"
	case "xls"		temp = "application/x-msexcel"
	case "ppt"		temp = "application/x-mspowerpoint"
	case "wpd"		temp = "application/wpd"	'à confirmer
	case "wav"		temp = "audio/x-wav"
	case	"mp3"		temp = "audio/x-wav"	'à confirmer
	case "gif"			temp = "image/gif"
	case "jpeg", "jpg", "jpe"	temp = "image/jpeg"
	case "bmp"		temp = "image/bitmap"
	case "css"		temp = "text/css"
	case "htm", "html"		temp = "text/html"
	case "txt"		temp = "text/plain"
	case "xml"		temp = "text/xml"		
	case "msg"		temp = "text/html"		'à confirmer
	case "wmv", "avi"		temp = "video/x-msvideo"	'à confirmer
	case else temp = "text/html"		'inconnu
    end select
    getMime = temp
end function
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
7 janv. 2005 à 17:58
cette façon de faire me semble bonne question sécurité.
impec.
:-)
0