🤫

LINE BotでPythonプログラムを実行できるようにしてみた(セキュリティ注意)

2020/11/27に公開

【注意】この記事で述べている方法は,LINE Bot経由でPythonプログラムをある程度自由に実行できてしまうため,セキュリティ上の問題が発生する可能性があります.広く公開するLINE Botとして設定・運用することは避けるべきでしょう.

拙作記事『各言語による無名再帰処理の実行例まとめ』のおまけとして,LINE Bot経由で無名再帰処理によるフィボナッチ数を計算する方法を示しました.

この方法とほぼ同じ理屈で,次の画像のように,LINE Bot経由でPythonプログラムをサーバサイドでeval実行する方法を試したところ,Twitterで少し話題になったため,この記事では,その方法の概要を述べています.
LINE Bot for Python eval

方法の概要

  • Herokuで諸設定を行い,PythonプログラムをWeb APIで実行できるようにする.
  • LINE Developpersで諸設定を行い,Messaging API対応のLINE Botアカウントを作成する.
  • 次のPythonプログラムを応答Botとして設定する.
app.py
# -*- coding: utf-8 -*-
import os
from flask import Flask, request
from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import math

HELP = '入力文字列に対してPythonのevalが実行されます.モジュールはmathのみ読み込んでいます.'

A = Flask(__name__)
B = LineBotApi(os.environ["ACCESS_TOKEN"])
H = WebhookHandler(os.environ["CHANNEL_SECRET"])

@A.route("/", methods=['POST'])
def callback():
    s = request.headers['X-Line-Signature']
    b = request.get_data(as_text=True)
    H.handle(b, s)
    return('OK')

@H.add(MessageEvent, message=TextMessage)
def handle_message(e):
    u = e.message.text
    if (u.lower() == 'help'):
        r = HELP
    else:
        r = eval("str(" + u + ")", {"math":math})
    B.reply_message(e.reply_token, TextSendMessage(text=r))

if __name__ == "__main__":
    p = int(os.getenv("PORT"))
    A.run(host="0.0.0.0", port=p)

概要は以上です.冒頭で述べた通り,この方法は セキュリティ上問題となる可能性が高い ことから,この記事ではこれ以上の詳細な方法は述べません.LINE Bot + HerokuをPythonで実装するための方法は,検索サイト経由で詳細ページがすぐ見つかるかと思います.

備考

更新履歴

  • 2020-11-27:初版公開

Discussion