Avatar
🎍

Organizations

  • 概要

    FTPサーバーにフォルダをアップロードする機能を実装した。 この実装にwebkitdirectory属性を使用しているが、公式では以下のような警告があり、この内容について深掘りした。

    警告文その1

    警告
    webkitdirectory 属性は標準ではありませんし、 標準化の過程にも入っていません。 
    この属性を Web 上の本番環境で使わないで下さい: なぜなら、この属性を全ユーザーが使えるとは限らないからです。 
    また、この属性はクライアントの実装に非互換がある可能性もありますし、 振る舞いが将来変更される可能性もあります。
    

    主な内容としてはwebkitdirectory属性はブラウザに依存するので、ユーザーによっては期待通りに機能しない可能性があるためとのこと。

    続いて、

    PHP は ブラウザ/ユーザーエージェントから送られてきた相対パスの情報をパースし、 その情報を $_FILES 配列に渡すことだけを行います。 
    full_path 配列中の値が、 実際のディレクトリ構造を含んでいるという保証はありません。 
    よって、PHP アプリケーションはこの情報を信用してはいけません。
    

    この箇所に触れる前に$_FIELSについて簡単に説明する。$_FILESはPHPで使用できるグローバルな変数で、フォームから送信されるファイルデータはこの変数に格納される。

    この$_FILESのデータ構造内で、full_pathは以下のように表示される。

    ["full_path"]=> array(2) { [0]=> string(15) "test1/.DS_Store" [1]=> string(16) "test1/hellow.pdf" } 
    

    var_dump

    PHPはユーザーが送信したデータをチェックしないため、場合によっては意図しないファイルが書き込まれてしまうリスクがある。

    警告文その2

    別の記事も読む。意図しない挙動について’Path Traversal’と命名されていた。

    The full_path array in each $_FILES field is not safe, because it is direct user input. 
    All values from this array must be validated to prevent potential vulnerabilities, 
    especially when storing the uploaded files in sub directories on the server.
    

    対応

    このリスクの対応として、以下が挙げられる。

    tech Created Fri, 10 Jul 2026 19:30:43 +0000
  • 概要

    FTPを使い、ファイルをアップロード/ダウンロード/削除できるウェブアプリを作りました。 アプリはDockerコンテナにホストします。

    本文ではファイルのダウンロードの実装の際に詰まった箇所について書きます。 この経験を通し、Dockerコンテナでホストするアプリを使いFTPサーバーからコンピューターのハードドライブへの直接ダウンロードはできないことを理解しました。

    達成したかったこと

    Dockerコンテナにホストするアプリを使い、FTPサーバーにあるファイルをコンピュータのハードドライブにダウンロードすることを目標としました。

    ディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginxと各コンテナを設定         
    │
    ├── nginx/                  
    │   ├── default.conf       
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── src/                  
    │   │  ├── download.php # ファイルのダウンロードを実装     
    │   │  └── index.php            
    │   └── Dockerfile
    │
    └── README.md  
    

    ダウンロードを実行するコードです。(download.php)

    $remote_file = filter_input(INPUT_GET, 'download_file', FILTER_UNSAFE_RAW);
    $download_dir = '../../downloads/';
    $download_file = $download_dir . $remote_file;
    
    ftp_get($conn_id, $download_file, $remote_file, FTP_BINARY)
    

    ftp_get

    tech Created Thu, 02 Jul 2026 20:57:38 +0000
  • はじめに

    前回のブログ内容に続いています。 devcontainerでPHPフルスタックアプリケーション開発環境を作成、その際Dockerコンテナ起動に合わせてMySQLも初期化できるように設定しました。失敗についても書きます。

    結論

    /docker-entrypoint-initdb.dを使うとコンテナ起動時にデータベース初期化を行うことができる。

    達成したかったこと

    devcontainer起動時にデータベースの初期化を自動化したいと思いました。

    ディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginx, dbと各コンテナを設定         
    │
    ├── mysql/                  
    │   ├── initdb/
    │	│   ├── 01-create-user.sh   # ユーザー作成スクリプト      
    │	│   └── 02-schema.sql       # テーブル作成スクリプト               
    │   ├── entrypoint.sh
    │	└── Dockerfile 
    ├── nginx/                  
    │   ├── default.conf       
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── index.php           
    │   └── Dockerfile
    │
    └── README.md                
    

    設定は以下のとおりです。

    docker-compose.yml

    version: "3.9"
    services:
    	nginx:
    	build: ../nginx/
    	ports:
    		- 80:80
    	volumes:
    		- ../:/var/www/html/
    
    php:
    	build: ../php/
    	volumes:
    		- ../:/var/www/html/
    
    db:
    	image: ../mysql/
    	volumes:
    		- mysql-data:/var/lib/mysql
    		- ../mysql/initdb:/docker-entrypoint-initdb.d
    	environment:
    		MYSQL_ROOT_PASSWORD: mariadb
    		MYSQL_DATABASE: memopad
    
    volumes:
    	mysql-data:
    

    Dockerfile

    tech Created Thu, 11 Jun 2026 18:57:26 +0000
  • はじめに

    devcontainerPHPのフルスタックアプリケーション開発環境を作成しました。 その過程でnginxの設定に詰まったので振り返りを兼ねて共有します。

    結論

    nginx, PHPとディレクトリを分けた状態でDockerインスタンスを連携させるにはDocumentRootの設定を追加し、nginx.confrootのパスを修正する必要がありました。

    達成したかったこと

    nginxを使いhttp://localhost/ にアクセスしたら index.phpのページが表示されるようにしたいと思いました。

    ソースコードのディレクトリは以下の通りです。

    my-php-app/
    │
    ├── .devcontainer/                  
    │   ├── devcontainer.json   # 開発環境の設定      
    │   └── docker-compose.yml  # php, nginx, dbと各コンテナを設定         
    │
    ├── nginx/                  
    │   ├── default.conf        # phpアプリのルーティングを設定  
    │   └── Dockerfile 
    │
    ├── php_code/                  
    │   ├── index.php           # / にアクセスした際に表示されるページ
    │   └── Dockerfile
    │
    └── README.md                # プロジェクトの説明
    

    修正前のdocker-compose.yml, nginx.confの設定は以下のとおりです。

    docker-compose.yml

    version: "3.9"
    services:
    	nginx:
    	build: ../nginx/
    	ports:
    		- 80:80
    	volumes:
    		- ../:/var/www/html/
    
    php:
    	build: ../php_code/
    	volumes:
    		- ../:/var/www/html/
    
    db:
    	image: mariadb
    	volumes:
    		- mysql-data:/var/lib/mysql
    	environment:
    		MYSQL_ROOT_PASSWORD: mariadb
    		MYSQL_DATABASE: ecomdb
    
    volumes:
    	mysql-data:
    

    nginx.conf

    tech Created Sat, 06 Jun 2026 19:11:38 +0000
  • 結論

    元々Windowsを使っていましたが、最近は仕事でMacを使うようになりました。 データベースのクエリを書くのに Macの「メモ」機能を使ったところ、Macの「スマート引用符」によりデータを挿入できない状況にハマりました。 もしクォーテーションに変更を加えたくないのであれば、この設定をOFFにする必要があります。

    実際

    データを挿入する際に次のようなエラーに遭遇しました。

    MariaDB [test]> insert into my_items (item_name ) values(‘apple’ ); 
    ERROR 1054 (42S22): Unknown column '‘apple’' in 'VALUES'
    

    データ挿入先のテーブルを作成したクエリは次のとおりです。

    MariaDB [test]> create table my_items ( 
        -> id MEDIUMINT NOT NULL auto_increment, 
        -> item_name_kana char(30) not null,
        -> primary key (id)
        -> ); 
    Query OK, 0 rows affected (0.020 sec)
    

    なぜ単純な文字列を挿入できないのかがわからず、だいぶ時間を取りました。

    理由

    その後分かったのは、Macには「スマート引用符」という機能があり、「まっすぐな引用符をカールした引用符に自動的に置き換え」てくれるそうです。

    お分かりになるでしょうか…

    変換前:'apple'
    
    変換後:‘apple’
    

    つまり、コマンドがシングルクォーテーションを認識できないために文字列を挿入できなかったというわけです。

    このスマート引用符はデフォルトでONになっているため、手動でOFFにすることが可能です。

    Macのクォート自動変換を無効にする

    Windowsの「メモ帳」ではそのような変換がないので、同じつもりでいたら落とし穴がありました😂

    皆さんもご注意くださいませ。

    tech Created Fri, 29 May 2026 16:40:04 +0000
  • こんにちは!😄

    先日、フランスの市民試験を受験し合格することができました 🎉🎉🎉

    私の経験をこれから受験される方にお役立てできれば幸いです。

    注:本内容は個人の経験をベースにしています。正確な情報については政府が提示するウェブサイトでご確認ください。

    french Created Sat, 11 Apr 2026 19:38:49 +0000
  • 記事:ChatGPTは試験的に、アメリカにて無料ユーザーに対し広告を搭載を開始します。

    french tech Created Sun, 18 Jan 2026 10:52:06 +0000
  • 記事:SNSで注目される、フランス外交部のXアカウント’French Response’とは?

    french Created Fri, 16 Jan 2026 09:56:56 +0000
  • 記事:Le français : plus de mille ans d’histoire(フランス語、その千年以上の歴史)をご紹介します。

    french Created Thu, 15 Jan 2026 09:11:42 +0000
  • Bayeux(バイヨー)のタピスリーが、イギリスでの展示に向けて準備中です。

    タピスリーは非常に傷つきやすいので厳重な注意が必要で、最大の懸念は輸送時の振動です。

    french Created Wed, 14 Jan 2026 08:16:36 +0000
Next