Python importテクニック(発展版)

はじめに

前回のPython importテクニック見てて、
「ひょっとしたらこんなアホなimportできるんじゃね」
とか思ったので試してみる。

やったこと

前回importについて
「他の文と同じで、特別扱いしない」
という主旨の発言をした。

ということは、実行時にimportするライブラリが決まってなくてもいい筈だ。という訳でこんなの書いてみた

import sys
name = sys.argv[1]
print name
exec("import {0}".format(name))
exec("print dir({0})".format(name))

引数でimportするライブラリを決める。

何 そ れ き も い

動かす。

python main.py re

結果。

re
['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']

なんか動いてる。

滅 茶 苦 茶 き も い

結論

多分コンパイル時にimportするライブラリが決まってないと云々みたいな、コンパイルする言語に慣れてると割と!?!?な挙動が多いPythonというかスクリプト言語であった。

にしても、引数でexecするとか、そもそも脆弱性の温床なんで、実用性は皆無と言ってよい。