PHPのtrimの挙動を勘違いしていた

こんにちは、エンジニアのたべたつです。

先日、とある実装を行っていたときに文字列を固定で削除したかったのでtrim関数を使ったのですが、思っていた挙動と違った結果になったためドキュメントを改めて読んでみると新しい発見がたくさんありました。

突然ですがクイズです

以下の結果はどのようになるでしょうか。

echo ltrim('PHPengineer', 'PHP');

echo ltrim('PHPengineer', 'PH');

echo rtrim('category_tag/age', '/age');
続きを読む

Git diffのタブ幅を設定する方法

こんにちは、CTOの山岡(@hiro_y)です。

(諸事情あって)インデントにタブとスペースが入り交じったPHPファイルを編集していて、git diffのデフォルトのタブ幅が8であることに気付きました。タブ幅は4として表示したいところ。

        public function foo()  // ここもタブインデント
        {  // ここもタブインデント
-               echo "ここはタブでインデントされているところ\n";
+        echo "ここはスペース4文字分でインデントされているところ\n";

ファイル内、もしくはプロジェクト全体のインデントのルールを統一して適用すればよいだけなのですが、一旦とりあえずdiffを見やすくしたかったので、Gitのcore.pagerの設定を変えて見やすいようにしました。

続きを読む

それでもオフラインのカンファレンスに行く理由

こんにちは、CTOの山岡(@hiro_y)です。

新型コロナウイルスの感染拡大に伴って、ここ数年、Webエンジニアリング系の勉強会やカンファレンスがオンラインで開催されることが増えました。

例えば毎年開催されているPHPカンファレンスの場合、2020年12月に開催されたPHPカンファレンス2020は、開催21年目にして初めてのオンライン開催となりました。翌2021年10月に開催されたPHPカンファレンス2021も、同様にオンライン開催となり、YouTube Liveを活用した配信となりました。

オンラインならではのメリットはいくつかあります。まず、移動が必要ない(自宅からでも参加できる)ので時間が有効に使えること。そして日本全国、あるいは世界のどこからでも時間を合わせれば気軽に参加できること、です。

しかし当然、デメリットもあります。いわゆる「カンファレンスの廊下」問題です。勉強会やカンファレンスは、もちろん発表を見たり聞いたりして学びを深める場です。しかし機能はそれだけではありません。実際にいろいろな人と会って話をし、コミュニケーションを交わすことでお互いに知見を得たり、刺激を得られることも大きな効用なのでした。

続きを読む

一時的にサイトページを見せたくないときのお手軽な方法(Nginx、AWS)

こんにちは、エンジニアの小野寺です。

この記事ではサイトのメンテナンスなどで一時的にサイトを表示させたくないときのお手軽な方法をまとめました。 Nginx、AWSでサクッと対応できます。

Nginxでリダイレクト設定する

Nginxではnginx.confファイルにリダイレクトの記述をするだけでかんたんにサイトページを見せないようにできます。

例えばhttps://fuga.comのアクセスをすべてhttps://hoge.comにリダイレクトしたい場合はnginx.confに以下のように記述します。

rewrite ^/(.*) https://hoge.com/ redirect; 

この一文でhttps://fuga.comのアクセスはすべてhttps://hoge.comへリダイレクトします。とてもかんたんです。

※sudo nginx -s reloadで再起動を忘れずに。

せっかくなのでNginxで条件付きリダイレクトする方法も紹介したいと思います。

ディレクトリに応じたリダイレクト

もしかしたら一部のディレクトリはリダイレクトあり、他ディレクトリはリダイレクトなし、としたい場合があるかもしれません。そんな時は以下のように書きます。

if ($request_uri ~ ^/pages){
    rewrite ^/(.*) https://hoge.com/ redirect;
}

このように書けば、https://fuga.com/pages/https://hoge.com/にリダイレクトしますが、他のディレクトリはリダイレクトしません。

IPアドレスに応じたリダイレクト

もしかしたら特定のIPアドレスはリダイレクトあり、それ以外はリダイレクトなし、としたい場合があるかもしれません。そんな時は以下のように書きます。

if ($remote_addr =  xxx.xxx.xxx.xxx) {
   rewrite ^/(.*) https://hoge.com/ redirect;
}

xxx.xxx.xxx.xxxからhttps://fuga.comへのアクセスはhttps://hoge.com/にリダイレクトしますが、それ以外はリダイレクトしません。

このような感じで条件に応じた柔軟なリダイレクト設定も可能です。

ちなみにですが、Nginxは1つのif文に複数条件が設定できません。

if ($request_uri !~ ^/pages && $request_uri !~ ^/news){
    rewrite ^/(.*) https://hoge.com/ redirect;
}

みたいな書き方はできないので、複数条件を設定したい場合は1つずつif文を記述しましょう。

ALB(AWS)でリスナールールを使う

ALBを使っている場合はリスナールールで対応する方法があります。リスナールールには任意レスポンスを優先的にかえす設定ができます。

対象のALBを選択すると、リスナータブがあります。 リスナータブには登録済みのリスナールールが表示されているので、ルール項目のルールの表示/編集を押します。

ALBリスナー

条件を設定する項目が出てきます。 今回はHTMLページを表示するようにしました。

すべてのページを対象としたので、IF項目:*、THEN項目にレスポンスコード:503、Content-Type:text/html、レスポンス本文:表示したいHTMLを書いて保存します。 これでhttps://fuga.com/にアクセスすると、レスポンス本文に書いたHTMLが優先的に表示されるようになります。

ルールの設定

以上、サイトを一時的に見せたくないときのお手軽な方法でした。 サイトメンテナンスの際に活用してみてください。

弊社ではインフラからアプリケーション開発まで経験できます。リモートワークも用意しておりますのでぜひエンジニアさんのご応募をお待ちしています。

見えないViewの実装忘れを防ぐ

こんにちは。エンジニアのたべたつです。

弊社では開発のほとんどでLaravelを使用しています。LaravelはデフォルトではテンプレートはBladeが使われます。

Bladeでは以下のようにレイアウトで枠組みを作成して、個別の画面ではextendsディレクティブを用いて内容を流し込んで使うことができます

続きを読む

解明!password_hash関数で生成される文字列の正体

こんにちは、CTOの山岡(@hiro_y)です。

(この記事は、来る2022年4月9日から開催されるPHPerKaigi 2022登壇応募したものの選出されなかった題材をブログに書くことで供養しようという試みです。)

Webシステムでパスワードを保存するとき、そのままの値(平文)で保存してはいけません。データベースの中身が何かしらのインシデントで漏洩してしまった場合、パスワードの内容が明らかになってしまうからです(漏洩の時点でもっと酷い事態になっていそうではありますが…)。では、どのような対策を行えばよいのでしょうか。

パスワードはハッシュ化しよう

一つ目の対策は、パスワードを秘密鍵を使って暗号化、保存する方法です。

その場合、それぞれの暗号化に共通の秘密鍵を使わないことが大切です。また、初期化ベクトル(IV)としてそれぞれ異なるものを用意、ブロック暗号化モードを利用して暗号化した結果が同じパスワードでも異なるように工夫する必要があります。パスワードの検証をするときは、暗号化されたパスワードを復号して比較することになります。

…こう書いているだけでちょっと面倒ですね。実際、正しい手順で暗号化されていないばかりに不正アクセスからの漏洩事故が過去に何度か発生しています。あとは単純に、昨今簡単に手に入るようになったマシンパワーで解読してしまえるという話もあります。

そこで、現在は二つ目の方法、ソルトと呼ばれる文字列を付けてハッシュ化を行い、ストレッチングを行うことでより強い仕組みを作る手法が主流になってきています。パスワードに適当な文字列(ソルトと呼ばれる)を付けてハッシュ化した上で、できあがった文字列をさらに何度も繰り返しハッシュ化する(ストレッチングと呼ばれる)という仕組みです。検証の際には、同じ方式でハッシュ化を行い、保存しておいたハッシュ値と同値になることを確かめます。

続きを読む

TypeScriptのUtilityTypesと使い方

こんにちは。エンジニアのujitaです。

弊社の「MediaDX」というサービスでは独自のCMSであるOpen Media Suite(以下OMS)を提供しています。 OMSのフロントエンドはTypeScriptを使用して開発しています。

開発を続けていくと、似たような型定義が増えていくことがあると思います。 そのような場合にTypeScriptが提供しているUtilityTypesを利用すると、既存の型から別の型に変換することができます。 今回はOMSで使っているUtilityTypesと使い方についてご紹介します。

続きを読む