Về mặt kỹ thuật, bạn có thể trực tiếp lọc dữ liệu được mã hóa base64 cho các từ khóa. Tôi không nói rằng đó là một thực tế hoặc là một điều hợp lý để làm, vì sự tồn tại của giải pháp thay thế tốt hơn và đơn giản hơn (như ví dụ được mô tả trong câu trả lời của Esa trên), nhưng nó là có thể.
Bí quyết là nhận ra rằng mã hóa base64 là ánh xạ xác định của các khối 3 byte dữ liệu chưa được mã hóa thành các khối 4 ký tự của các ký tự cơ sở64. Do đó, bất cứ khi nào một chuỗi các khối 3 byte nhất định xuất hiện trong dữ liệu chưa được mã hóa, cùng một chuỗi các khối 4 ký tự sẽ xuất hiện trong phiên bản được mã hóa.
Ví dụ: nếu bạn nhập chuỗi Quanzhoucooway
vào bộ mã hóa base64 , bạn sẽ nhận được đầu ra UXVhbnpob3Vjb293YXk=
. Vì độ dài của đầu vào không phải là bội của 3 byte, đầu ra chứa một số phần đệm ở cuối, nhưng nếu chúng ta bỏ các =
dấu cuối cùng và ký tự base64 thực tế cuối cùng k
(vì nó cũng mã hóa một số bit đệm), chúng ta sẽ nhận được chuỗi UXVhbnpob3Vjb293YX
đó là bảo đảm để xuất hiện trong các dữ liệu base64 mã hóa bất cứ khi nào ba byte Qua
, nzh
, ouc
, oow
và bộ ba phần ay
xuất hiện trong đầu vào theo thứ tự đó.
Nhưng, tất nhiên, chuỗi Quanzhoucooway
có thể không bắt đầu chính xác trên ranh giới bộ ba. Ví dụ, nếu chúng ta mã hóa chuỗi XQuanzhoucooway
thay vào đó, chúng ta sẽ nhận được đầu ra WFF1YW56aG91Y29vd2F5
, trông hoàn toàn khác nhau. Lần này, độ dài đầu vào chia hết cho ba, vì vậy không có ký tự đệm nào để loại bỏ ở cuối, nhưng chúng ta cần loại bỏ hai ký tự đầu tiên ( WF
) mà mỗi ký tự mã hóa một số bit từ X
byte được thêm vào trước , để lại cho chúng ta F1YW56aG91Y29vd2F5
.
Cuối cùng, mã hóa base64 XXQuanzhoucooway
cho đầu ra WFhRdWFuemhvdWNvb3dheQ==
, có phần đệm ở cả hai đầu. Xóa ba ký tự đầu tiên WFh
(mã hóa XX
tiền tố) và ba ký tự cuối cùng Q==
(mã hóa phần đệm bit 0 ở cuối), chúng ta còn lại chuỗi RdWFuemhvdWNvb3dhe
. Do đó, chúng tôi có được ba chuỗi được mã hóa base64 sau đây:
UXVhbnpob3Vjb293YX
F1YW56aG91Y29vd2F5
RdWFuemhvdWNvb3dhe
trong đó (ít nhất) một cái phải xuất hiện ở dạng mã hóa base64 của bất kỳ chuỗi đầu vào nào có chứa từ đó Quanzhoucooway
.
Tất nhiên, nếu bạn không may mắn, bộ mã hóa base64 có thể chèn một ngắt dòng ở giữa chúng, giữa bất kỳ hai bộ ba được mã hóa. (Ví dụ, thông báo ví dụ của bạn có một giữa F1YW56
và aG91Y29vd2F5
.) Vì vậy, để kết hợp các chuỗi này với regexps một cách đáng tin cậy, bạn cần một cái gì đó như sau (sử dụng cú pháp PCRE):
/UXVh\s*bnpo\s*b3Vj\s*b293\s*YX/ DISCARD
/F1\s*YW56\s*aG91\s*Y29v\s*d2F5/ DISCARD
/R\s*dWFu\s*emhv\s*dWNv\s*b3dh\s*e/ DISCARD
Tạo các mẫu này bằng tay là khá tẻ nhạt, nhưng sẽ không khó để viết một tập lệnh đơn giản để thực hiện nó bằng ngôn ngữ lập trình yêu thích của bạn, ít nhất là nó cung cấp bộ mã hóa base64.
Nếu bạn thực sự muốn, bạn thậm chí có thể thực hiện kết hợp không phân biệt chữ hoa chữ thường bằng cách mã hóa base64 cả phiên bản chữ thường và chữ hoa của từ khóa và kết hợp chúng thành một biểu thức chính quy phù hợp với bất kỳ kết hợp nào của chúng. Ví dụ, mã hóa base64 quanzhoucooway
là cXVhbnpob3Vjb293YXk=
trong khi đó QUANZHOUCOOWAY
là UVVBTlpIT1VDT09XQVk=
quy tắc:
/[cU][XV]V[hB]\s*[bT][nl]p[oI]\s*[bT][31]V[jD]\s*[bT][20]9[3X]\s*[YQ][XV]/ DISCARD
sẽ khớp với từ được mã hóa base64 "Quanzhoucooway" trong mọi trường hợp, với điều kiện là nó bắt đầu trên một ranh giới bộ ba. Việc tạo hai biểu thức chính tương ứng khác cho các phiên bản đã thay đổi được để lại như một bài tập. ;)
Than ôi, làm bất cứ điều gì phức tạp hơn so với kết hợp chuỗi con đơn giản như thế này nhanh chóng trở nên không thực tế. Nhưng ít nhất đó là một mánh khóe gọn gàng. Về nguyên tắc, nó thậm chí có thể hữu ích, nếu bạn vì một số lý do không thể sử dụng SpamAssassin hoặc bất kỳ bộ lọc nào khác có thể giải mã mã hóa base64 trước khi lọc. Nhưng nếu bạn có thể làm điều đó, thay vì sử dụng các bản hack như thế này, bạn chắc chắn nên làm.