최근 직장에서 이메일 본문에 악성 코드로 보이는 내용이 포함된 이메일을 받기 시작했습니다. 다음과 같이 정규 표현식을 사용하여 긴 문자열에 나열된 비단어 문자만 일치시키는 procmail 레시피를 만들려고 합니다.
/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afe0:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Jenny:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#preston:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afectarac:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#FORTHCO:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#backgrounds:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#legumes
공백이 없다는 점에 유의하세요. 이것은 작은 예입니다. 일부 이메일의 줄 길이는 20,000자를 넘습니다. 이로 인해 스팸 필터링이 엉망이 되고 있으며 공백 구분 기호 없이 단어가 아닌 문자의 긴 줄을 일치시킬 수 있는 방법이 있기를 바랍니다. 지금까지 아래의 여러 변형/조각/조합을 시도했지만 부분적인 성공만 거두었습니다. 많은 거짓 긍정을 포착하지 않고 이를 수행할 수 있는 방법을 찾는 데 어려움을 겪고 있습니다.
:0
* B ?? ^.*(!@#$%^&*()[]{})+ && ! </([a-z|A-Z])/>
$DEFAULT/MalSpam/
나는 일치하는 정규식을 만든 다음 줄당 총 문자 수가 특정 수(예: 500)를 초과하는 경우 별도의 이메일로 보내기 위해 다른 규칙과 결합할 수 있다고 생각했습니다. 아직 이 부분을 파악하지 못했습니다... 과거에 제가 사용한 다른 정규식에는 단어가 아닌 문자에만 일치하는 \W 플래그가 있었습니다. procmail에 해당하는 것이 있습니까? 어떻게 해야 하나요?
답변1
마지막 질문에 관해서 \W
는 필요하지 않습니다. 반대 작업을 수행할 수 있습니다 \w
. 예를 들어, 이것이 단어 문자 [a-zA-Z0-9_]
(예: Vim의 정의 \w
)라고 생각되면 를 사용하세요 [^a-zA-Z0-9_]
.
답변2
귀하가 시도한 표면적인 수정은 다음과 같습니다.
:0
* B ?? [][!@#$%^&*(){}]+
* ! B ?? </[a-zA-Z]+/>
$DEFAULT/MalSpam/
</
내가 올바르게 추측했다면, 당신은 두 개 이상의 구두점 문자 시퀀스를 일치시키려고 하고, 부정적인 조건으로 및 사이의 알파벳 문자 시퀀스를 일치시키려고 합니다 />
(일치하는 항목이 있으면 레시피가 일치하지 못하게 됨을 의미함).
하지만,두 개의 구두점 문자(예: !!
)는 첫 번째 정규식과 일치합니다. 왜 두 번째 조건을 그렇게 입력했는지 이해할 수 없습니다.
한 가지 과제는 많은 문장 부호 문자가 정규식 메타 문자라는 것입니다. 리터럴 [
또는 을 (
일치 시키려면 *
백슬래시로 이스케이프 처리하거나 문자 클래스에 넣어야 합니다. ( 포함 [
된 문자 클래스는 이해하는 데 시간이 걸립니다. 문자 클래스 대괄호 안의 리터럴 [[]
입니다 . .... 그리고 이를 포함하고 포함해야 하는 문자 클래스는 순서대로 포함됩니다 .) 첫 번째 정규 표현식을 단순하게 만들었습니다. 배치하여[
[
]
]
[
[][]
모든 것문자 클래스에서는 실제로는 너무 광범위할 수 있습니다. 예를 들어 4~5개의 순서를 순차적으로 요청할 수 있습니다. (불행히도 Procmail의 정규식 변형은 egrep
숫자 [class]{5,}
수량자를 지원하지 않습니다. 여기서는 유용할 것입니다.)
:0B
* [][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}]
* ! </[a-zA-Z]+/>
$DEFAULT/MalSpam/
자세히 보면 첫 번째가 [][!@#$%^&*(){}]
5번 반복되는 것을 볼 수 있습니다. 더 길게 만들고 싶다면(예: 500개의 인접한 항목) 필요한 만큼 반복하면 됩니다. 전체 표현식이 다음보다 긴 경우에도 이 점에 유의해야 합니다 LINEBUF
. 7자 정규식을 500번 사용할 수 있는 공간을 확보하려면 10,200바이트이므로 LINEBUF
최소한 큰 크기인지 확인해야 합니다. 이 긴 표현이 포함된 레시피 Before입니다.
B
또한 레시피의 플래그를 사용하면 B ??
각 개별 레시피 라인에 플래그를 배치할 필요가 없어집니다.
메시지 길이를 비교하려면 >
원하는 숫자와 를 사용하세요. :0B
플래그가 있으면 * > 512
일치합니다.몸길이가 512바이트를 초과합니다.
마지막 질문의 경우 기본적으로 문자 클래스 ( 범위 나 범위 또는 범위 에 없는 단일 문자 ) \W
와 동일합니다 .[^A-Za-z0-9_]
A-Z
a-z
0-9
_