siglite / qdmail

Quick and Detailed mail sending library for PHP
MIT License
0 stars 0 forks source link

ASCII check is wrong in QdSimpleMail->mime_string() #4

Open siglite opened 5 years ago

siglite commented 5 years ago

与えられた文字列 $subject が ASCII の範囲内であれば MIME エンコーディングをスキップする(ことを意図していると思われる)コードが存在する。

if( empty($subject) || ( 0 === preg_match( '/[^\w\s0-9\.]/' , $subject ) ) ){
    return trim(chunk_split($subject, 75, "\r\n "));
}

しかし、[^\w\s0-9\.] は ASCII の範囲を正確に表していない。,; などの記号類が抜け落ちている。おそらく [^\x20-\x7E] が適切と思われる。

siglite commented 5 years ago

エスケープシーケンス \s が HT/LF/FF/CR/Space を許容している。 : が含まれていないため、メールヘッダーインジェクションは行えないが、意図せずメールヘッダーを破壊するかもしれない。

siglite commented 5 years ago

=?ISO-2022-JP?B?(snip)?= のような文字列は MUA がデコードしてしまう ので(ASCIIの範囲だったとしても)そのまま送信できない。 $subject/=\?[\w_-]+\?[BQbq]\?[\w=+/]*\?=/ を含む場合は MIME ヘッダーエンコーディングを行って元の文字列を保護する必要がある。

現在は =? が含まれる場合は容赦なく MIME ヘッダーエンコーディングしているため、結果的に問題が回避されている。