Portál AbcLinuxu, 7. května 2025 14:48
U starších verzí php je problém s logováním ... Když tak neučiníš, může se ti krásně stát, že se ti ve frontě objeví pár stovek tisíc emailů a ty nebudeš schopen určit, odkud se tam ocitly.Záleží teda, co máš přesně na mysli, ale Postfix loguje tohle:
mail.info: postfix/pickup[6682]: 4174238AC: uid=1001 from=<adresa>Víc informací IMO ze SMTP přihlášení v praxi stejně nedostaneš.
ktery ti to bude logovatKterý bude logovat co? To, že někdo použil funkci mail, respektive rozhraní sendmail, na které je mapovaná, vidím v syslogu.
kdyz nekdo pouzije funkci mail v php (http://php.net/manual/en/function.mail.php), tak zjistite informace o scriptu ze syslogu?Psal jsem někde něco takového?
logovat tam lze cokoliv, co si vymyslite (wrapper musite napsat sam)Ok, když už se o tom bavíme, kde ty informace k logování vezmu? Jmenovitě třeba to, který skript tu funkci zavolal. V **argv nejsou a podle krátkého pokusu v proměnných prostředí taky ne.
dle "ukazkovych" scriptu, by mely byt nejake informace v promennych prostrediNejsou. Nebo přinejmenším u mě ne, IIRC je maže suexec - jedině je doplnit pomocí putenv()
pokud by se pouzivala smtp autentifikace, nepujde podvrhnout odesilany emailTohle není pravda, rozhodně ne obecně. Pokud někdo zneužije funkcionalitu rozesílání mailů nějakého webu, nepotřebuje přihlašovací údaje - ty za spammera aplikace ochotně pošle sama. Nehledě na to, že typická bezpečnostní chyba útočníkovi umožňuje nahrát si do toho webu, co se mu zlíbí, a tím následně taky stáhnout, co se mu zlíbí.
(a v pripade kompromitace / spamu lze ten ucet zakazat), coz u php mail funkce nejdeFunkci mail() samozřejmě zakázat jde. Buď v PHP (
disable_functions
), nebo zablokovat uživatele v Postfixu (authorized_submit_users
v main.cf). Samozřejmě připadá v úvahu i dělat to v tom wrapperu.
Nejsou. Nebo přinejmenším u mě ne, IIRC je maže suexec - jedině je doplnit pomocí putenv()Vy mate nejake ukazkove scripty? Apache server zadne neobsahuje, proto "ukazkove"
Tohle není pravda, rozhodně ne obecně. Pokud někdo zneužije funkcionalitu rozesílání mailů nějakého webu, nepotřebuje přihlašovací údaje - ty za spammera aplikace ochotně pošle sama. Nehledě na to, že typická bezpečnostní chyba útočníkovi umožňuje nahrát si do toho webu, co se mu zlíbí, a tím následně taky stáhnout, co se mu zlíbí.Takze nelze zakazat emailovy ucet, ktery byl kompromitovan, at uz slabym heslem, nebo bezpecnostni dirou? Nebo existuje v pouzivanych MTA takova bezpecnostni dira, ze lze odeslat email pod jakymkoliv uzivatelem?
Funkci mail() samozřejmě zakázat jde. Buď v PHP (Takze misto zakazani smtp uctu je lepsi zmenit nastaveni php.ini a restartovat cely webovy server?disable_functions
), nebo zablokovat uživatele v Postfixu (authorized_submit_users
v main.cf). Samozřejmě připadá v úvahu i dělat to v tom wrapperu.
Vy mate nejake ukazkove scripty?O ukázkových skriptech jste začal mluvit vy. Mě jako ukázkový stačí takový skript, který použije funkci mail a já se podívám na proměnné prostředí. Nic popisující klienta tam nebylo.
Takze nelze zakazat emailovy ucet, ktery byl kompromitovan, at uz slabym heslem, nebo bezpecnostni dirou?Opět, kde něco takového říkám? A na druhou stranu, jak přesně zakázání účtu zabrání podvrhnout odeslaný e-mail (tvrdíte vy), poté, co už odešel ze serveru?
Takze misto zakazani smtp uctu je lepsi zmenit nastaveni php.ini a restartovat cely webovy server?Ok, začínám mít lehce pocit, že s tím Apache a PHP zase moc neumíte, co? Restartovat webserver kvůli změně php.ini? Vážně?
Ctete poradne, o cem se vlastne hadate (viz puvodni prispevek od Maxe -> tedy to, ze je lepsi se funkci mail() vyhnout a autentizovat kazdeho pres smtp)To jsem udělal a zatím tady dva lidi mají docela problém objasnit, v čem je autentizace přes smtp lepší oproti funkci mail() bez wrapperu.
php fci mail nepoužívata následuje
Nejlepší je hnát uživatele k tomu, aby se na smtp přihlašovali pod uživatelským jménem a heslem, tzn., aby se ověřovali a vše jsi měl tak pod palcem tak, jak to má být. Když tak neučiníš, může se ti krásně stát, že se ti ve frontě objeví pár stovek tisíc emailů a ty nebudeš schopen určit, odkud se tam ocitly.To je to, s čím nesouhlasím. Když ti někdo zneužije funkci mail a když zneužije přihlašovací údaje, budeš vědět úplně to samé, tj. kdo to byl. Nic víc. U funkce mail() máš nicméně možnosti, jak logovat věci navíc (použitím nějakého wrapperu), v SMTP relaci máš akorát smůlu.
Samozřejmě je nejlepší vynechat v citátu tu nejdůležitější část, ke které se tato připomínka vztahuje, tj. "U starších verzí php je problém s logováním...".Já to nevynechávám (všimněte si, že tu část o logování jsem citoval už v druhém příspěvku ve vlákně.) Ptám se ale, v čem je - když použiju smtp přihlášení - lepší logování oproti tomu, když použiju funkci mail() ve starém PHP. U SMTP přihlášení mám SMTP uživatele, čas, odesílatel, příjemce. S funkcí mail() mám UID uživatele, čas, odesílatel, příjemce. Podle mě je to z praktického hlediska totéž - vím, kdo má děravý web, nevím, kde je děravý (i když na 99.9% budou časy odeslání docela dobře odpovídat nějakým POST požadavkům v access logu.) A naopak, když přejdeme k novým verzím PHP, tak u SMTP mám pořád jenom uživatele, čas, odesílatel, příjemce, kdežto PHP mi zaloguje (tvrdí předřečník výše) dodatečné informace navíc. Takže když radíte nepoužívat funkci mail(), abyste měl vše pod palcem, tak by mě zajímalo, co přesně tím máte lépe pod palcem.
Také nevím, jak je to u jiných mailových řešení a starších verzí ohledně logování uid u smtp.Přečtěte si ten řádek ze syslogu, který jsem napsal. Na PHP to vůbec nezávisí, zalogoval to Postfix (postfix/pickup[6682])
A i tak mi v novějších verzích přijde systémovější to hnát přes klasické ověřování, které podle mně umožňí lepší kontrolu, případně nastavení různých omezení per user, což s fcí php mail nenastavíš.Souhlas, samotným mail() se to nenastaví. Na druhou stranu na taková nastavení je podle mě lepší wrapper skript (pokud nejsou zapotřebí nějaké velké divočiny - a upřímně, většinou nejsou.) Přinejmenším pak odesílání nepotřebuje navazovat žádné síťové spojení a všechno se řeší lokálně (pipe na předání dat, exitcode na stav).
Přinejmenším pak odesílání nepotřebuje navazovat žádné síťové spojení a všechno se řeší lokálně (pipe na předání dat, exitcode na stav).Ale zas každý mail znamená spuštění nového procesu, což problém může být, pokud těch mailů posíláte 1000. U SMTP lze na jednom spojení využít pipelining. A i kdyby ne, tak lokální socket nebo i TCP na localhost je rychlejší a obecně méně náročné na zdroje, než spuštění nového procesu a předávání přes pipe.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.