Discussion:
Modification fonction mail()
(trop ancien pour répondre)
Benjamin
2007-03-16 13:19:30 UTC
Permalink
Bonjour à tous,

j'avais déja essayé il y a quelques mois, et après pas mal de
recherches j'ai pas réussi à trouver une solution satisfaisante, je me
tourne donc vers vous.

Sur un serveur debian que j'administre (des pages perso d'étudiants)
j'ai des utilisateurs qui utilisent des scripts avec la fonction mail,
certains sont pas du tout sécurisés et sont exploités pour envoyer
du spam (et donc queue de qmail avec des milliers de mails...).
J'aimerais bien "taguer" les mails envoyés avec la fonction mail en
rajoutant une ligne contenant l'user qui execute le script ; puisque
sur le serveur les scripts sont éxécutés sous l'user du proprietaire
du compte. L'interet serait d'isoler tout de suite le compte d'origine
en repérant cette ligne dans la source des mails, pour ensuite
analyser le compte et arréter l'envoi de spam.

Pour cela je souhaite modifier les sources de php,
j'ai donc fais la manip suivante (sous php-4.4.4)

Dans la fonction php_mail de ext/standard/mail.c

j'ai rajouté :

int tagspamtl1;
tagspamtl1= getmyuid();

Puis dans la section :

fprintf(sendmail, "To: %s\n", to);
fprintf(sendmail, "Subject: %s\n", subject);
if (headers != NULL) {
fprintf(sendmail, "%s\n", headers);
}
fprintf(sendmail, "\n%s\n", message);
ret = pclose(sendmail);

j'ai rajouté fprintf(sendmail, "Tagspamtl1: %d \n", tagspamtl1);

le but étant de taguer l'email avec l'uid qui lance le script.

En statique (avec tagspamtl1 = 1234 par exemple donc sans utiliser
getmyuid()
) ça fonctionne, le champ est bien rajouté au mail.

En utilisant getmyuid() j'ai une erreur de compilation :

