質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

1回答

1963閲覧

execにユーザー入力させたい

Lumen0820

総合スコア8

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2016/06/15 12:49

編集2016/06/15 12:53

###前提・実現したいこと
pythonでインタプリタ的な振る舞いをするウェブソフトを作っています。
ユーザーに入力してもらったテキストをhtmlからサーバーに飛ばして実行してます。
テキストをexecで読ませて外部ファイルに保存、保存したものを開いてprint という流れを作ったのですが、

execがテキストを読んでくれません。
exec (関数名) ではダメなんでしょうか。
どうしたらユーザーの入力したソースを実行できるでしょうか。
超初歩的な質問をしてすみません。どうぞ宜しくお願い申し上げます。

###発生している問題・エラーメッセージ

32 text = original_text 33 sys.stdout = open("strage.txt","w") 34 exec text #ここがcgitbでハイライトされてます 35 sys.stdout.close() 36 sys.stdout = sys.__stdout__ <type 'exceptions.NameError'>: name 'asd' is not defined args = ("name 'asd' is not defined",) message = "name 'asd' is not defined"

###該当のソースコード

Python 2.7.5 #!/usr/bin/env python # -*- coding: UTF-8 -*- import sys import json import cgi from datetime import datetime import cgitb cgitb.enable() html_body = u""" <html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" form = cgi.FieldStorage() form_ok = 0 if form.has_key("source") : form_ok = 1 if form_ok == 0 : print "ERROR" else : original_text = form["source"].value original_text = unicode(original_text,"utf-8") #ここです------------------------------- text = original_text sys.stdout = open("strage.txt","w") exec text sys.stdout.close() sys.stdout = sys.__stdout__ open("strage.txt","r").read() #ここまでです多分------------------------ f = open("strage.txt","r") content = f.read() + "asdhf" #for content in open("strage.txt","r") print "Content-type: text/html;charset=utf-8\n" print print (html_body % content).encode('utf-8')

###試したこと
exec str(text)とか。
execに文字列を読ませるとasdhfだけ出力はされます。
あと、strage.txtのなかにはなにも書き込まれません。

###補足情報(言語/FW/ツール等のバージョンなど)
python 2.7.5
サーバーはありますが管理者じゃないのでよくわかりません。
"source"はhtmlのtextareaの名前です。同じ形で別のプログラムが動くので、テキストの入力システムに問題は無いと思われます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんなものを作るのはすぐにやめてください。
サーバーを乗っ取ってくれと言ってるようなもんです。

投稿2016/06/15 12:58

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lumen0820

2016/06/15 13:03

そういった危険性について全く考えていませんでした。本当にありがとうございます。 ウェブ上で動くインタプリタを作りたいのです。どうすれば安全にちゃんと動かせるでしょうか?
Zuishin

2016/06/15 13:31

セキュリティ上問題となる機能を使えなくすれば良いわけですが、一番楽で早いのは字句解析・構文解析を勉強して独自にインタプリタを開発することだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問