Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Modification fonction mail()

5 réponses
Avatar
Benjamin
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,

5 réponses

Avatar
Olivier Miakinen

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

j'ai rajouté :

int tagspamtl1;
tagspamtl1= getmyuid();

Puis dans la section :

fprintf(sendmail, "To: %sn", to);
fprintf(sendmail, "Subject: %sn", subject);
if (headers != NULL) {
fprintf(sendmail, "%sn", headers);
}
fprintf(sendmail, "n%sn", 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.

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
^^

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().

Avatar
Benjamin
Bonjour,



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,

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


^^
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,


Avatar
Olivier Miakinen

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);


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().



Avatar
Bobe
Olivier Miakinen nous a dit le 16.03.2007 14:41:

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

Avatar
Benjamin
Bonjour,

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().


merci, ça fonctionne parfaitement avec php_getuid()

bonne journée,