Posílání exception e-mailem včetně HTML z Tracy
- Petr Parolek
- Člen | 455
Ahoj, jak mám prosím posílat při chybě na serveru exception e-mailem včetně HTML v příloze z Tracy? Běžný logger pošle jen jednoduchou chybu bez podrobností.
Editoval Petr Parolek (19. 7. 2022 19:21)
- David Grudl
- Nette Core | 8239
Něco takového je strašně nebezpečné, HTML může obsahovat věci, které se emailem posílat nemají.
- Pavel Kravčík
- Člen | 1196
Když jsme u těch obskurních řešení, můžeš to zaheslovat a poslat zipem. :)
- Kamil Valenta
- Člen | 822
A opravdu tím zahesluješ vytvářený zip v php?
(neslouží to jen k dekompresi zaheslovaného zipu?)
Před nějakým časem jsem to řešil a moc se ničeho nedobral…
Editoval Kamil Valenta (21. 7. 2022 13:58)
- Pavel Kravčík
- Člen | 1196
@KamilValenta: Ano, děláme to dlouho. Ale máš pravdu, že ve vanilla bez konzole je to jen pro čtení. Bez konzole bude fungovat tohle: ne-lexa/php-zip
- filbar
- Člen | 13
Myslím si,
že uživatel by sám měl mít možnost toto rozhodnout jestli e-mail považuje
za bezpečnou metodu pro předávání takových informací.
Přijde mi to stejně hloupé jako, že Google Pay odmítá fungovat bez zámku telefonu, když v telefonu mám mnohem citlivější informace jako Firefox včetně napojení na jeho úložiště hesel, kde mám hesla k projektům pro klienty, nebo e-mail, kde také mám hesla ke klientským projektům(DB, FTP přístupu).
- Petr Parolek
- Člen | 455
Vyřešeno:
<?php declare(strict_types = 1);
namespace App\Services;
use Nette\Http\Request;
use Nette\Mail\Mailer;
use Nette\Mail\Message;
use Throwable;
use Tracy\Helpers;
/**
* @property string $email
*/
final class Logger extends \Tracy\Logger
{
private Mailer $customMailer;
private Request $request;
public function __construct(string $logDir, string $email, Mailer $customMailer, Request $request)
{
$this->customMailer = $customMailer;
$this->request = $request;
$this->email = $email;
parent::__construct($logDir, $email);
}
public function logException(Throwable $exception, ?string $file = null): string
{
$exceptionFile = parent::logException($exception, $file);
$snooze = is_numeric($this->emailSnooze)
? $this->emailSnooze
: strtotime($this->emailSnooze) - time();
if (
(int) @filemtime($this->directory . '/email-sent') + $snooze < time() // @ file may not exist
&& @file_put_contents($this->directory . '/email-sent', 'sent') !== false // @ file may not be writable
) {
$body = parent::formatMessage($exception) . "\n\nsource: " . Helpers::getSource();
$mail = new Message();
$mail->addTo($this->email)
->setSubject('PHP: An error occurred on the server ' . $this->request->getUrl()->getHost())
->setBody($body)
->addAttachment($exceptionFile);
$this->customMailer->send($mail);
}
return $exceptionFile;
}
}
a registrace v DI:
services:
tracy.logger: App\Services\Logger(%tempDir%/../log, %emailFrom%)
P.S. Jen škoda, že není některý kod v Tracy v metodě logException okolo snooze a musel jsem část vykopírovávat.
- Petr Parolek
- Člen | 455
Akorát nevím, proč se mi nezobrazuje verze PHP a Tracy dole:
Report generated at 2022/07/22 15:07:11
PHP 8.0.21
Apache/2.4.54 (Debian)
Tracy 2.9.3
Bug?
Vyřešeno úpravou konstruktoru v mém loggeru:
public function __construct(string $logDir, string $email, Mailer $customMailer, Request $request)
{
$this->customMailer = $customMailer;
$this->request = $request;
$this->email = $email;
$bluescreen = new \Tracy\BlueScreen();
$bluescreen->info = [
'PHP ' . PHP_VERSION,
$_SERVER['SERVER_SOFTWARE'] ?? null,
'Tracy ' . Debugger::VERSION,
];
parent::__construct(
$logDir,
$email,
$bluescreen
);
}
Editoval Petr Parolek (22. 7. 2022 15:12)
- Petr Parolek
- Člen | 455
@DavidGrudl Máme v konfiguraci keysToHide
od verze
2.8.7 a scrubber
od verze 2.8.0, takže úniky citlivých údajů
lze bez problémů ošetřit.
- Marek Bartoš
- Nette Blogger | 1280
S podporou #[\SensitiveParameter]
by mohlo být posílání
bluescreenů přes email bezpečnější, avšak pořád existuje riziko
zapomenutí některého klíče.
https://wiki.php.net/…_back_traces