Pewnie nie raz zdarzyła się taka sytuacja, że wysyłasz komuś dokument w formacie DOC/DOCX i nie wiesz, czy adresat go otworzył. Po co byśmy chcieli wiedzieć, kiedy ktoś otwiera nasz plik? Takich sytuacji jest kilka:
- Wysyłamy CV i chcemy wiedzieć czy ktokolwiek się z nim zapoznał (a może i tak wiadomo kto dostanie pracę a ogłoszenie o naborze na dane stanowisko wisi w Internecie, „aby nikt się nie czepiał”).
- Wysyłamy ofertę handlową do kontrahenta i chcemy wiedzieć, że została ona obejrzana.
- Podejrzewamy, że ktoś z naszej firmy „wynosi dokumenty”, ale nikogo nie złapaliśmy na gorącym uczynku (inny wariant – ktoś się włamał do naszej sieci wewnętrznej i dziwnym trafem nie wiemy, dlaczego zawsze firma X wygrywa wszystkie przetargi, w których startujemy).
- Wysyłamy jakikolwiek nic nieznaczący dokument w formacie DOCX, bo chcemy poznać jakie IP ma dana osoba (np. ktoś nas okradł na OLX i z innego konta wysyłamy wiadomość, aby poznać IP złodzieja).
- Dodatkowym bonusem jest fakt, że będziemy wiedzieli o której godzinie ktoś otworzył plik (czyli możemy wydedukować czy dana firma pracuje tylko w godzinach od 8 do 16, czy może szef jednoosobowej działalności gospodarczej siedzi przed komputerem prawie do świtu).
Do dzieła!
Jak to działa? Otóż należy w dokumencie Worda osadzić plik graficzny np. PNG o rozmiarze 1×1 piksela, który będzie ściągany z serwera. W momencie otworzenia dokumentu Word pobierze owy plik graficzny z serwera. Pobranie pliku graficznego spowoduje uruchomienie skryptu PHP, który wyśle do nas wiadomość e-mail o odpowiedniej treści.
Kliknij tutaj, aby pobrać paczkę z plikami.
Oto przykładowy plik PHP, który wysyła do przeglądarki dowolny plik PNG, oraz przy okazji wysyła cichy alarm:
<?php
//W tym pliku znajduje się plik graficzny przedstawiający "diabełka"
//jeśli wolisz, aby Twoją grafiką był plik png o rozmiarze 1x1 pixela
//zmień w poniższej linijce lucy.png na empty.png
$filename = "lucy.png";
//odczytaj zawartość pliku PNG
$size=filesize($filename);
$handle = fopen($filename, "rb");
$png = fread($handle, $size);
fclose($handle);
//Wyślij do przeglądarki plik PNG
header ('Content-Type: image/png');
header("Content-length: $size");
echo $png;
//Zbierz informacje o osobie otwierwającej plik
$info = "--- INFO --- \n";
$opis='brak';
if (isset($_GET['opis'])) $opis=$_GET['opis'];
$info .= "Opis: ".$opis . "\n";
$info .= "Data i godzina: " . date("Y-m-d H:i:s") . "\n";
$info .= "User AGENT: " . $_SERVER['HTTP_USER_AGENT'] . "\n";
$info .= "IP: " . $_SERVER['REMOTE_ADDR'] . "\n";
//wyślij maila alarmowego
//tak wiem, mogłem użyć jakąś bibliotekę np. PHPMailer
//ale robiłem skrypt "na szybko"
$mailto = "[email protected]"; //Twój e-mail!!
$subject="Ktoś otworzył Twoje CV!";
//TUTAJ TEŻ WSTAW SWÓJ ADRES E-MAIL
$headers = 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'Content-Type: text/plain; charset=utf-8'. "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($mailto, $subject, $info, $headers);
?>
Wrzucając taki plik na serwer musimy w kilku miejscach pozmieniać dane na nasze (np. nazwa pliku graficznego, który ma być wyświetlony, adres e-mail, na który ma być wysłana wiadomość, nagłówki w wiadomości e-mail). W oryginalnej wersji zamiast „pustego pliku graficznego” skrypt wyświetla ikonkę diabełka, aby łatwiej było Tobie poćwiczyć (np. sprawdzić, czy grafika się ładuje itp.) Jak już uda się Tobie „spreparować” plik DOC to w skrypcie PHP można podmienić ładowanie pliku graficznego z diabełka na pusty zmieniając linijkę:
$filename = "lucy.png";
na
$filename = "empty.png";
Osadzenie zewnętrznego pliku graficznego w Wordzie
Jak już wgrałeś oraz skonfigurowałeś plik PHP, to możemy przejść do następnego etapu. W dowolnym pliku DOC/DOCX należy wstawić ładowanie pliku z naszego serwera. Oto przykładowy adres URL do zewnętrznego pliku graficznego (możesz ćwiczyć na moim adresie, nie bój się – wyłączyłem u siebie wysyłanie powiadomień mailowych).
https://www.officeblog.pl/pliki/cv/cv.php
Tutaj jeszcze jedna mała uwaga: otóż możemy chcieć wysłać nasze spreparowane CV (albo ofertę handlową) do kilku różnych firm i chcielibyśmy wiedzieć, które konkretne firmy otworzyły nasze CV. W tym celu należy „sparametryzować” nazwę naszego pliku dodając na końcu ciąg znaków: ?opis=nazwa_firmy (najlepiej bez spacji) np.
https://www.officeblog.pl/pliki/cv/cv.php?opis=firma_DD
albo
https://www.officeblog.pl/pliki/cv/cv.php?opis=Gienek
W wiadomości e-mail przyjdzie wartość parametru opis:

