Saya tahu tentang URI Data di mana base64
data yang dikodekan dapat digunakan sebaris seperti gambar. Hari ini saya menerima email yang sebenarnya adalah email spam yang di dalamnya terdapat ikon animasi (gif) di subjeknya:
Ini ikonnya saja:
Jadi satu-satunya hal yang terlintas dalam pikiran saya adalah tentang Data URI dan jika Gmail mengizinkan semacam emotikon untuk dimasukkan ke dalam subjek. Saya melihat versi lengkap email dan menunjuk ke baris subjek pada gambar di bawah ini:
Jadi GIF berasal dari =?UTF-8?B?876Urg==?=
string yang disandikan yang mirip dengan skema URI Data namun saya tidak bisa mengeluarkan ikonnya. Berikut adalah sumber elemen HTML:
Singkat cerita, ada banyak emoticon dari https://mail.google.com/mail/e/XXX
mana XXX
ada bilangan heksadesimal. Mereka tidak didokumentasikan di mana pun atau saya tidak dapat menemukannya. Jika itu tentang URI Data, jadi bagaimana mungkin menyertakannya dalam subjek email Gmail? (Saya meneruskan email itu ke akun email yahoo, melihat [?]
alih-alih ikon) dan jika tidak, lalu bagaimana string yang dikodekan itu diurai?
Jawaban:
Deskripsi Singkat:
Mereka dirujuk secara internal sebagai
goomoji
, dan tampaknya merupakan ekstensi UTF-8 non-standar. Saat Gmail menemukan salah satu karakter ini, itu diganti dengan ikon yang sesuai. Saya tidak dapat menemukan dokumentasi apa pun tentangnya, tetapi saya dapat merekayasa balik formatnya.Apakah ikon-ikon ini?
Ikon tersebut sebenarnya adalah ikon yang muncul di bawah panel "Sisipkan emotikon".
Meskipun saya tidak melihat
52E
ikon di daftar, ada beberapa lainnya yang mengikuti konvensi yang sama.B0C
4F4
Perhatikan bahwa ada juga beberapa ikon yang namanya diawali, seperti . Saya tidak dapat menentukan apakah atau bagaimana ikon ini dapat digunakan dengan cara ini.
gtalk.03C
Apa URI Data ini?
Ini sebenarnya bukan URI Data , meskipun memiliki beberapa kesamaan. Ini sebenarnya adalah sintaks khusus untuk mengenkode karakter non-ASCII dalam subjek email, ditentukan dalam RFC 2047 . Pada dasarnya, cara kerjanya seperti ini.
Jadi, dalam string contoh kami, kami memiliki data berikut.
charset
=UTF-8
encoding
=B
(berarti base64)data
=876Urg==
Lantas, bagaimana cara kerjanya?
Kita tahu bahwa entah bagaimana
876Urg==
berarti ikon52E
, tapi bagaimana caranya?Jika kita decode base64
876Urg==
, kita dapatkan0xf3be94ae
. Ini terlihat seperti berikut dalam biner:Bit ini konsisten dengan karakter yang dikodekan UTF-8 4-byte.
Jadi bit yang relevan adalah sebagai berikut:
Atau saat disejajarkan:
Dalam heksadesimal, byte ini adalah sebagai berikut:
Seperti yang Anda lihat, kecuali untuk
FE
awalan yang mungkin untuk membedakangoomoji
ikon dari karakter UTF-8 lainnya, itu cocok dengan52E
di URL ikon. Beberapa pengujian membuktikan bahwa hal ini berlaku untuk ikon lainnya.Kedengarannya banyak pekerjaan, apakah ada konverter ?:
Ini tentu saja bisa dibuat skrip. Saya membuat kode Python berikut untuk pengujian saya. Fungsi ini dapat mengonversi string yang disandikan base64 ke dan dari string heksa pendek yang ditemukan di URL. Perhatikan, kode ini ditulis untuk Python 3, dan tidak kompatibel dengan Python 2.
Fungsi konversi:
Contoh:
Keluaran:
Dan, tentu saja, menemukan URL ikon hanya perlu membuat draf baru di Gmail, memasukkan ikon yang Anda inginkan, dan menggunakan pemeriksa DOM browser Anda.
sumber
B
dalam sintaks khusus menyiratkan Base64 mungkin merupakan tebakan (string di akhir terlihat seperti string yang dikodekan Base64, jika Anda pernah melihatnya sebelumnya); setelah itu tidak sulit untuk melihat bahwa empat byte mengikuti salah satu pola UTF-8 untuk karakter Unicode, terutama karena dia mencari Unicode. Ini pekerjaan detektif yang cukup keren, semua sama :)B
- ini ditentukan di # 4Jika Anda menggunakan titik kode hex yang benar (mis. Fe4f4 untuk 'tumpukan kotoran' ) dan Jika dikodekan dengan benar di dalam tajuk baris subjek, biarkan itu menjadi base64 (lihat @AlexanderOMara) atau dikutip-printable (
=?utf-8?Q?=F3=BE=93=B4?=
), maka Gmail akan secara otomatis parse dan ganti dengan emoji yang sesuai.Berikut daftar emoji Gmail untuk disalin dan ditempel ke baris subjek - atau badan email. Emoji animasi, yang akan menarik lebih banyak perhatian di kotak masuk, ditempatkan pada latar belakang kuning:
sumber
Terima kasih banyak kepada Alexander O'Mara atas jawaban yang telah diteliti dengan baik tentang gambar HTML yang diberi tag goomoji!
Saya hanya ingin menambahkan tiga hal:
Masih banyak emoji (dan urutan Unicode lain yang menghasilkan gambar) yang para spammer dan pemasar lainnya mulai gunakan di baris subjek email dan gmail tidak dikonversi ke gambar HTML. Di beberapa browser, gambar ini tampil tebal dan berwarna, yang hampir sama buruknya dengan animasi. Browser juga dapat memilih untuk menganimasikan ini, tetapi saya tidak tahu apakah ada yang melakukannya. Urutan Unicode ini ditampilkan oleh browser sebagai teks Unicode, jadi tampilan persisnya (warna atau tidak, animasi atau tidak, ...) bergantung pada sistem rendering teks yang digunakan browser. Munculnya emoji Unicode tertentu juga bergantung pada pemilih variasi Unicode dan pengubah emojiyang muncul di dekatnya dalam urutan titik kode Unicode. Tidak seperti spam emoji berbasis gambar, urutan ini dapat disalin dan ditempel dari browser dan ke aplikasi lain sebagai teks Unicode.
Saya berharap banyak pemasar yang membaca pertanyaan StackOverflow ini akan menjawab tidak. Merupakan ide yang buruk untuk memasukkan urutan ini ke dalam baris subjek email Anda dan itu akan segera menodai Anda dan merek Anda sebagai spammer kelas bawah. Tidak sepadan dengan "perhatian" yang didapat email Anda.
Tentu saja pertanyaan pertama yang muncul di benak setiap orang adalah: "bagaimana cara menyingkirkan hal-hal ini?" Untungnya ada Greasemonkey / Tampermonkey / Violentmonkey userscript open-source ini:
Motel Baris Subjek Gmail Emoji Roach
Skrip pengguna ini menghilangkan kedua gambar HTML (berkat karya mengagumkan dari Alexander O'Mara ) dan jenis Unicode murni.
Untuk jenis yang terakhir, userscript menyertakan ekspresi reguler yang dirancang untuk menangkap urutan Unicode yang kemungkinan besar akan disalahgunakan oleh pemasar. Regex terlihat seperti ini di ES6 Javascript (skrip pengguna menerjemahkan ini ke regex pra-ES6 yang didukung secara luas menggunakan ES6 Regex Transpiler yang luar biasa ):
sumber