1

私はIRCボットを作成していますhttps://github.com/mouuff/MouBotメッセージが!mathで始まるとき にボットに返信してもらいたいのeval()ですが、ユーザーが!math exit()などのようなものを入力すると失敗しますそれ

4

5 に答える 5

4

しないでください。

数学パーサーを作成しようとしているようです。次に、本格的な I-will-run-any-code-parser ではなく、数学パーサーを使用します。*nix を使用している場合は、好きなようbcにプログラムを使用できます。

于 2012-11-03T17:56:27.613 に答える
1

言語サービスを使用して AST にコンパイルし、AST を調べてホワイトリストに登録されたノード セットのみが含まれていることを確認してから実行します。

unutbu 提供の実装例

于 2012-11-03T17:56:50.077 に答える
0

問題eval()は、実行時に有効な python コードであり、exit()通常はプログラムを終了する python コードの有効な部分であるということです (ただし、この特定の関数は IDLE で使用する必要がありsys.exit()、非アイドルでの使用が優先されます)。 )。

このため、eval()信頼できる入力でのみ使用するか、eval()関数に渡されるコマンドのパーサーを実装して、望ましくない入力を排除する必要があります (独自の関数を実装したい場合shlexは、関数のモジュールを参照してください。split()私は多くのパーサーにそれを使用しました)。

于 2012-11-03T17:57:52.643 に答える
0

それがあなたに役立つかどうかはわかりませんが、これを見てください - > http://doc.pypy.org/en/latest/sandbox.html

またはこれ -> Pythonサンドボックス用のrexecに代わるものはありますか?

于 2012-11-03T19:03:01.087 に答える
0

単純な数学評価が必要な場合は、Python の全機能を背後に持ち込む必要がありますが、これは悪用される可能性があり、悪用されるでしょう。

PyParsingのようなものを使用して単純な電卓を作成します。たとえば、SimpleCalc.pyまたはfournfn.pyを参照してください。これらで十分に開始できると思います。SimpleParseを試すこともできます

また、eval のような強力で悪用可能な機能を提供したい場合は、VM を起動して、eval クエリに応答するサーバー プロセスを起動し、VM がダウンしたときにcgroupsを使用して各プロセスを制限する必要があります。 VM と評価プロセスのプール。

于 2012-11-03T18:32:57.933 に答える