前提・実現したいこと
画像アップロード機能を実装しています。調べているとセキュリティ周りを組むのが大変そうで腰が引けたのですが、ふと次の方法でいいのではないかと思いました。問題やセキュリティリスクがないか知りたいです。
###考えた方法
■保存フロー
- JSで画像をbase64にし、
- AJAXで送り、
- 送られたbase64のテキストについて以下検証し
➀タグがあるか?
➁画像かどうか?
4. base64のテキストのままデータベースに保存する
■表示フロー
- データベースにあるbase64のテキストを取得
- htmlspecialchars()をかけて出力
###ソースコード
上の流れなら、通常のコメントを受け付けるのと同じ検証でいいですよね?
ただのテキストの検証なので、唯一やるべき検証である3の➀と➁は、次のコードで済むと思います。
そのように思ったのですが、base64のテキストで送るこの方法には、何か問題あるのでしょうか?
PHP
1<?php 2// AJAXでbase64化された画像を受け取る 3$base64 = $_POST['base64'] ?? ''; // "data:image/jpeg;base64,/9j/ABCDEFG" など 4 5// ➀と➁が問題あれば終了 6if( isHtml($base64) || ! isImg($base64) ) { 7 echo '問題が発生しました'; 8}else{ 9 $sql = "INSERT INTO images (ID, base64, created) VALUES (:base64, now())"; 10 $stmt = $dbh->prepare($sql); 11 $params = array(':base64' => $base64); 12 $stmt->execute($params); 13 echo '登録完了しました'; 14} 15 16// ➀タグがあるか? 17function isHtml( $base64 ) { 18 $result = false; 19 if ( preg_match("/<(\"[^\"]*\"|'[^']*'|[^'\">])*>/", $base64) ) $result = true; 20 return $result; 21} 22 23// ➁画像かどうか? 24function isImg( $v ){ 25 $result = false; 26 if ( preg_match("#^data:image/jpeg;base64#", $v) ) $result = true; 27 if ( preg_match("#^data:image/jpg;base64#", $v) ) $result = true; 28 if ( preg_match("#^data:image/png;base64#", $v) ) $result = true; 29 return $result; 30}
回答3件
あなたの回答
tips
プレビュー