Q:

eval関数をwebフォームなどで使うとなぜ危険なのか？

evalをwebのフォームなどで使うとよくないと聞いたのですがなぜでしょうか？
よくない理由を書いている人が掲示板にいました。

If you apply eval() to a string that's given by a user (e.g. in a web form), you might get unintended behaviour which might get you hacked directly or give malicious users insight to your back-end through error messages.
日本語訳（google翻訳）
ユーザー（Webフォームなど）によって指定された文字列にeval（）を適用すると、意図しない動作が発生し、直接ハッキングされるか、エラーメッセージを通じて悪意のあるユーザーにバックエンドの洞察を与える可能性があります。

なぜハッキングされたり、悪意あるユーザーの洞察をエラーメッセージを通して与えられるのでしょうか？

A:

(Python に限らず) eval では任意のシステムコマンドを実行できてしまうので、Webフォームなどと組み合わせて使ってしまうと、例えば単に「年齢(数字)を入力してください」としていたところに、悪意のあるユーザーは「パスワードファイルの表示」や「ファイルの削除」を試みるコマンド文字列を入力してくるケースが想定されます。
参考:
eval #セキュリティ上のリスク (Wikipedia)

これを防ぐためには、evalされる文字列はすべてエスケープしたり、潜在的に危険な機能を利用できないようにして実行するなどの対策が必要となる。

A:

eval 関数で 任意のコマンドが実行できるからです。
>>> eval("print('hello')", {})
hello

>>> eval("__import__('os').system('uname -a')", {})
Linux C077 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
0

