🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1844閲覧

CGI(Xサーバー、python)で環境変数が正常に取得できない

takadaka49

総合スコア2

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/03/11 11:54

編集2021/03/11 12:24

前提・実現したいこと

javascriptで本体を作っているのですがapiキーを本体から隠したいため、環境変数からapiキーを取得するcgiスクリプトをpythonで作っています。

実行環境は以下のとおりです。
サーバー:Xサーバー
CGI:python3.9.2

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

CGIスクリプトから環境変数を取得しようとしたのですが、KeyErrorが発生してしまいます。 cgiではなく、pythonコンソールから実行した場合は、環境変数を取得できておりCGIとして呼び出したときのみ、 環境変数が設定されていないとみなされてるように思えます。

該当のソースコード

python

1#!/home/xs000000/.linuxbrew/bin/python3 2# -*- coding: utf-8 -*- 3import os 4import cgi 5import cgitb 6cgitb.enable() 7 8print("Content-Type: text/html") 9print() 10 11print (os.environ['APIKEY']) 12

試したこと

ここに問題に対して試したことを記載してください。

1.ターミナルからexport -pで確認
->declare -x APIKEY="MYAPIKEY" (正常に表示)
2.pythonコンソールで環境変数APIKEYを表示 ->正常に取得
3.os.environ['APIKEY']->os.environ.get('APIKEY')に変更
->戻り値:none
4.CGIで環境変数PATHを表示
->/usr/local/bin:/usr/bin:/bin(中途半端な表示?)
cgiは初めてになります。どなたかご教授願います。

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2021/03/11 12:50

外部から CGI で API キーを取得できてしまうというのはむしろセキュリティ的には大穴を開けることになるのでは。
takadaka49

2021/03/12 11:36

ありがとうございます。APIキーを隠す方法という記事を参考にしたのですが、hoshi-takanoriさんのおっしゃるとおりだと思います。別の方法で実装します。
guest

回答3

0

そのAPIキーが隠すべきキーならそもそもそのAPIはブラウザのJSから使えないのでは。
teratailでもよくある質問。

逆にブラウザのJSから使えるなら公開してもいいAPIキー。

投稿2021/03/11 13:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takadaka49

2021/03/12 11:33

ありがとうございます。
guest

0

1.ターミナルからexport -pで確認

->declare -x APIKEY="MYAPIKEY" (正常に表示)
2.pythonコンソールで環境変数APIKEYを表示 ->正常に取得
3.os.environ['APIKEY']->os.environ.get('APIKEY')に変更
->戻り値:none

環境変数はプロセス毎の固有の値なので、端末のシェルプロセスの環境変数と、HTTPサーバープロセスの環境変数とは直接関係がありません。端末で確認するのは意味がありません。

HTTPサーバープロセスの環境変数の設定方法は、どういうサーバーソフトをどのように起動しているかに依ります。

HTTPサーバープロセスの環境変数にAPIキーなどの秘密情報を入れてしまうのは抵抗ありますが。

投稿2021/03/11 12:57

otn

総合スコア85882

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

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

takadaka49

2021/03/12 11:32

ありがとうございます。環境変数のそもそもを理解していませんでした。
guest

0

ベストアンサー

環境変数の設定の仕方が間違っています。ターミナルで設定した環境変数はApacheに引き継がれません。Apacheの環境変数を設定する方法は複数ありますが、レンタルサーバーだと .htaccess に指定するしかないと思います。mod_envが設定されている必要がありますが、XSERVERではmod_envが設定されているようです。

SetEnv APIKEY XXXXXXXXXXXXXXXXXXX

ただ、.htaccessの内容はインターネット越しには見えません(デフォルトの設定では)が、Pythonスクリプトに直書きしてもそれは同じなので、この方法でセキュリティレベルが上がるとは思えません。環境変数に拘る必要もないように思えます。

投稿2021/03/11 12:48

ockeghem

総合スコア11705

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

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

takadaka49

2021/03/12 12:23 編集

ありがとうございます。環境変数のそもそもを理解していませんでした。 正直、上記方法を試しましたが、環境変数が追加できませんでした。 APIキーを他人に見えないようにするのが目的ですので、別の方法を検討します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問