penchu
Messages postés167Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 janvier 2006
-
31 janv. 2005 à 14:44
penchu
Messages postés167Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 janvier 2006
-
2 févr. 2005 à 17:12
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)
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 1 févr. 2005 à 11:51
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
cs_trabice
Messages postés328Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention24 novembre 20051 1 févr. 2005 à 12:16
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.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 1 févr. 2005 à 13:09
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
cs_trabice
Messages postés328Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention24 novembre 20051 1 févr. 2005 à 13:19
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 1 févr. 2005 à 13:35
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é...
cs_trabice
Messages postés328Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention24 novembre 20051 1 févr. 2005 à 13:44
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?
penchu
Messages postés167Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 janvier 2006 1 févr. 2005 à 13:50
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
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 1 févr. 2005 à 15:32
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"
penchu
Messages postés167Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 janvier 2006 1 févr. 2005 à 16:57
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?
penchu
Messages postés167Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 janvier 2006 2 févr. 2005 à 10:16
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
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 2 févr. 2005 à 15:45
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