User et mot de passe dans une db en .net

Signaler
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006
-
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006
-
bonjour,

je suis en train de créer un écran de login pour un de mes prog.

j'ai créé une db avec une seule table dans laquelle on retrouve les noms et mot de passe des utilisateurs.

dans ma page de login, j'ai mis une combo que je rempli avec un datareader et qui va contenir les noms des utilisateurs.

en dessous de la combo, j'ai une textbox qui va permettre l'utilisateur d'entrer son mot de passe

mais je ne sais vraiment pas comment m'y prendre pour que lorsqu'un
utilisateur choisit son nom dans la combo, le test vérifie dans la db
si c'est bien son mot de passe.



je sais c'est pas très clair, mais je crois que vous me comprenez, (du moins j'espère)

qqn a une idée?

34 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
Je comprend pas ce que t'entend par >=1 le but du jeu c'est de
mettre une condition toujours vrai, en théorie 1=1 devrait toujours
être vrai mais tu peux mettre 2>1 aussi



Sinon au niveau de la sécurité, moi je fais que de l'internet donc tout
le monde peut avoir accés au site, la sécurité c'est donc un quotidien,
et quand je vois ce genre de chose, ca me fait peur

<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
328
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
24 novembre 2005

select * from utilisateurs where login='Cyri'l and password='' or 1=1 -- ' et la il va te retourner au moins une ligne, l'utilisateur aura accés à ton application.

kan tu dis au moins une ligne cad?
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
ca va te retourner toutes les lignes de ta bdd.



en fait quand tu fais ta requete il faut la comprendre comme ca :
SELECT * from utilisateurs