Pierwszą moją myślą było załadowanie pliku poprzez wybranie polecenia Wstawianie -> Obraz i wklejenie adresu URL w polu tekstowym, w którym się wpisuje nazwę pliku. Wordowi udało się taki plik „pobrać z Internetu”, ale nasza grafika została zapisana wewnątrz pliku DOC/DOCX i osoba otwierająca ten plik zobaczy grafikę załadowaną z wnętrza pliku DOC/DOCX (nie będzie ona pobierana z Internetu!).
Jednak można wstawić specjalne pole o nazwie IncludePicture. W tym celu na karcie Wstawianie wybierz Szybkie części -> Pole

Następnie pojawi się okno dialogowe Pole. W polu Wybierz pole należy zaznaczyć pozycję IncludePicture. Następnie w polu Nazwa pliku lub adres URL wprowadź adres URL do naszego pliku graficznego (np. https://www.officeblog.pl/pliki/cv/cv.php?opis=firma_DD – pamiętaj aby tutaj wpisać swój prawdziwy adres do pliku a nie mój). Pamiętaj, aby pole Dane nieprzechowywane z dokumentem było „zaptaszkowane” inaczej Word zapisze naszą grafikę wewnątrz pliku DOC/DOCX i nici z naszego alarmu!

Następnie zapisz plik na dysku i zamknij Worda. Jeśli wszystko poszło zgodnie z planem to po otworzeniu pliku powinna przyjść odpowiednia wiadomość e-mail.
Zgodnie z moim doświadczeniem owe pole najlepiej jest wstawić w takim miejscu w dokumencie, w którym będzie mała szansa jego znalezienia (nie chcemy, aby osoba otrzymująca nasz plik domyśliła się, co robimy). Takim miejscem może być np. stopka dokumentu
Jak sprawdzić, czy w dokumencie znajduje się owe pole IncludePicture?
Jeśli robisz ćwiczenie zgodnie z tym, co pokazuję, w miejscu, gdzie pojawia się pole IncludePicture zobaczysz mały obrazek z „diabełkiem” (a dokładniej jest to Lucy z serialu Rozczarowani)

Natomiast jeśli robisz ćwiczenie tak jak należy (tj. wrzuciłeś skrypt PHP na swój serwer i w ustawieniach zmieniłeś plik graficzny na empty.png) to bardzo trudno będzie w dokumencie zobaczyć mały plik graficzny o rozmiarach 1×1 piksela w kolorze białym na białej kartce papieru 😉
Jednak jest pewien trik: po naciśnięciu kombinacji klawiszy ALT+F9 nie zobaczysz zawartości owego pola a jego kod:

W ten sposób możesz sprawdzić czy w dokumencie jest wstawione owe pole, w którym miejscu jest wstawione a także możesz je wyedytować (np. usunąć, albo zmienić adres URL do naszego pliku graficznego).
Ponowne naciśnięcie kombinacji klawiszy ALT+F9 spowoduje, że znów zobaczysz zawartość obrazka.
A da się to zrobić w Excelu?
Niestety, ale nie znalazłem w Excelu polecenia Wstawianie->Szybkie części->Pole. Tutaj jednak można to łatwo obejść: otóż możemy owe pole wstawić w pustym dokumencie Worda, skopiować je do schowka i wkleić w jakimś mało widocznym miejscu w arkuszu Excela.

Czy pole IncludePicture działa w starszych wersjach Worda i innych pakietach biurowych?
Zanim zabrałem się za pisanie tego artykułu, trochę się pobawiłem. I oto moje spostrzeżenia:
- Na swoim głównym komputerze posiadam zainstalowany system Windows 8.1 (dość stary jak na owe czasy) i MS Office 2010 oraz równolegle wersje Office 365. W obu wersjach wszystko jest OK.
- Na drugim laptopie (MacOS) posiadam zainstalowany pakiet Office 365 i również wszystko działa.
- Pages na MacOS (taki Applowy odpowiednik Worda) nie rozpoznaje pola IncludePicture (ładuje się biały prostokąt).
- Na iPhone posiadam zainstalowany pakiet MS Office. Jeśli otwieram podgląd załącznika w Outlooku to nic się nie dzieje. Ale jak kliknąłem w przycisk otwórz dokument w MS Office, to mail z powiadomieniem przyszedł
- WPS Office również bezproblemowo ładuje grafikę z serwera (i przychodzi mail)
- LibreOffice (wersja 7.1.0.3) nie widzi owego pola IncludePicture (ani mi się nie wyświetlił diabełek, ani nie dostałem maila)
- Jeśli zapiszesz dokument jako plik PDF (dość częsta praktyka w przypadku wysyłania CV) to owa grafika zostanie zapisana wewnątrz pliku PDF i nie będzie ona pobierana z serwera.
- Na starym laptopie (z prehistorycznym Windowsem XP) posiadam zainstalowany MS Office 2007. I tutaj pojawił się problem: nie załadowała mi się grafika. Wszystkiemu jest winny protokół https!! Gdy wrzuciłem owy plik PHP na inną domenę, dla której nie generowałem certyfikatu SSL (czyli adres strony zaczynał się od http:// a nie od https://) wszystko działało, jak należy.

Co może pójść nie tak?
Zastanówmy się, czy każda osoba, która otworzy nasz dokument automatycznie załaduje naszą grafikę z serwera. Więc jeśli nasza ofiara ma zainstalowany pakiet MS Office w jakiejś nowszej wersji (minimum 2010 gdy korzystamy z protokołu HTTPS lub starszą w przypadku protokołu HTTP) to istnieje duże prawdopodobieństwo, że grafika zostanie załadowana. W przypadku różnych odpowiedników pakietu MS Office widzimy, że bywa różnie. Jednak nawet mając najnowszego Worda istnieje kilka sytuacji, gdy obrazek nie zostanie załadowany:
- Użytkownik komputera otworzy dokument np. na wirtualnej maszynie, na której jest zablokowany ruch sieciowy.
- Użytkownik ma zainstalowany firewall, który blokuje łączność z Internetem dla programów, które nie są na białej liście
- Word od wersji 2010 domyślnie pliki pobrane z Internetu (w tym zapisane na dysku załączniki z programu pocztowego) domyślnie otwiera w widoku chronionym. Dopóki użytkownik nie kliknie w przycisk Włącz edytowanie nasz obrazek nie zostanie załadowany. Praca w widoku chronionym nie jest zbyt wygodna, gdyż nie można nic zrobić poza np. zaznaczeniem tekstu i skopiowaniem go do schowka. Jeśli użytkownik będzie chciał wydrukować nasze CV, to będzie musiał kliknąć w przycisk Włącz edytowanie a wtedy nasza grafika zostanie załadowana z serwera.

PHP, wrzucanie plików na jakiś serwer to dla mnie czarna magia – co robić, jak żyć?
Troszkę się rozpisałem opisując owe zagadnienie. Zaproponowałem napisanie własnego skryptu na serwerze, który wyświetla obrazek oraz w momencie generowania obrazka wysyła do nas wiadomość e-mail. Jednak tutaj pojawia się pewien problem: możesz nie mieć wykupionego serwera, na który należy wrzucić owy skrypt PHP. Oprócz tego możesz być osobą nie-techniczną, dla której wrzucenie takiego skryptu na serwer, oraz odpowiednie jego skonfigurowanie może być ponad Twoje siły. Jednak istnieje darmowa usługa, gdzie możesz samodzielnie wygenerować taki dokument Worda z ukrytym obrazkiem o rozmiarze 1×1 piksel w stopce dokumentu.
Wystarczy wejść na stronę canarytokens.com. Następnie z listy rozwijanej Select your token należy wybrać Microsoft Word Dokument. W pierwszym polu tekstowym wpisz swój adres e-mail. W drugim polu tekstowym napisz treść alarmu (np. nazwa firmy, do której chcesz wysłać CV). Następnie kliknij w przycisk Create my Cannary token. I pobierz plik wygenerowany przez tę usługę.

Do wygenerowanego pliku wklej zawartość swojego CV (w stopce dokumentu znajduje się owe pole IncludePicture które zobaczysz po naciśnięciu kombinacji klawiszy ALT+F9).

Nie zapomnij tylko nacisnąć jeszcze raz kombinację klawiszy ALT+F9, aby osoba otrzymująca spreparowane CV nie widziała, że coś siedzi w stopce.
Za każdym razem, gdy ktoś otworzy Twoje CV na skrzynkę mailową przyjdzie odpowiednia wiadomość e-mail

Czy programy antywirusowe nie blokują e-maili z takimi załącznikami?
Z ciekawości wrzuciłem taki plik (zarówno mój stworzony ręcznie, jak i plik wygenerowany przez serwis canarytokens.com) na stronę virustotal.com (jest to darmowa usługa, gdzie można wrzucić podejrzany plik i kilkadziesiąt silników antywirusowych go skanuje). Ani jeden z 62 silników antywirusowych nie oznaczył żadnego z plików jako niebezpiecznego.

Natomiast tutaj jest pewna ciekawostka: otóż serwis VirusTotal pliki wrzucane przez internautów przekazuje twórcom programów antywirusowych do analizy. Już po około dwóch godzinach zaczęły przychodzić pierwsze maile, że mój plik został otworzony (dla pewności później na innym pliku powtórzyłem eksperyment). Adresy IP były różne: bot googla, Chiny, Rumunia, Hong Kong, USA.
Podsumowanie
Jak widzimy istnieje możliwość dowiedzenia się, że ktoś otworzył nasze CV. Sztuczkę z polem IncludePicture możemy również wykorzystać jako system późnego ostrzegania, że ktoś włamał się na serwer i ukradł dokumenty (co prawda do włamania już doszło i osoba nieupoważniona ma dostęp do dokumentów, ale przynajmniej mamy wiedzę o tym, że doszło do incydentu). W tym celu można zastawić na włamywacza pułapkę: otóż w folderze z różnymi dokumentami można dla podpuchy utworzyć dokument o nazwie zachęcającej do jego otworzenia np. ListaPłac.docx albo BazaKontrahentów.docx.
Do napisania tego artykułu pośrednio mnie zainspirował wpis „o Kanarkach” na blogu Informatyk Zakładowy.