"ext/standard/mail.o(.text+0x448): In function `php_mail':
/usr/local/src/php-4.4.4/ext/standard/mail.c:185: undefined reference
to `getmyuid'
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php] Error 1"

J'ai donc rajouté dans les includes en haut du fichier mail.c :
#include "ext/standard/pageinfo.h"

pageinfo.h contenant la définition de la fonction getmyuid()

mais toujours la même erreur.

si vous avez une idée je suis un peu coincé la ;)

merci pour vos infos,
Olivier Miakinen
2007-03-16 13:41:39 UTC
Permalink
Post by Benjamin
Dans la fonction php_mail de ext/standard/mail.c
int tagspamtl1;
tagspamtl1= getmyuid();
fprintf(sendmail, "To: %s\n", to);
fprintf(sendmail, "Subject: %s\n", subject);
if (headers != NULL) {
fprintf(sendmail, "%s\n", headers);
}
fprintf(sendmail, "\n%s\n", message);
ret = pclose(sendmail);
j'ai rajouté fprintf(sendmail, "Tagspamtl1: %d \n", tagspamtl1);
Tant que tu y es, tu peux vérifier que d'éventuels \n dans to et dans
subject sont forcéments suivis d'une espace ou d'une tabulation, et
refuser l'envoi sinon. Cela permet de ne pas détourner ces champs de
leur utilisation première, tout en n'interdisant pas le « Folding
White Space ». Rien que ça devrait réduire énormément le spam sans
gêner l'utilisation normale.
Post by Benjamin
/usr/local/src/php-4.4.4/ext/standard/mail.c:185: undefined reference
to `getmyuid'
collect2: ld returned 1 exit status
^^
Ce n'est pas une erreur de compilation, mais d'édition de liens. Il te
faut inclure la bibliothèque (library en anglais) contenant la fonction
getmyuid().
Benjamin
2007-03-16 17:13:21 UTC
Permalink
Bonjour,
Post by Olivier Miakinen
Tant que tu y es, tu peux vérifier que d'éventuels \n dans to et dans
subject sont forcéments suivis d'une espace ou d'une tabulation, et
refuser l'envoi sinon. Cela permet de ne pas détourner ces champs de
leur utilisation première, tout en n'interdisant pas le « Folding
White Space ». Rien que ça devrait réduire énormément le spam sans
gêner l'utilisation normale.
bonne idée,
Post by Olivier Miakinen
Post by Benjamin
/usr/local/src/php-4.4.4/ext/standard/mail.c:185: undefined reference
to `getmyuid'
collect2: ld returned 1 exit status
^^
Ce n'est pas une erreur de compilation, mais d'édition de liens. Il te
faut inclure la bibliothèque (library en anglais) contenant la fonction
getmyuid().
j'ai rajouté #include "ext/standard/pageinfo.h" dans mail.c,
pageinfo.h contient la définition de getmyuid,
je pensais que ça suffisait, qu'est-ce qu'il faut que je rajoute en
plus ?


Voici le contenu de pageinfo.h :

/* $Id: pageinfo.h,v 1.10.8.1.8.1 2006/01/01 13:46:57 sniper Exp $ */

#ifndef PAGEINFO_H
#define PAGEINFO_H

PHP_FUNCTION(getmyuid);
PHP_FUNCTION(getmygid);
PHP_FUNCTION(getmypid);
PHP_FUNCTION(getmyinode);
PHP_FUNCTION(getlastmod);

PHPAPI void php_statpage(TSRMLS_D);
PHPAPI long php_getlastmod(TSRMLS_D);
extern long php_getuid(void);
extern long php_getgid(void);

#endif


merci de votre réponse,
Olivier Miakinen
2007-03-16 20:06:05 UTC
Permalink
Post by Benjamin
Post by Olivier Miakinen
Post by Benjamin
collect2: ld returned 1 exit status
^^
Ce n'est pas une erreur de compilation, mais d'édition de liens. Il te
faut inclure la bibliothèque (library en anglais) contenant la fonction
getmyuid().
j'ai rajouté #include "ext/standard/pageinfo.h" dans mail.c,
pageinfo.h contient la définition de getmyuid,
je pensais que ça suffisait, qu'est-ce qu'il faut que je rajoute en
plus ?
/* $Id: pageinfo.h,v 1.10.8.1.8.1 2006/01/01 13:46:57 sniper Exp $ */
#ifndef PAGEINFO_H
#define PAGEINFO_H
PHP_FUNCTION(getmyuid);
Ah, ben c'est la définition d'une fonction PHP, ça, pas celle de la
fonction C que tu dois appeler.

Petite recherche avec Google...
http://gcov.php.net/PHP_HEAD/lcov_html/ext/standard/pageinfo.c.gcov.php

105 : PHP_FUNCTION(getmyuid)
106 2 : {
107 2 : long uid;
108 :
109 2 : uid = php_getuid();
110 2 : if (uid < 0) {
111 0 : RETURN_FALSE;
112 : } else {
113 2 : RETURN_LONG(uid);
114 : }
115 : }
116 : /* }}} */

Tu peux essayer d'appeler plutôt la fonction php_getuid().
Benjamin
2007-03-19 16:28:07 UTC
Permalink
Bonjour,
Post by Olivier Miakinen
Ah, ben c'est la définition d'une fonction PHP, ça, pas celle de la
fonction C que tu dois appeler.
Petite recherche avec Google...http://gcov.php.net/PHP_HEAD/lcov_html/ext/standard/pageinfo.c.gcov.php
105 : PHP_FUNCTION(getmyuid)
106 2 : {
107 2 : long uid;
109 2 : uid = php_getuid();
110 2 : if (uid < 0) {
111 0 : RETURN_FALSE;
112 : } else {
113 2 : RETURN_LONG(uid);
114 : }
115 : }
116 : /* }}} */
Tu peux essayer d'appeler plutôt la fonction php_getuid().
merci, ça fonctionne parfaitement avec php_getuid()

bonne journée,

Bobe
2007-03-17 18:13:54 UTC
Permalink
Post by Olivier Miakinen
Tant que tu y es, tu peux vérifier que d'éventuels \n dans to et dans
subject sont forcéments suivis d'une espace ou d'une tabulation, et
refuser l'envoi sinon. Cela permet de ne pas détourner ces champs de
leur utilisation première, tout en n'interdisant pas le « Folding
White Space ». Rien que ça devrait réduire énormément le spam sans
gêner l'utilisation normale.
PHP le fait déjà (mais seulement pour les entêtes to et subject passés
en argument).

Voir la fonction SKIP_LONG_HEADER_SEP définie au début de
ext/standard/mail.c
--
Aurélien Maille
Continuer la lecture sur narkive:
Loading...