私はIRCボットを作成していますhttps://github.com/mouuff/MouBotメッセージが!mathで始まるとき
にボットに返信してもらいたいのeval()
ですが、ユーザーが!math exit()などのようなものを入力すると失敗しますそれ
5 に答える
しないでください。
数学パーサーを作成しようとしているようです。次に、本格的な I-will-run-any-code-parser ではなく、数学パーサーを使用します。*nix を使用している場合は、好きなようbc
にプログラムを使用できます。
言語サービスを使用して AST にコンパイルし、AST を調べてホワイトリストに登録されたノード セットのみが含まれていることを確認してから実行します。
問題eval()
は、実行時に有効な python コードであり、exit()
通常はプログラムを終了する python コードの有効な部分であるということです (ただし、この特定の関数は IDLE で使用する必要がありsys.exit()
、非アイドルでの使用が優先されます)。 )。
このため、eval()
信頼できる入力でのみ使用するか、eval()
関数に渡されるコマンドのパーサーを実装して、望ましくない入力を排除する必要があります (独自の関数を実装したい場合shlex
は、関数のモジュールを参照してください。split()
私は多くのパーサーにそれを使用しました)。
それがあなたに役立つかどうかはわかりませんが、これを見てください - > http://doc.pypy.org/en/latest/sandbox.html
またはこれ -> Pythonサンドボックス用のrexecに代わるものはありますか?
単純な数学評価が必要な場合は、Python の全機能を背後に持ち込む必要がありますが、これは悪用される可能性があり、悪用されるでしょう。
PyParsingのようなものを使用して単純な電卓を作成します。たとえば、SimpleCalc.pyまたはfournfn.pyを参照してください。これらで十分に開始できると思います。SimpleParseを試すこともできます
また、eval のような強力で悪用可能な機能を提供したい場合は、VM を起動して、eval クエリに応答するサーバー プロセスを起動し、VM がダウンしたときにcgroupsを使用して各プロセスを制限する必要があります。 VM と評価プロセスのプール。