Lolipop サーバで LINE の Webhook を受け取るとメッセージが消失する可能性がある

というより実際に消失した。

追記
こちらのページ(https://teratail.com/questions/306616)ように誤解を生む表現がありましたので、タイトルと内容の一部を修正しました。すべてのメッセージが消える訳ではありませんので、ご注意ください。

タイトル
修正前 Lolipop サーバで LINE の Webhook を受け取るとメッセージが消失する
修正後 Lolipop サーバで LINE の Webhook を受け取るとメッセージが消失する可能性がある

どういうことか?

結論から言うと、Lolipop サーバには、WAF(ウェブアプリケーションファイアウォール)という機能があり、これがデフォルトでオンとなっている。この機能は XSS や SQL インジェクションなどの対策のために、それらと思われる(変な)リクエストを全て遮断してしまう。

どういうことか?

実際に消えるメッセージの例

<script>Alert("Hello!!");</script>
{"eval":"abc"}

等々…
("<script>"といったHTMLタグや、"eval"といった特定の関数名など)

対策

セキュリティホールを完全に潰して WAF をオフにするのが、一番合理的で理想的ではあるが、現実的ではないので以下の二択になるかと思われる。

(1) そもそもそんな変な文字列を含むメッセージを送ってくる方が悪いとして、攻撃と思われるメッセージの消失を許容し、WAFをオンのままにする。
[メリット]
・万一セキュリティホールがあった場合に、防ぐことができる。
[デメリット]
・一部パラメータ名に制限がかかる。(あとがきを参照)
・メッセージが消失することがある。
・メッセージが消失しても、検知する手立てがない。

(2) WAF をオフにし、すべてのメッセージを取得する。
[メリット]
・すべてのメッセージを取得できる。
[デメリット]
・意図しないセキュリティホールを WAF で防ぐことができない。

ちなみにだが、複数の(Webhookを利用していそうな)公式アカウント宛に上記のようなメッセージを送ってみたが、どのアカウントもエンドポイントに届いているようで、返信が届いた。

あとがき

実は今回、この問題に直面した際、PostbackEvent の Data 部に上記の例に似た JSON 形式のテキストを利用していたために原因の特定に時間がかかった。eva や evalu では無事に受信できたのが解決の大きなヒントだった。

そもそも、サーバの処理は Lolipop の PHP で行っており、あまり JSON の名前に関しては気にしていなかったのだが、Javascriptにも eval() という関数が存在する以上、JSON の名前に関数名を利用するのは相応しくなかったりするのだろうか。そもそも利用してはならない規則はあったりするのだろうか…?ちょっと調べておきたいと思った。 (追記はしないので、気になる方はぜひご自分で調べて頂きたい。)

最後に
WAF に頼るのも良いが、頼りすぎないように気を付けたい。WAF はあくまでオプションで、万一のときの最後の砦という認識でいると良いかと思われる。

コメントを残す