WHERE ((login='Cyri'l AND password='') OR 1=1 -- ')



Il te selectionne toutes les lignes tant que la condition du where est
vrai. s'il n'y a pas le OR 1=1 -- la condition sera vrai si et
seulement si, le login est cyril et le password est correct. quand on
rajoute OR 1=1 -- la condition est vrai si le pass correspond au login
ou si 1=1; comme 1 est toujours égale à 1, la condition sera vrai pour
toutes les lignes.



le -- que je rajoute à la fin, c'est pour dire que tout ce qui suite
c'est du commentaire, si on le met pas généralement ca fait une erreur
de syntaxe.



J'espere que mes explications sont un peu plus clairs



<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
328
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
24 novembre 2005

c'est très clair.
mon idée était de faire
select * from ... where pass=... and user = ...
et apres voir si il y a 1 ligne retournée.
si on rajoute ta méthode pr passer 1=1 il retournera + que 1
est ce qu'il peut meme contourner?
t'utilise koi toi?pr un log sur un site web stp

Fabrice
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
Pour la sécurité je fais aucun appel directe au tables de la bdd, je
fais tout par des procédures stockées. Je te conseil d'aller voir la
démo du logiciel www.d4modelizer.com qui est excellent pour ca.



Ensuite je vérifie mes champs, je vérifie le nombre de caractère max,
car dans ton cas ma requete fait que 10 caractères, et ne fait pas
grand chose, mais il est possible de faire des lignes de plusieurs
centaines de caractère qui redemarre le serveur etc...



Donc tout en procédure stockée, et bien vérifié les données, et au lieu
de vérifier s'il y a bien une ligne, regarde par exemple s'il n'y a
qu'une seule ligne et que le pseudo de la ligne retourné correspond
bien au pseudo demandé...

<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
328
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
24 novembre 2005

j'aime bien l idée de vérifier le retour,assez simple a mettre en oeuvre.
pour ce qui est du controle,a part vérifier le nbe de caractère (et les caractères interdit (par ex)

je vé regarder le site.merci

les procédures stockées elles font quoi exactement?

tu dis si je te saoule.... :-)

merci encore

Fabrice
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006

pr en revenir au premier problème (excusez moi de vous interrompre), voici une partie de mon code :
pour remplir la combo qui contient les users qui sont dans ma db, voici comment je fais


OleDbConnection1.Open()



Dim dr
As OleDbDataReader = OleDbCommand1.ExecuteReader()



Do
While dr.Read()


ComboBox1.Items.Add(dr.GetString(0))



Loop


dr.Close()


OleDbConnection1.Close()

ensuite, pour tester le mot de passe avec le bon login, voici ma méthode :


Dim requete
As
String = "SELECT password FROM noms WHERE login= " & ComboBox1.Text


TextBox2.Text = requete


DataSet11.ReadXml("utilisateurs.xml")



Dim login
As
String = ComboBox1.Text
'le login à vérifier est celui choisi dans la combo



For i
As
Integer = 0
To DataSet11.Tables(0).Rows.Count


i = i + 1



If (DataSet11.Tables(0).Rows(i)(0) = login)
Then



If (DataSet11.Tables(0).Rows(i)(1) = TextBox2.Text)
Then



'ouvrir la fenêtre principale si login et password corrects



Dim programme
As Form2


programme =
New Form2


programme.Show()


programme.panel_nom_utilisateur.Text = "Opérateur connecté : " & login



'fermer la page de login



Me.Hide()



End
If



End
If



Next
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
Je trouve que tu fais quand meme pas mal de trucs, c'est possible de mieux optimiser.



Et rassure moi, le dataset que tu charges d'un fichier xml, c'est juste
pour tester ? car un fichier xml est tres facile à lire, et tu as
dedans tout les mots de passes en clair



sinon au lieu de faire deux if imbriqués fait plutot

if test1 andalso test2 then



mais moi je ferais pas du tout comme ca deja je passerais par des procédures stockées.



J'ai fait une petite fonction, j'ai fait ca vite fait, et j'ai du faire
des conneries, car je me souviens plus tres bien. mais voila a quoi ca
ressemble.



Public Function isAuthentified(ByVal Login As String, ByVal PassWord As String) As Boolean

Dim rtn As Boolean = False



Dim cnx As New SqlConnection("connectionstring")

Try

cnx.Open()

Dim
cmd As New SqlCommand("SELECT login FROM names Where Login=@Login And
PassWord=@Password", cnx)

Dim dr As SqlDataReader

Try


cmd.CommandType = CommandType.TableDirect

cmd.Parameters.Add("@Login", Login)


cmd.Parameters.Add("@Password", PassWord)

dr = cmd.ExecuteReader()



If dr.GetString(0) = Login Then

rtn = True

End If



Catch ex As Exception

'gestion de cette erreur

Finally

cmd.Dispose()

dr.Close()

End Try



Catch ex As Exception


'Gestion de la premiere exception, generallement connectionString
mauvaise

cnx.Close()

cnx.Dispose()

End Try



Return rtn

End Function





Niveau sécurité c'est encore pas le top, on peut faire mieux, déjà en
passant par des vrais procédures stockés, car la c'est pas tout à fait
ca, les procédures stockés, vérifieront le type de la donnée qui entre
et puis pour une securité un peu plus accrus faudrais encodé le
password, vérifiait les données avant de les envoyer à la requete
etc...



Mais bon, je ne suis encore pas expert en sécurité, on m'a conseillé de
lire un livre, je me souviens plus du nom, si tu veux je peux te le
retrouver, et c'est un bouquin de reference pour les developpeurs à
Redmond je crois que c'est ecrire du code sécurisé des editions Ms Press.



Sinon pour Trabice, une procédure stockées, ca s'ecrit coté serveur SQL, ca ressemble à un ca :



Une procédure relativement simple :



create procedure dbo.AddUser



@FirstName nvarchar(50),

@LastName nvarchar(50)



as



insert into Users (

FirstName,

LastName

)

values (

@FirstName,

@LastName

)



select SCOPE_IDENTITY()

GO



(je l'ai tronqué )



et une procédure stockée un peu plus complexe peut ressemblé à ca :



create procedure dbo.yaf_topic_prune(@ForumID int=null,@Days int) as

begin

declare @c cursor

declare @TopicID int

declare @Count int

set @Count = 0

if @ForumID 0 set @ForumID null

if @ForumID is not null begin

set @c = cursor for

select

TopicID

from

yaf_Topic

where

ForumID = @ForumID and

Priority = 0 and

datediff(dd,LastPosted,getdate())>@Days

end

else begin

set @c = cursor for

select

TopicID

from

yaf_Topic

where

Priority = 0 and

datediff(dd,LastPosted,getdate())>@Days

end

open @c

fetch @c into @TopicID

while @@FETCH_STATUS=0 begin

exec yaf_topic_delete @TopicID,0

set @Count = @Count + 1

fetch @c into @TopicID

end

close @c

deallocate @c



-- This takes forever with many posts...

--exec yaf_topic_updatelastpost



select Count = @Count

end

GO



Les procédures stockées peuvent s'appeller entre elles, ce qui est
souvent tres pratique, elles sont compilés au sein du serveur, donc
plus rapide etc... il y a plein d'article la dessus, si tu as des
questions va plutot sur sqlfr.com car moi je debute avec sql et je ne connais rien que les "bases"





<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006

je ne comprend pas bien ta fonction
puis mes paramètres, je voudrais que ce soit ma combo avec tous les users qui peuvent se connecter, et ma textbox pour entrer le mot de passe.
ensuite, je ne sais pas où je peux passer mes paramètres : dans l'évênement de mon bouton OK?
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
apres t'as qu'a appeller ma fonction comme ceci



if isAuthentified(
ComboBox1.Text,
TextBox2.Text) then

form2.show

else

messagebox.show("il y a eu une erreur en vous loggant" & vbneline & "mot de passe et/ou login incorrect")

end if





Mais il va surement falloir modifié ma fonction car j'ai du faire des erreurs et oui nul n'est parfait


<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006

voici le code de mon programme : il se lance bien, m'affiche ma page de
login (l'autre form ne se montre pas, comme voulu), ma combo se remplit
bien avec les utilisateurs que j'ai dans ma db, mais quand je clique
sur valider, il ne se passe rien





Imports System.Data.OleDb



Public Class Form2

Inherits System.Windows.Forms.Form





Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If isAuthentified(ComboBox1.Text, TextBox2.Text) Then

Dim form1 As New Form1

form1.Show()

End If

End Sub



Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'remplissage de la combo avec les utilisateurs du programme

OleDbConnection1.Open()

Dim cnxcombo As New OleDbConnection(OleDbConnection1.ConnectionString)

Dim cmdcombo As New OleDbCommand("SELECT login FROM noms", cnxcombo)

cnxcombo.Open()

Dim dr As OleDbDataReader = cmdcombo.ExecuteReader()

Do While dr.Read()

ComboBox1.Items.Add(dr.GetString(0))

Loop

dr.Close()

cnxcombo.Close()

End Sub



Public Function isAuthentified(ByVal Login As String, ByVal Password As String) As Boolean

Dim rtn As Boolean = False

Dim cnx As New OleDbConnection(OleDbConnection1.ConnectionString)

Try

cnx.Open()

Dim
cmd As New OleDbCommand("SELECT login FROM utilisateurs WHERE
login=@login AND password=@password", cnx)

Dim dr As OleDbDataReader

Try


cmd.CommandType = CommandType.TableDirect

cmd.Parameters.Add("@login", Login)


cmd.Parameters.Add("@password", Password)

dr = cmd.ExecuteReader()

If dr.GetString(0) = Login Then

rtn = True

End If



Catch ex As Exception

'gestion de l'erreur

Finally

cmd.Dispose()

dr.Close()

End Try



Catch ex As Exception


'gestion de la 1è exception : souvent connectionstring mauvaise

cnx.Close()

cnx.Dispose()

End Try

Return rtn

End Function

End Class
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
29
t'as fait un debug ?



car je suis pas du tout sur de ma fonction, regarde comment elle se
deroule pas à pas, t'as juste à mettre un point d'arret (F9) et appuyer
sur F5, apres tu regardes ce que te rends la fonction isAuthentified,
et tu regardes ou est le problème

<hr>

Cyril - http://Hoshimi.CodeS-SourceS.fr
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006

ben j'ai fait ca, mais il m'affiche que combobox vaut ce que j'y ai
choisi, et que textbox vaut ce que j'y ai entré. ca ne va pas plus loin.



je vais laisser ce problème sur le coté un petit peu, j'essaierais encore plus tard.
Messages postés
167
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 janvier 2006

qqn sait regarder ce qui se passe?

je lance mon applic sur une autre machine où j'ai mis le framework et voici ce que je récupère :

http://users.skynet.be/penchu/exception.bmp



qqn peut m'aider sur ce coup là?

il faut rajouter des bibliothèques?si oui comment faire?