クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

AI利用の安全とプライバシー

このレッスンのあとで: AIに貼ってはいけない情報と、生成コードによくある弱点を挙げられる。

50分のレッスンコマンド2件AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

AIに貼ってよい情報とは

AI利用でのプライバシーとは、貼った文章に含まれる秘密や個人の情報を、手元から出さないことです。プロンプトに貼った文章は、外のサーバーに送られます。

もう1つの危険は、AIが書いたコードに弱点が混ざることです。両方を知っておけば、安全に使えます。

このレッスンのゴール

メモ

AIに貼ってはいけない情報と、生成コードによくある弱点を挙げられる。

今日のキーワード

ことばいみれい
秘密情報パスワードや鍵など、知られてはいけない文字です。
個人情報氏名や学籍番号など、人を特定できる情報です。
環境変数コードの外に置く、設定の値です。
インジェクション入力がコードの一部として動いてしまう弱点です。
プレースホルダSQL文で値が入る場所に書く印です。?

学生が入力するセルは、このプレビューでは空白です。

貼る前に、秘密と個人の情報を消す

貼る前に、一度立ち止まって、文章を読み返します。パスワード、鍵、学生の氏名や学籍番号が入っていないかを見ます。

消す手間は数秒です。一度外に送った情報は、取り戻せません。

貼ってよいものと、いけないもの

貼るもの判断
パスワード、鍵、トークン貼らない
学生の氏名、学籍番号貼らない
自分で書いた短い関数貼ってよい
秘密を消したエラー文貼ってよい
授業や職場の非公開資料先に許可を確かめる

学生が入力するセルは、このプレビューでは空白です。

ラボのプロジェクトを調べる

貼る前の点検は、検索で助けられます。次の Run は、ラボのプロジェクトから、password、secret、api_key を含む行を探します。何も見つからなければ、何も表示されません。

そのあと、ラボの設定の鍵の行を見ます。本物の鍵ではなく、lab という仮の言葉です。本物は、学生には見えない仕組みで足されます。

秘密の言葉を探す

コマンド
docker exec -w /home/node/project agent grep -rnE "password|secret|api[_-]?key" .

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

設定の鍵の行を見る

コマンド
docker exec agent grep -n apiKey /home/node/.config/opencode/opencode.json

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

鍵はコードに書かず、外に置く

鍵をコードに書くと、貼った文章や、公開した場所に残ります。コードの外の環境変数に置き、コードからは名前で読みます。

読めなかったときは、はっきり知らせる書き方にします。

環境変数から鍵を読む

コード: python
import os

# 鍵そのものは書かず、名前だけを書きます。
api_key = os.environ.get("MY_SERVICE_KEY", "")
if api_key == "":
    print("鍵が設定されていません")
else:
    print("鍵を読み込みました")

生成コードに多い弱点

生成コードには、入力を文字でつないだSQL文が混ざることがあります。入力がSQL文の一部として動くと、関係のない行まで返ります。

値はプレースホルダで渡します。次のコードは、メモリ上の小さな表だけを使います。

連結とプレースホルダの違い

コード: python
import sqlite3

db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE menu (name TEXT, price INTEGER)")
db.execute("INSERT INTO menu VALUES (?, ?)", ("カレー", 450))
db.execute("INSERT INTO menu VALUES (?, ?)", ("うどん", 380))

name = "x' OR '1'='1"
# 文字でつなぐ書き方: 入力が文の一部になります。
unsafe = "SELECT name FROM menu WHERE name = '" + name + "'"
print(db.execute(unsafe).fetchall())
# プレースホルダ: 入力は、ただの値です。
print(db.execute("SELECT name FROM menu WHERE name = ?", (name,)).fetchall())

よくある間違い

注意

「AIが書いたコードだから、検証済みで安全」と考える人がいます。モデルは安全かどうかを調べていません。入力の扱い、鍵の置き場所、古い部品は、自分で点検します。

このラボとソースについて: AI コーディングエージェントのラボ:opencode でコードを説明・修正し、その結果を確かめる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。