J'ai créé une application anti-spam qui me donne satisfaction à
l'exception d'un détail qui me hérisse un peu.
J'utilise un système de filtres divers qui sont utilisés en priorité
pour la détection d'un message de spam ...
Domaines internet interdits
Caractères interdits
Charsets interdits
Mots interdits
Expéditeurs interdits
etc ..
et en ultime filtre j'utilise un fichier qui contient les fourchettes
d'adresses IP anormales pour un domaine donné.
Ce fichier est composé :
- d'une adresse IP de début
- d'une adresse IP de fin
- Nom du domaine
Toute adresse IP comprise entre ces 2 adresses n'est pas valide
Mon contrôle est le suivant : pour chaque adresse IP trouvée dans
l'entête d'un
message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci
est comprise entre l'adresse IP de début et l'IP de fin d'un
enregistrement du
fichier : si je trouve une seule fois je considère que le message est
un spam.
Cette recherche fonctionne parfaitement et me donne entièrement
satisfaction :
le fichier contient 17160 fourchettes, mais le temps mis à la détection
me
semble un peu trop long et je voudrais pouvoir l'optimiser.
Pour vérifier une adresse IP donnée quelle procédure écririez-vous pour
avoir
le temps de détection le plus court ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Romain PETIT
Georges Peyre avait soumis l'idée :
Toute adresse IP comprise entre ces 2 adresses n'est pas valide
Comptes-tu faire les mises à jour des noms de domaine et des IP associées ? (les plages d'adresses, c'est relativement mouvant)
Mon contrôle est le suivant : pour chaque adresse IP trouvée dans l'entête d'un message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci est comprise entre l'adresse IP de début et l'IP de fin d'un enregistrement du fichier : si je trouve une seule fois je considère que le message est un spam. Cette recherche fonctionne parfaitement et me donne entièrement satisfaction : le fichier contient 17160 fourchettes, mais le temps mis à la détection me semble un peu trop long et je voudrais pouvoir l'optimiser.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4 nombres décimaux ? Il est préférable d'utiliser directement l'entier long correspondant à l'IP. Une API existe pour cela : http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle : SI (eIPmin < eIPAtester < eIPmax) ALORS ...
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Georges Peyre avait soumis l'idée :
Toute adresse IP comprise entre ces 2 adresses n'est pas valide
Comptes-tu faire les mises à jour des noms de domaine et des IP
associées ?
(les plages d'adresses, c'est relativement mouvant)
Mon contrôle est le suivant : pour chaque adresse IP trouvée dans l'entête
d'un
message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci
est comprise entre l'adresse IP de début et l'IP de fin d'un enregistrement
du
fichier : si je trouve une seule fois je considère que le message est un
spam.
Cette recherche fonctionne parfaitement et me donne entièrement satisfaction
:
le fichier contient 17160 fourchettes, mais le temps mis à la détection me
semble un peu trop long et je voudrais pouvoir l'optimiser.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au
format 4 nombres décimaux ?
Il est préférable d'utiliser directement l'entier long correspondant à
l'IP.
Une API existe pour cela :
http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle :
SI (eIPmin < eIPAtester < eIPmax) ALORS ...
A+
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Toute adresse IP comprise entre ces 2 adresses n'est pas valide
Comptes-tu faire les mises à jour des noms de domaine et des IP associées ? (les plages d'adresses, c'est relativement mouvant)
Mon contrôle est le suivant : pour chaque adresse IP trouvée dans l'entête d'un message, je la reformate en nnn.nnn.nnn.nnn puis je vérifie si celle-ci est comprise entre l'adresse IP de début et l'IP de fin d'un enregistrement du fichier : si je trouve une seule fois je considère que le message est un spam. Cette recherche fonctionne parfaitement et me donne entièrement satisfaction : le fichier contient 17160 fourchettes, mais le temps mis à la détection me semble un peu trop long et je voudrais pouvoir l'optimiser.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4 nombres décimaux ? Il est préférable d'utiliser directement l'entier long correspondant à l'IP. Une API existe pour cela : http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle : SI (eIPmin < eIPAtester < eIPmax) ALORS ...
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Georges Peyre
Bonjour Romain, Toujours aussi pointu !!
Comptes-tu faire les mises à jour des noms de domaine et des IP associées ? (les plages d'adresses, c'est relativement mouvant)
Pas régulièrement : Je ne fais des mises a jour que lorsque je constate que j'ai un blocage pour un message correct.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4 nombres décimaux ?
Pas du tout : je le fais par 4 recherches génériques successives ce qui explique le temps de recherche
Il est préférable d'utiliser directement l'entier long correspondant à l'IP. Une API existe pour cela : http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle :
SI (eIPmin < eIPAtester < eIPmax) ALORS ...
Je vais de ce pas suivre ton conseil
Je remercie infiniment
Cordialement
-- Elle est pas belle la vie ?
Bonjour Romain,
Toujours aussi pointu !!
Comptes-tu faire les mises à jour des noms de domaine et des IP associées ?
(les plages d'adresses, c'est relativement mouvant)
Pas régulièrement : Je ne fais des mises a jour que lorsque je constate
que j'ai
un blocage pour un message correct.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4
nombres décimaux ?
Pas du tout : je le fais par 4 recherches génériques successives ce qui
explique le
temps de recherche
Il est préférable d'utiliser directement l'entier long correspondant à l'IP.
Une API existe pour cela :
http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle :
Comptes-tu faire les mises à jour des noms de domaine et des IP associées ? (les plages d'adresses, c'est relativement mouvant)
Pas régulièrement : Je ne fais des mises a jour que lorsque je constate que j'ai un blocage pour un message correct.
Comment fais-tu ta vérification ? Avec un algo qui compare les IP au format 4 nombres décimaux ?
Pas du tout : je le fais par 4 recherches génériques successives ce qui explique le temps de recherche
Il est préférable d'utiliser directement l'entier long correspondant à l'IP. Une API existe pour cela : http://groups.google.fr/group/fr.comp.developpement.agl.windev/msg/5a8f4ed6b5354bee
Ainsi, tu n'auras qu'à faire un test d'intervalle :
Le probleme est que le résultat est incorrect l'adresse 004.000.038.034 donne 4294967295 et l'adresse 004.000.038.036 donne aussi 4294967295 puis l'adresse 004.000.038.042 donne 4294967295 et l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ? Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ? Où est le problème ?
Le probleme est que le résultat est incorrect
l'adresse 004.000.038.034 donne 4294967295
et
l'adresse 004.000.038.036 donne aussi 4294967295
puis
l'adresse 004.000.038.042 donne 4294967295
et
l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ?
Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?
Où est le problème ?
Le probleme est que le résultat est incorrect l'adresse 004.000.038.034 donne 4294967295 et l'adresse 004.000.038.036 donne aussi 4294967295 puis l'adresse 004.000.038.042 donne 4294967295 et l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ? Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ? Où est le problème ?
// on convertit l'addresse IP en entier 32 bits elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")
SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide") //Attention, donne 3520254932 et non 3570651857 //car sous les machines Intel, les octets sont ordonnés de droite à //gauche //(209.210.211.212) cf //:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winso ck/winsock/inet_addr_2.asp Info(elAdresseIPlong) //la fonction inverse pour retrouver l'adresse IP (ipv4) à partir du long elPointeur est un entier sAdresseIP est un chaîne ASCIIZ sur 255 elPointeur = API("wsock32.dll","inet_ntoa", elAdresseIPlong) sAdresseIP=ChaîneRécupère(elPointeur, crAdresseASCIIZ) Info(sAdresseIP)
Dans ton cas fait attention 004.000.038.036 ne donne pas la même adresse en reverse.
Le probleme est que le résultat est incorrect l'adresse 004.000.038.034 donne 4294967295 et l'adresse 004.000.038.036 donne aussi 4294967295 puis l'adresse 004.000.038.042 donne 4294967295 et l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ? Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ? Où est le problème ?
Cordialement
-- Elle est pas belle la vie ?
-- suivre ce lien pour répondre: http://cerbermail.com/?2KrV3YZXnn Daniel ;-)
Bonjour,
essaie ce code il fonctionne
// on convertit l'addresse IP en entier 32 bits
elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")
SI elAdresseIPlong=4294967295 ALORS Erreur("Adresse IP invalide")
//Attention, donne 3520254932 et non 3570651857
//car sous les machines Intel, les octets sont ordonnés de droite à
//gauche
//(209.210.211.212) cf
//:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winso ck/winsock/inet_addr_2.asp
Info(elAdresseIPlong)
//la fonction inverse pour retrouver l'adresse IP (ipv4) à partir du long
elPointeur est un entier
sAdresseIP est un chaîne ASCIIZ sur 255
elPointeur = API("wsock32.dll","inet_ntoa", elAdresseIPlong)
sAdresseIP=ChaîneRécupère(elPointeur, crAdresseASCIIZ)
Info(sAdresseIP)
Dans ton cas fait attention 004.000.038.036 ne donne pas la même
adresse en reverse.
Le probleme est que le résultat est incorrect
l'adresse 004.000.038.034 donne 4294967295
et
l'adresse 004.000.038.036 donne aussi 4294967295
puis
l'adresse 004.000.038.042 donne 4294967295
et
l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ?
Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?
Où est le problème ?
Cordialement
--
Elle est pas belle la vie ?
--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
// on convertit l'addresse IP en entier 32 bits elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")
SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide") //Attention, donne 3520254932 et non 3570651857 //car sous les machines Intel, les octets sont ordonnés de droite à //gauche //(209.210.211.212) cf //:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winso ck/winsock/inet_addr_2.asp Info(elAdresseIPlong) //la fonction inverse pour retrouver l'adresse IP (ipv4) à partir du long elPointeur est un entier sAdresseIP est un chaîne ASCIIZ sur 255 elPointeur = API("wsock32.dll","inet_ntoa", elAdresseIPlong) sAdresseIP=ChaîneRécupère(elPointeur, crAdresseASCIIZ) Info(sAdresseIP)
Dans ton cas fait attention 004.000.038.036 ne donne pas la même adresse en reverse.
Le probleme est que le résultat est incorrect l'adresse 004.000.038.034 donne 4294967295 et l'adresse 004.000.038.036 donne aussi 4294967295 puis l'adresse 004.000.038.042 donne 4294967295 et l'adresse 004.000.038.052 donne aussi 4294967295
Est-ce que j'utilise mal l'API ? Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ? Où est le problème ?
Cordialement
-- Elle est pas belle la vie ?
-- suivre ce lien pour répondre: http://cerbermail.com/?2KrV3YZXnn Daniel ;-)
Georges Peyre
Bonjour Daniel,
Dans son message précédent, Daniel a écrit :
essaie ce code il fonctionne
// on convertit l'addresse IP en entier 32 bits elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036") SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide")
Le fichier des adresses IP interdites que j'utilise contient des fourchettes d'adresses qui peuvent être invalides ou bidon. Mais ces fourchettes peuvent également contenir des adresses qui seraient bonnes en structure mais néanmoins interdites sur le plan du spam. Je ne peux donc utiliser l'API qui ne transforme pas intégralement le format IP en valeur décimale car cà me ferait supprimer beaucoup de fourchettes.
Donc pour conserver l'intégralité de mon fichier je vais utiliser la formule IpA = Gauche(IPADRESSE.IPDEB,3) IpB = Milieu(IPADRESSE.IPDEB,5,3) IpC = Milieu(IPADRESSE.IPDEB,9,3) IpD = Milieu(IPADRESSE.IPDEB,13,3) AdresseIPDec =((IpA * 256 + IpB) * 256 + IpC ) * 256 + IpD
exemple : 004.000.038.034 donne 67118626 et 004.000.038.036 donne 67118628
Nota : Je n'ai pas besoin transformer une adresse IP Décimale en adresse IP normale
Cordialement
-- Elle est pas belle la vie ?
Bonjour Daniel,
Dans son message précédent, Daniel a écrit :
essaie ce code il fonctionne
// on convertit l'addresse IP en entier 32 bits
elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036")
SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide")
Le fichier des adresses IP interdites que j'utilise contient des
fourchettes d'adresses
qui peuvent être invalides ou bidon. Mais ces fourchettes peuvent
également contenir des
adresses qui seraient bonnes en structure mais néanmoins interdites sur
le plan du spam.
Je ne peux donc utiliser l'API qui ne transforme pas intégralement le
format IP en valeur décimale car cà me ferait supprimer beaucoup de
fourchettes.
Donc pour conserver l'intégralité de mon fichier je vais utiliser la
formule
IpA = Gauche(IPADRESSE.IPDEB,3)
IpB = Milieu(IPADRESSE.IPDEB,5,3)
IpC = Milieu(IPADRESSE.IPDEB,9,3)
IpD = Milieu(IPADRESSE.IPDEB,13,3)
AdresseIPDec =((IpA * 256 + IpB) * 256 + IpC ) * 256 + IpD
exemple : 004.000.038.034 donne 67118626
et 004.000.038.036 donne 67118628
Nota : Je n'ai pas besoin transformer une adresse IP Décimale en
adresse IP normale
// on convertit l'addresse IP en entier 32 bits elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "004.000.038.036") SI elAdresseIPlongB94967295 ALORS Erreur("Adresse IP invalide")
Le fichier des adresses IP interdites que j'utilise contient des fourchettes d'adresses qui peuvent être invalides ou bidon. Mais ces fourchettes peuvent également contenir des adresses qui seraient bonnes en structure mais néanmoins interdites sur le plan du spam. Je ne peux donc utiliser l'API qui ne transforme pas intégralement le format IP en valeur décimale car cà me ferait supprimer beaucoup de fourchettes.
Donc pour conserver l'intégralité de mon fichier je vais utiliser la formule IpA = Gauche(IPADRESSE.IPDEB,3) IpB = Milieu(IPADRESSE.IPDEB,5,3) IpC = Milieu(IPADRESSE.IPDEB,9,3) IpD = Milieu(IPADRESSE.IPDEB,13,3) AdresseIPDec =((IpA * 256 + IpB) * 256 + IpC ) * 256 + IpD
exemple : 004.000.038.034 donne 67118626 et 004.000.038.036 donne 67118628
Nota : Je n'ai pas besoin transformer une adresse IP Décimale en adresse IP normale
Cordialement
-- Elle est pas belle la vie ?
Romain PETIT
Georges Peyre a exposé le 06/05/2005 :
Est-ce que j'utilise mal l'API ?
Oui ! Il faut respecter le format de l'adresse IP : les zéros à gauche n'ont rien à faire là en notation décimale sinon il s'agit d'une adresse IP en octal ! (cf http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp)
elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.34") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.36") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.42") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.52") Trace(elAdresseIPlong)
Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ?
Non, si tu utilises la fonction inverse, tu retomberas sur la bonne adresse (il faudra juste faire attention si tu dois reconvertir "en manuel"). (je te conseille d'utiliser l'API plutôt que le calcul, c'est plus rapide)
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Georges Peyre a exposé le 06/05/2005 :
Est-ce que j'utilise mal l'API ?
Oui ! Il faut respecter le format de l'adresse IP : les zéros à gauche
n'ont rien à faire là en notation décimale sinon il s'agit d'une
adresse IP en octal !
(cf
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp)
elAdresseIPlong est un entier sans signe
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.34")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.36")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.42")
Trace(elAdresseIPlong)
elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.52")
Trace(elAdresseIPlong)
Compte-tenu de l'observation sur le traitement de Intel faut il fournir
l'adresse inverse à l'API ?
Non, si tu utilises la fonction inverse, tu retomberas sur la bonne
adresse (il faudra juste faire attention si tu dois reconvertir "en
manuel").
(je te conseille d'utiliser l'API plutôt que le calcul, c'est plus
rapide)
A+
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
Oui ! Il faut respecter le format de l'adresse IP : les zéros à gauche n'ont rien à faire là en notation décimale sinon il s'agit d'une adresse IP en octal ! (cf http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/inet_addr_2.asp)
elAdresseIPlong est un entier sans signe elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.34") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.36") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.42") Trace(elAdresseIPlong) elAdresseIPlong = API("wsock32.dll","inet_addr", "4.0.38.52") Trace(elAdresseIPlong)
Compte-tenu de l'observation sur le traitement de Intel faut il fournir l'adresse inverse à l'API ?
Non, si tu utilises la fonction inverse, tu retomberas sur la bonne adresse (il faudra juste faire attention si tu dois reconvertir "en manuel"). (je te conseille d'utiliser l'API plutôt que le calcul, c'est plus rapide)
A+
-- Romain PETIT http://cerbermail.com/?O16kfXOFcq (cliquez sur le lien ci-dessus pour me contacter en privé)
Georges Peyre
Merci à Romain et Daniel
Grâce à vous mon programme tourne 10 FOIS PLUS VITE ( air connu )
Cordialement
-- Elle est pas belle la vie ?
Merci à Romain et Daniel
Grâce à vous mon programme tourne 10 FOIS PLUS VITE ( air connu )