今日のhtml 画像サイズ(xy)計測 , コピペ or DD

プロンプトはアホだから見ないでね

おいかわななせ

画像ファイルやクリップボードに張られた画像サイズを表示できるソフト

おいななぷろんぷと for 楽天Deepseek
楽天Deepseekだよ。

つい、ツールが欲しくて……楽天AI Deepseek君に聞いてみた。画像の原作はGemini君。animaでi2iした(ぁ
htmlだし、みんなバックドアが無いかチェックできるよね?脆弱性はあるけどローカルで使うなら大丈夫だね。

imega-size.html   utf-8で保存しよう。宣言しておくね、「CC0」。あ、これはGemini版。いきさつは以下で。残る脆弱性を知りたかったら、最後まで見てね。たぶん、読むよりAIに張ったほうがはやいかも。

<!doctype html>
<meta charset="utf-8">
<title>おいかわななせ - Image Size Viewer</title>
<style>
  body{font:16px system-ui;margin:2rem}
  #drop{border:2px dashed #999;padding:2rem;text-align:center;color:#666;border-radius:8px}
  img{max-width:200px;display:block;margin-top:0.5rem}
  .error{color:#d9534f;margin-top:0.5rem}
</style>
<div id="drop">ここに画像をドロップ、または貼り付け(Ctrl/Cmd+V)</div>
<ul id="out"></ul>

<script>
function handleFile(file){
  if(!file || !file.type.startsWith('image/')) return;
  
  const url = URL.createObjectURL(file);
  const img = new Image();
  const filename = file.name || 'Clipboard';

  // 読み込み成功時
  img.onload = () => {
    const li = document.createElement('li');
    li.textContent = `${filename}: ${img.naturalWidth} x ${img.naturalHeight} px`;
    
    const thumb = img.cloneNode();
    thumb.width = Math.min(200, img.naturalWidth);
    li.appendChild(thumb);
    document.getElementById('out').appendChild(li);
    
    URL.revokeObjectURL(url);
  };

  // 読み込み失敗時(メモリリーク防止)
  img.onerror = () => {
    const li = document.createElement('li');
    li.className = 'error';
    li.textContent = `❌ ${filename}: 画像として認識できないか、ファイルが破損しています。`;
    document.getElementById('out').appendChild(li);
    
    URL.revokeObjectURL(url);
  };

  img.src = url;
}

// 貼り付け
document.addEventListener('paste', e=>{
  [...e.clipboardData.items].forEach(i=>{ if(i.kind==='file') handleFile(i.getAsFile()); });
});

// ドラッグ&ドロップ
const drop = document.getElementById('drop');
drop.addEventListener('dragover', e=>{e.preventDefault(); drop.style.borderColor='#333';});
drop.addEventListener('dragleave', ()=>{drop.style.borderColor='#999';});
drop.addEventListener('drop', e=>{
  e.preventDefault(); drop.style.borderColor='#999';
  [...e.dataTransfer.files].forEach(handleFile);
});
</script>

次がきたらクリアしてといったら.jsだされたので、断念。脆弱性ふさぐ提案もあったけど.jsなので断念
リロードすればクリアだよ。あ、README.mdが必要?
いま作るね。

README.md

おいななぷろんぷ
# Image Size Viewer

ブラウザに画像をドラッグ&ドロップ、またはクリップボードから貼り付ける(Ctrl+V / Cmd+V)だけで、画像の縦横ピクセルサイズ(解像度)を瞬時に確認できる軽量な単一ファイル(Single-file)HTMLツールです。

## 🚀 特徴

- **完全ローカル動作:** サーバーへの画像アップロードは一切行いません。すべての処理がブラウザ内で完結するため、プライバシーやセキュリティ面で安全です。
- **直感的な操作:** ファイルのドロップだけでなく、スクリーンショットなどのクリップボードデータからの直接貼り付け(Paste)にも対応しています。
- **メモリに優しい:** オブジェクトURLの適切な解放(`URL.revokeObjectURL`)により、大量の画像を処理してもブラウザが重くなりにくい設計です。
- **マルチプラットフォーム:** HTML5対応のモダンブラウザ(Chrome, Edge, Firefox, Safariなど)があれば、OSを問わず動作します。

## 📦 使い方

1. `image-size.html` を任意のブラウザで開きます。
2. 画面上の点線枠内(またはブラウザ画面上)に画像をドロップするか、`Ctrl + V`(Macは `Cmd + V`)で画像を貼り付けます。
3. 下部にファイル名、解像度(横 x 縦 px)、および縮小プレビューが表示されます。

## 🛠️ 技術スタック

- HTML5
- CSS3 (system-ui font)
- Vanilla JavaScript (ES6+)

## 📄 ライセンス

このプロジェクトは **CC0 1.0 Universal (Public Domain Dedication)** のもとで公開されています。

いかなる権利も留保されていません。商用利用、改変、再配布、コードの流用など、あらゆる目的で自由に(許可やクレジット表記なしで)ご利用いただけます。


スクリーンショットも張るよ。

ここにdrop

winのファイルエクスプローラからコピー。もしくは編集中の画像ソフトからコピー この画面でペースト。
dropの時は上を狙わないといけないけど、ペーストならwindowで選んで、張るだけ


サンプル。

ファイル名かimage.pngになるよ。

脆弱性診断

おいななぷろんぷと for Gemini

提示された image-size.html のソースコードを診断しました。

結論から言うと、現時点でサーバーや他のユーザーに影響を与えるような深刻な脆弱性(XSSなど)はありません。 完全にクライアントサイド(ブラウザ上)で完結しており、安全なメソッドが使用されています。

ただし、エラーハンドリングの不足によるメモリリークの懸念など、実用上の堅牢性を高めるための改善点がいくつか見つかりました。詳細な診断結果と修正案は以下の通りです。

🛠️ 詳細診断結果

1. クロスサイトスクリプティング(XSS):安全 ✅評価: 完全に安全です。
理由: ファイル名を表示する際に li.textContent を使用しているため、悪意のあるスクリプトを含むファイル名(例: <script>alert(1)</script>.png)がドロップされても、文字列として安全にエスケープされます。
SVGに関する補足: image/svg+xml(SVG画像)をドロップした場合、SVG内部にスクリプトを埋め込むことが可能ですが、今回は <img> タグの src として読み込んでいるため、ブラウザのセキュリティ制限により内部のスクリプトは実行されません。


2. メモリリークのリスク(エラーハンドリング不足):要改善 ⚠️評価: 低〜中リスク(ブラウザのタブが重くなる・クラッシュする原因)。
理由: 画像のデコードに失敗した場合(拡張子が偽装された不正ファイルや、破損した画像データなど)、img.onload が発火しません。その結果、末尾にある URL.revokeObjectURL(url) が実行されず、ブラウザのメモリ上にオブジェクトURL(画像データ)が残り続けてしまいます。


3. クライアントサイド DoS(ピクセル爆弾):低リスク ℹ️評価: 仕様上の限界(低リスク)。
理由: 解像度が極端に巨大な画像(例: 30,000 x 30,000 px のような画像爆弾)をドロップされた場合、ブラウザが画像のデコードを試みた段階でメモリを大量に消費し、タブがクラッシュ(Out of Memory)する可能性があります。


🚀 改善を施した修正コード案

エラーハンドリング(img.onerror)を追加し、破損ファイルや不正ファイルが来ても確実にメモリを解放し、ユーザーに通知する安全なコードに変更することをおすすめします。

(略   -  これが採用版  )

修正のポイントimg.onerror の追加: 画像の読み込みに失敗した場合でも、確実に URL.revokeObjectURL(url) を呼び出すようにし、メモリリークを完全に防ぎます。
ユーザー体験(UX)の向上: 読み込めないファイルがあった際に、無視するのではなく「エラー」として画面に表示するようにしました。

Gemini

次はGeminiのコードをchatGPTに、えい

脆弱性診断

おいななぷろんぷと for ChatGPT

以下は、アップロードされた `image-size2.html` の簡易脆弱性診断です。
## 総合評価
**リスク: 低(Low)**
ローカルで画像サイズを表示するだけのシンプルなHTMLであり、サーバー通信も外部ライブラリも使用していません。攻撃対象面はかなり小さいです。
---
## 良い点
### ✅ XSS耐性
表示に
```javascript
li.textContent = ...
```
を使用しているため、
```
<img src=x onerror=alert(1)>
```
のようなファイル名でもHTMLとして実行されません。
もし
```javascript
innerHTML =
```
だった場合は危険でしたが、現在は安全です。
---
### ✅ DOM XSSなし
外部入力を
```
document.write
innerHTML
insertAdjacentHTML
eval
Function
setTimeout(string)
```
などへ渡していません。
---
### ✅ メモリリーク対策済み
```
URL.revokeObjectURL(url);
```

```
onload
onerror
```
両方で実行しています。
これは非常に良い実装です。
---
### ✅ ファイル種別チェック
```
file.type.startsWith('image/')
```
で最低限のフィルタがあります。
---
## 気になる点
### ① MIMEタイプだけでは完全ではない
現在
```javascript
if(!file || !file.type.startsWith('image/')) return;
```
ですが、
ブラウザによっては
```
type=""
```
になることがあります。
またMIMEは偽装可能です。
ただし
```
img.onerror
```
があるため重大ではありません。
---
### ② 巨大画像DOS
例えば
```
100000 × 100000
```
の画像を読み込ませると
```
Image()
```
が大量メモリを消費します。
ローカルツールなら問題は小さいですが、
サイズ制限は付けた方がよいです。
例えば
```javascript
if(file.size > 50 * 1024 * 1024){
alert("画像が大きすぎます");
return;
}
```
---
### ③ SVG
SVGも
```
image/svg+xml
```
なので通ります。
SVG自体は
```
<img src=...>
```
では通常スクリプトは実行されませんが、
巨大SVGで負荷を掛けられる可能性があります。
PNG/JPEG/WebPだけ許可しても良いでしょう。

```javascript
const allow = [
"image/png",
"image/jpeg",
"image/webp",
"image/gif"
];
if(!allow.includes(file.type))
return;
```
---
### ④ Object URL生成前チェック
今は
```
createObjectURL
```
してから読み込みますが、
先に
```
file.size
```
を見ておくと無駄な処理を減らせます。
---
## セキュリティ上問題ない点
* サーバー通信なし
* Cookie使用なし
* LocalStorage使用なし
* IndexedDB使用なし
* fetchなし
* XMLHttpRequestなし
* WebSocketなし
* evalなし
* innerHTMLなし
* CSPが無くても重大リスクは小さい
---
## 改善案
ファイルサイズ制限
```javascript
const MAX_SIZE = 50 * 1024 * 1024;
if(file.size > MAX_SIZE){
alert("50MB以下の画像のみ対応");
return;
}
```
許可拡張子
```javascript
const allow = [
"image/png",
"image/jpeg",
"image/webp",
"image/gif"
];
if(!allow.includes(file.type)){
alert("対応画像ではありません");
return;
}
```
例外保護
```javascript
try{
img.src = url;
}catch(e){
URL.revokeObjectURL(url);
}
```
---
## 総合評価(OWASP観点)
| 項目 | 評価 |
| -------------- | ------------- |
| XSS | ✅ 問題なし |
| DOM XSS | ✅ 問題なし |
| CSRF | ✅ 対象外 |
| SQL Injection | ✅ 対象外 |
| Path Traversal | ✅ 対象外 |
| File Upload | ⚠️ MIMEチェックのみ |
| DoS | ⚠️ 巨大画像対策を推奨 |
| 情報漏えい | ✅ 問題なし |
| メモリリーク | ✅ 対策済み |
**総評:** ローカル用途のユーティリティとしては十分安全な実装です。実運用向けにするなら、**画像サイズ上限の追加**と**許可する画像形式のホワイトリスト化**を行うと、さらに堅牢になります。

ChatGPT

みんなで、デコってね。