Newbie en C#, léger problème de sécurité avec VS2008.Net

Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020 - 27 juin 2008 à 16:32
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 28 juin 2008 à 22:52
Bonjour à tous,

Je suis débutant dans le monde .Net, et je viens de faire un petit programme en console, permettant d'envoyer des Mails par le biais d'smtp !

Mon programme fonctionne, mais disons que j'ai juste du "salir" un peu mon code, car sinon  Visual Studio ne voulait pas le compiler ! trop de sécurité tue le code!

Je vous explique :

Je créer une variable AdrDest, de type STRING.

Cette variable sera passé en paramètre comme ceci :MailAddress

AdressDest =
new
MailAddress(AdrDest);

Au début de mon programme je déclare ma varibale comme ceci :

String AdrDest;

Le problème est que le programme me sort une erreur de compilation me disant que ma variable AdrDest ne peux pas être vide si elle est utilisée avec MailAdress ! En gros il veux dire qu'une adresse mail ne peux pas être vide ! Ca tombe sous le sens biensur !

Le problème c'est qu'il me dit ca avant que j'ai éxécuté mon programme, et ca....c'est pas cool !

Pour palier à ce problème, j'ai initialisé ma variable AdrDest à [mailto:bidon@bidon.fr bidon@bidon.fr] et tout passe.

Seulement c'est crade, je voudrais savoir si il n'y a pas un moyen en .Net de faire ca plus propre !

Merci les Amis  !

je vous laise mon code si vous voulez zieuter !

using

 System;
using

 System.Net.Mail;
using

 System.Collections.Generic;
using

 System.Linq;
using

 System.Text;
namespace

 ConsoleApplication1{

class
Program{

static
void Main(
string[] args){

// Variables
string Pseudo "", AdrExp "Bidon@Bidon.fr", AdrDest "Bidon@Bidon.fr", CC "Bidon@Bidon.fr", CCI "Bidon@Bidon.fr", Sujet "", Msg "", Path 
"FichierBidon";

// Construction du messageSystem.

Console.ReadLine();

// R‚cupŠre les arguments pass‚s
int nBParam 0;nBParam args.Length;

int i = 0;

if (nBParam > 0){

for (i = 0; i < nBParam-1; i++)
// Parcour des arguments pass‚s et stockage en variable{

switch (args [i]){

case
"-P" :Pseudo=args[i + 1];

break;

case
"-E" :AdrExp = args[i + 1];

break;

case
"-D" :AdrDest = args[i + 1];

break;

case
"-C" :CC = args[i + 1];

break;

case
"-H" :CCI = args[i + 1];

break;

case
"-S" :Sujet = args[i + 1];

break;

case
"-M":Msg = args[i + 1];

break;

case
"-F":Path = args[i + 1];

break;}

}

}

if (nBParam < 3){

System.

Console.WriteLine(
"Vous devez passer en minimum les parametres : -E, ,-D ,-M ");System.

Console.WriteLine(
"");System.

Console.WriteLine(
"Rappel des parametres :");System.

Console.WriteLine(
"");System.

Console.WriteLine(
"-P Pseudo de l'expediteur");System.

Console.WriteLine(
"-E Email de l'expediteur ");System.

Console.WriteLine(
"-D Email de mon destinataire");System.

Console.WriteLine(
"-C Email de mon destinataire en copie");System.

Console.WriteLine(
"-H Email de mon destinataire en copie cachee");System.

Console.WriteLine(
"-S Mon sujet !! ");System.

Console.WriteLine(
"-M Mon message !!");System.

Console.WriteLine(
"-F Chemin d'acces vers fichier a joindre");System.

Console.ReadLine();}

else{

MailMessage mail = 
new
MailMessage();

MailAddress AdressCopy = 
new
MailAddress(CC);

MailAddress AdressCopyHiding = 
new
MailAddress(CCI);

MailAddress AdressDest = 
new
MailAddress(AdrDest);

MailAddress AdressExp = 
new
MailAddress(AdrExp,Pseudo);

Attachment Data = 
new
Attachment(Path);

mail.From = AdressExp;

mail.To.Add(AdressDest);

if (CC != 
"Bidon@Bidon.fr"){

mail.CC.Add(AdressCopy);

}

if (CCI != 
"Bidon@Bidon.fr"){

mail.Bcc.Add(AdressCopyHiding);

}

if (Path != 
"FichierBidon"){

mail.Attachments.Add(Data);

}

mail.Subject = Sujet;

mail.Body = Msg;

mail.SubjectEncoding = 

Encoding.GetEncoding(
"iso-8859-1");mail.BodyEncoding = 

Encoding.GetEncoding(
"iso-8859-1");

 

SmtpClient smtp = 
newSmtpClient();smtp.Host "smtp.xxxxxxxx.com";smtp.Port 25; 

// default.smtp.Credentials = 

new System.Net.
NetworkCredential(
"", 
"");

try{

smtp.Send(mail);

mail.Dispose();

}

catch (
Exception ex){

System.

Console.WriteLine(ex);}

}

}

}

}



Merci à tous les amis ! Bonne après midi !

Nixeus'
A voir également:

3 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
27 juin 2008 à 23:22
Voila d'où vient ton problème :

Tu initialises ta variable AdrDest avec la valeur qui va bien, dans ton switch - ce qui semble donc correct.
Si le compilo n'est pas content, c'est qu'il a une bonne raison de le faire : ton code tel qu'il est fait ne permet pas d'assurer que la variable AdrDest aura forcément une valeur valide lorsque tu arrives à la ligne MailAddress AdressDest =
newMailAddress(AdrDest);

Avec les informations dont il dispose (ton code) le compilateur n'a aucun moyen d'être sur que tout les chemins d'execution possible donneront une valeur à AdrDest (et en l'occurence, il a raison, voir plus bas).

La solution est donc d'initialiser ta variable avec une valeur (ce que tu as fait). Ce n'est pas crade, c'est "safe".

(par exemple, il suffit de lancer ton code avec les paramètres "-P toto -P toto -P toto" pour laisser AdrDest à null, ou bien "-P -P -P" pour le planter...)

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
0
Nixeus Messages postés 192 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 19 octobre 2020
28 juin 2008 à 11:52
Hey mon ami !

Merci de ta réponse !
J'avoue que je m'attendais à ca, mais je pensais qu'il y avait moyen de désactivé cette sécurité dans VS 2008 !

Ils auraient pu mettre un warning ! Je trouve que ca fais un peu assistanat du code !! :) On est censé connaitre les règles de programmation :)

Anfin merci de ta réponse ! :)

Nixeus'
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
28 juin 2008 à 22:52
Salut,

Un warning n'aurait pas de sens, c'est une erreur.

"J'avoue que je m'attendais à ca, mais je pensais qu'il y avait moyen de désactivé cette sécurité dans VS 2008 !"
Je pense que la plupart des utilisateurs de C# appeleraient ça une regression :-D

"On est censé connaitre les règles de programmation :)"
Oui, censés... Nos utilisateurs sont censés savoir utiliser nos applis, et pourtant...

Au pire tu as VB.NET qui te permettra de faire ce genre de chose sans raler (par contre le jour où c'est réellement génant pour le fonctionnement, c'est aussi silencieux).

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous