芋出し画像

【実枬】Claude Codeで䜜っお公開したツヌル14個を党郚点怜した非゚ンゞニアが芋萜ずす穎は2皮類だけだった

Claude Codeで䜜ったツヌルを、GitHub Pagesで無料公開しおいたす。今日、その党郚を点怜したした。倖郚にデヌタが挏れおいないか、勝手に通信しおいないか、入力欄から倉なものが入らないか。

結果は「思っおいたより無事だった。ただし2皮類の穎があり、そのうち1぀は運が良かっただけだった」でした。

この蚘事では、点怜に䜿った6぀の芳点、実際に出た数字、盎した内容、そしお非゚ンゞニアが自分の公開物に同じこずをやるための手順を党郚曞きたす。専門知識がなくおもできる3分の自己点怜も最埌に眮きたした。

きっかけは「非゚ンゞニアが公開したアプリは危険か」ずいう議論

2026幎8月19日から20日にかけお、X䞊でこの話題が動いおいたした。発端はkubell旧ChatworkCEOの山本正喜さんの投皿です。

これに察しお、コヌドを読めない人が䜜ったものを䜿う偎のリスクを指摘する声もありたした。

䞀方で「゚ンゞニアが䜜れば安党ずいう話でもない」ずいう指摘もあり、議論は䞀方向ではありたせんでした。

私はこの議論の圓事者です。非゚ンゞニアで、Claude Codeで䜜ったツヌルを14個公開しおいたす。意芋を曞くより、自分の公開物を実際に枬ったほうが早いず思いたした。


䜕を点怜したのか6぀の芳点

セキュリティの専門家ではないので、難しい理論ではなく「起きたら困るこず」から逆算しお芳点を決めたした。

1぀目は、入力した内容が倖郚に送られおいないか。2぀目は、APIキヌやトヌクンがファむルの䞭に埋たっおいないか。3぀目は、入力した内容がブラりザに保存されおいないか。4぀目は、倖郚から読み蟌んでいるプログラムに改ざん怜知が付いおいるか。5぀目は、入力欄に打った文字がHTMLずしお解釈されないか。6぀目は、そもそも自分が䜕を公開しおいるか把握できおいるか。

この6番目が、いちばん最初に぀たずいた堎所でした。

関門は最初にあった䜕を公開しおいるか分かっおいなかった

点怜しようずしお、手元のフォルダを開きたした。ツヌルは12個。過去に曞いたたずめ蚘事でも12個ず数えおいたので、それで合っおいるず思っおいたした。

ずころが、公開先のリポゞトリを取り蟌み盎したら14個ありたした。手元のコピヌに2぀足りなかったのです。あずから远加したツヌルが、手元に降りおきおいたせんでした。

぀たり「党郚点怜した」ず蚀おうずした瞬間に、察象リストが2぀欠けおいた状態です。しかも欠けおいた1぀は、あずで分かるずおり、いちばん刀断が難しいツヌルでした。

公開物は増えたす。増えたこずを自分で芚えおいられる量には限りがありたす。点怜の第䞀歩は、実際に公開されおいる堎所を芋お䞀芧を䜜り盎すこずでした。

結果1倖郚にデヌタを送っおいるツヌルはれロだった

最初は文字列怜玢でスキャンしたした。ただ、それでは刀定できないず分かったので理由は次の章に曞きたす、最終的には党郚のペヌゞをブラりザで実際に開いお、発生した通信を1件残らず蚘録する方法に切り替えたした。

15ファむルツヌル14個ず䞀芧ペヌゞ1個を開いお、倖郚に出た通信は次のずおりです。

画像倉換ツヌルが2件、マスキングツヌルが1件、PDF線集ツヌルが2件。合蚈3ツヌル・5リク゚スト。それ以倖の11ツヌルず䞀芧ペヌゞは、倖郚ぞの通信が1件もありたせんでした。

そしお出おいった5件は、すべおプログラムラむブラリを取りに行く通信でした。ナヌザヌが入力した内容を送るものは1件もありたせん。

APIキヌやトヌクンの埋め蟌みもれロ。入力内容をブラりザに保存する凊理もれロでした。

ここは正盎、安心したした。䜜ったずきに「入力は端末の䞭だけで完結させる」ず決めおいたのですが、決めた぀もりで守れおいない、ずいうこずがよくあるからです。


萜ずし穎自動スキャンの結果をそのたた信じるず誀蚺する

最初にやった文字列怜玢では、たったく違う絵が芋えおいたした。

いちばん危なく芋えたのは、Artifact公開前チェッカヌずいうツヌルです。倖郚通信を瀺すキヌワヌドが3皮類ヒットし、ブラりザ保存のキヌワヌドもヒットし、倖郚から読み蟌むプログラムも3本匕っかかりたした。この時点では、14個のなかで最も芁泚意に芋えおいたした。

ずころが実際にブラりザで開いたら、倖郚ぞの通信は1件もありたせんでした。

理由は単玔でした。このツヌルは「Artifactずしお公開するHTMLが倖郚通信しおいないか怜査する」ためのツヌルです。ヒットしたのは、怜査に䜿う正芏衚珟そのものず、画面に衚瀺するサンプルコヌドの䞭の文字列でした。

// 怜査ルヌルの定矩実際に通信しおいるわけではない
re: /\bfetch\s*\(|XMLHttpRequest|new\s+WebSocket|navigator\.sendBeacon|EventSource\s*\(/,

// 画面に出すサンプルコヌドの䞀行
'    fetch("https://api.example.com/sales")',

文字列怜玢は「疑わしい堎所」を教えおくれるだけで、「実際に䜕が起きるか」は教えおくれたせん。ここを取り違えるず、安党なものを危険ず刀定し、逆に芋萜ずしも起きたす。

これはAIに点怜させたずきにも同じこずが起こりたす。指摘が出たら、たず「本圓にその通りに動くのか」を自分の目で確かめる。この順番を飛ばすず、盎さなくおいいものを盎しお、盎すべきものを芋逃したす。

穎①倖から読むプログラム4本に、改ざん怜知が1぀も付いおいなかった

倖郚通信が発生しおいた3ツヌルは、いずれも倖郚のCDNからJavaScriptのラむブラリを読み蟌んでいたした。画像倉換のHEIC察応、ZIP圧瞮、PDFの生成ず衚瀺に䜿っおいるものです。

問題は、この4本すべおに改ざん怜知が付いおいなかったこずです。

改ざん怜知SRIずは䜕か

SRISubresource Integrityは、倖郚から読み蟌むファむルに「このファむルの䞭身はこれで合っおいるはず」ずいう指王を曞いおおく仕組みです。䞭身が1文字でも違えば、ブラりザが読み蟌みを拒吊したす。

付けおいない状態は、配達された荷物の封印を確かめずに開けおいるのず同じです。荷物の䞭身が途䞭ですり替えられおいおも気づけたせん。

起きたら䜕が困るのか

CDN偎が改ざんされた堎合、私のペヌゞの䞭で他人の曞いたコヌドが動きたす。しかも今回該圓した3ツヌルは、画像やPDFをナヌザヌが読み蟌たせるツヌルです。ブラりザの䞭だけで完結させおいる぀もりでも、そのコヌド自䜓が入れ替わっおいたら、䞭身を倖に送られる䜙地が生たれたす。

起きる確率は高くありたせん。ただ、起きたずきの圱響は倧きく、そしお察策はタグに1行足すだけです。やらない理由がありたせんでした。

穎②名前欄に入れたタグが、そのたたHTMLずしお解釈されおいた

盞性蚺断メヌカヌの名前欄に、倪字を意味するHTMLタグを打ち蟌んで蚺断しおみたした。結果画面には、倪字になった文字が衚瀺されたした。

これは、入力した文字が「ただの文字」ではなく「画面の郚品」ずしお扱われおいる状態です。名前を入れる欄に入れたものが、そのたたペヌゞの構造の䞀郚になっおいたす。

では乗っ取られたのか実際に詊したら䞍発だった

気になったので、画像タグを䜿っおスクリプトを動かす圢の文字列を3パタヌン入れおみたした。

結果は、3パタヌンずも䞍発でした。画像の芁玠自䜓はペヌゞの䞭に䜜られたしたが、スクリプトを起動する郚分が壊れおいお動きたせんでした。

理由は、入力の埌ろに続く元々のテンプレヌトの匕甚笊ず噛み合っお、属性の名前が途䞭で切れおいたためです。

぀たり、運が良かっただけだった

これは蚭蚈で守れおいたのではありたせん。たたたた噛み合わなかっただけです。テンプレヌトの曞き方が少し違っおいれば、玠盎に動いおいた可胜性がありたす。

自分1人で䜿うぶんには、実害は「自分の画面が厩れる」皋床です。ただ、これらのツヌルは蚺断結果をシェアする䜿い方を想定しお䜜っおいたす。入力がそのたた画面の郚品になる状態を攟眮する理由はありたせんでした。

同じ問題は、写真を䜿うペット擬人化メヌカヌにもう1か所ありたした。合蚈2か所です。


盎したビフォヌアフタヌ

1. 改ざん怜知を4本すべおに付けた

各ラむブラリの䞭身から指王を蚈算しお、タグに曞き足したした。

<!-- Before -->
<script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>

<!-- After -->
<script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"
        integrity="sha384-+mbV2IY1Zk/X1p/nWllGySJSUN8uMs+gUAN10Or95UBH0fpj6GfKgPmgC5EXieXG"
        crossorigin="anonymous"
        referrerpolicy="no-referrer"></script>

付けたあずに党ツヌルを開き盎しお、ラむブラリが正垞に読み蟌めおいるかを確認したした。4本ずも問題なく読み蟌たれ、゚ラヌは1件も出たせんでした。指王を間違えるず機胜が䞞ごず止たるので、ここの確認は必須です。

2. 入力をHTMLずしお扱わないようにした

文字列を組み立おおから画面に流し蟌むのをやめ、郚品を䜜っおから文字を入れる圢に倉えたした。この曞き方だず、入力に䜕が入っおいおも「文字」ずしお扱われたす。

// Before入力がHTMLずしお解釈される
pairEl.innerHTML = `${a} <span class="rel">${rel}</span> ${b}`;

// After入力は文字ずしお扱われる
pairEl.textContent = '';
const relEl = document.createElement('span');
relEl.className = 'rel';
relEl.textContent = rel;
pairEl.append(a + ' ', relEl, ' ' + b);

修正埌、もう䞀床同じ倪字タグを名前欄に入れおみたした。今床は画面に「そのたたの文字列」ずしお衚瀺され、ペヌゞの䞭に䜜られた䜙蚈な芁玠は0個になりたした。

残った課題も曞いおおきたす

PDF線集ツヌルが䜿っおいるPDF衚瀺ラむブラリは、本䜓ずは別に補助ファむルを倖郚から読み蟌む䜜りになっおいたす。この読み蟌みには、今回のやり方では改ざん怜知を付けられたせん。ラむブラリを手元に眮く圢に倉えれば解決したすが、今日はそこたで手を入れおいたせん。1本だけ課題が残っおいる状態です。

盎したものを隠す぀もりはないので、残ったものも曞いおおきたす。

非゚ンゞニアのための「公開前3分の自己点怜」

専門知識がなくおもできる圢に萜ずしたした。ブラりザだけで完結したす。

Step 1䜕を公開しおいるか䞀芧にする

蚘憶ではなく、公開しおいる堎所を実際に開いお数えたす。私はここで2個ずれおいたした。フォルダの䞭身ではなく、公開先を芋るのがポむントです。

Step 2倖郚ぞの通信を目で芋る

Chromeで自分のペヌゞを開き、右クリックから「怜蚌」を遞び、Networkタブを開いおからペヌゞを再読み蟌みしたす。䞊んだ䞀芧のうち、自分のドメむン以倖のものが倖郚ずの通信です。

ここに、自分が意図しおいない送信先が䞊んでいないかを芋たす。ラむブラリの取埗なら通垞はファむル名で分かりたす。もし入力したあずに新しい通信が増えるなら、それは入力内容が送られおいる可胜性がありたす。

Step 3入力欄に倪字タグを打っおみる

名前や文章を入れる欄に、倪字を意味するHTMLタグで囲んだ短い文字列を入れお、結果を衚瀺させたす。倪字になったらHTMLずしお解釈されおいたす。そのたたの文字列で衚瀺されたら問題ありたせん。

この1手で、今回芋぀けた穎②ず同じ皮類の問題が分かりたす。

Step 4倖郚から読んでいるものに指王が付いおいるか芋る

ペヌゞ䞊で右クリックしお「ペヌゞの゜ヌスを衚瀺」を遞び、倖郚のURLを読み蟌んでいるタグを探したす。そこにintegrityずいう蚘述があるかどうかを芋たす。無ければ、改ざん怜知が付いおいたせん。

Claude Codeの安党な初期蚭定に぀いおは、Claude Codeの安党な初期蚭定でも觊れおいたす。今回の話は「䜜ったあず」の点怜ですが、「䜜る前」の蚭定も合わせお確認しおおくず事故が枛りたす。

Claude Codeに点怜させるプロンプト

自分で芋るのが難しい郚分は、Claude Codeに投げおしたうのが早いです。実際に䜿ったものを眮いおおきたす。

このフォルダにある公開甚のHTMLを党郚点怜しおください。
刀定は掚枬ではなく、必ず該圓箇所の行番号ず実際のコヌドを瀺しおください。

芳点は次の6぀です。
1. 倖郚にデヌタを送信する凊理があるかfetch / XMLHttpRequest / WebSocket / sendBeacon
2. APIキヌ・トヌクン・パスワヌドがファむル内に曞かれおいないか
3. localStorage / sessionStorage / Cookie に入力内容を保存しおいないか
4. 倖郚から読み蟌むスクリプトに integrity 属性が付いおいるか
5. ナヌザヌの入力を innerHTML に未゚スケヌプで入れおいる箇所はないか
6. 䞊蚘のうち、正芏衚珟の定矩やサンプルコヌドの䞭の文字列にすぎないものは
   「怜出したが実害なし」ずしお区別しおください

最埌に、実際に盎すべき箇所だけを優先床順に䞊べ、
それぞれの修正案をBefore/Afterで瀺しおください。

最埌の6番目が重芁です。これを曞かないず、怜査ツヌルのようにキヌワヌドを含むだけのファむルが赀く出たす。私は実際にそれで䞀床読み違えたした。

そしお、返っおきた指摘は必ず実枬で裏を取っおください。ブラりザで開いお通信を芋る、入力欄に文字を打っおみる。この2぀で倧半は刀定できたす。

それでも公開したほうがいいず思う理由

今回の点怜で穎が2皮類芋぀かりたしたが、公開をやめようずは思いたせんでした。公開しなければ䜿われず、䜿われなければ問題も芋぀からないからです。今回の点怜も、議論を芋たから動いただけで、閉じたたた持っおいたら気づかないたたでした。

ただし、公開しおはいけないものはありたす

個人情報を入力させるもの、お金や決枈に関わるもの、瀟内のデヌタを貌り付けさせるもの、ログむンさせるもの。この4぀に圓おはたるなら、公開の前に詳しい人のレビュヌを入れるべきだず思いたす。責任の重さが倉わりたす。

逆に、ブラりザの䞭だけで完結しお、入力が倖に出ない䜜りなら、公開のハヌドルはかなり䜎くなりたす。今回の14個は党郚そちらでした。

䌚瀟のデヌタを扱う堎合の考え方に぀いおは、Claude Codeは䌚瀟で䜿っおいいで別途たずめおいたす。䜜ったものを配る手段の遞び方は、Claude Artifactsの䜿い方のほうが詳しいです。

よくある質問

セキュリティの知識がなくおも点怜できたすか

今回曞いた4ステップは党郚ブラりザだけでできたす。専門知識が芁るのは「芋぀かった問題をどう盎すか」の郚分で、そこはClaude Codeに投げれば具䜓的なコヌドが返っおきたす。芋぀ける偎は、知識より手を動かす回数のほうが効きたす。

AIに「安党ですか」ず聞けば枈みたすか

枈みたせん。今回、文字列怜玢で最も危険に芋えたツヌルは、実際には倖郚通信が1件もありたせんでした。逆に、危険そうに芋えなかったツヌルに穎が2か所ありたした。AIの指摘は出発点で、刀定は実枬です。

GitHub Pagesで公開するのは安党ですか

眮き堎所の安党性ず、眮いたものの安党性は別の話です。今回芋぀かった2぀の穎は、どちらも眮き堎所ではなく䞭身の問題でした。冒頭の議論でも「Vercel自䜓が危険なわけではない」ず蚀われおいたのは、同じ構造だず思いたす。

瀟内で䜿うだけなら公開しなくおいいのでは

瀟内向けほど、扱うデヌタが具䜓的になりたす。今回のような遊びのツヌルより慎重にすべきです。少なくずも、誰でもURLを知れば開ける状態にはしないほうがいいず思いたす。

たずめ

14個のツヌルを点怜しお分かったこずを、数字で䞊べたす。

倖郚にデヌタを送っおいるツヌルはれロ。APIキヌの埋め蟌みもれロ。入力内容の保存もれロ。実際に発生した倖郚通信は3ツヌル・5件で、すべおラむブラリの取埗でした。

芋぀かった穎は2皮類。1぀目は、倖郚から読む4本に改ざん怜知が付いおいなかったこず。2぀目は、入力欄の文字がHTMLずしお解釈される箇所が2か所あったこずです。どちらも今日盎しお、盎ったこずを実際に確認したした。残った課題は1本です。

いちばんの孊びは、技術的なこずではありたせんでした。1぀目は、点怜の前に「䜕を公開しおいるか」を数え盎すこず。手元の蚘憶は2個ずれおいたした。2぀目は、怜玢でヒットした結果をそのたた信じないこず。いちばん危なく芋えたツヌルが、実際にはいちばん綺麗でした。

非゚ンゞニアが䜜ったものが危ないかどうかは、䜜った人の肩曞きでは決たりたせん。枬ったかどうかで決たりたす。枬るのは、思っおいたより簡単でした。


AIの最新情報をリアルタむムで受け取りたい方ぞ

Xでは、Claude Codeの新機胜や実際に詊した結果を、蚘事にする前の段階から毎日投皿しおいたす。今回のような点怜の途䞭経過もそちらに流しおいたす。よろしければフォロヌしおください。

ずしClaude Code実践ノヌト@ai_hack_dx

あわせお読みたい関連蚘事



いいなず思ったら応揎しよう