20210731のPHPに関する記事は5件です。

PHPを使ったサーバ証明書周り処理のメモ

職場で管理しているサーバ証明書の関連手続きを効率化するということで、久々のPHPで管理ツールを作りまして。 なかなか1ヶ所にまとめた情報がなかったので、その時のメモ。 1.秘密鍵文字列の取得 $opt = array( "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA ); $pkey = openssl_pkey_new($opt); openssl_pkey_export($pkey, $private_key); // $private_keyに格納される 2.CSR文字列の取得 1.で取得した秘密鍵のリソース"$pkey"を使います。 $dn = array( "countryName" => $country, "stateOrProvinceName" => $state_of_province, "localityName" => $locality, "organizationName" => $organizational_name, "organizationalUnitName => $organizational_unit, "commonName" => $common_name, "emailAddress" => "" ); $csr = openssl_csr_new($dn, $pkey); openssl_csr_export($csr, $csrout, true); // $csroutに格納される 3.サーバ証明書と中間証明書との整合性チェック $hash1 = shell_exec("openssl x509 -issuer_hash -noout -in " . [サーバ証明書ファイルパス]); $hash2 = shell_exec("openssl x509 -subject_hash -noout -in " . [中間証明書ファイルパス]); で、hash1 = hash2であればOK。 4.サーバ証明書文字列のパース $ssl = openssl_x509_parse([サーバ証明書データ]); 上記の$sslには連想配列が返りますが、具体的な内容についてはPHP公式のマニュアルにも明記されていません。 https://www.php.net/manual/ja/function.openssl-x509-parse.php ちなみに、筆者の今の環境(PHP7.3.7/OpenSSL 1.0.2k)では下記の通りです。 [name] => [subject] 主体者情報 [C] => 国 [ST] => 都道府県 [L] => 市区町村 [O} => 組織名 [OU] => 部門名 [CN] => サーバ名:ワイルドカード証明書の時は"*.hoge.com"などとなる [hash] [issuer] 発行者情報 [C] => 国 [O] => 組織名 [CN] => [version] => [serialNumber] => シリアルNo [serialNumberHex] => [validFrom] => [validTo] => [validFrom_time_t] => 有効期限開始日 [validTo_time_t] => 有効期限終了日 [signatureTypeSN] => [signatureTypeLN] => [signatureTypeNID] => [purpases] [1] [0] => [1] => [2] => [2] [0] => [1] => [2] => [3] [0] => [1] => [2] => [4] [0] => [1] => [2] => [5] [0] => [1] => [2] => [6] [0] => [1] => [2] => [7] [0] => [1] => [2] => [8] [0] => [1] => [2] => [9] [0] => [1] => [2] => [extensions] [authorityKeyIdentifier] => [subjectKeyIdentifier] => [subjectAltName] => オブジェクト代替名:"DNS:..." [keyUsage] => [extendedKeyUsage] => [csrDistributionPoints] => [certificatePolicies] => [authorityInfoAccess] => [basicConstraints] => [ct_precert_scts] => 5.(おまけ)証明書をファイルでダウンロード header("Content-type: application/octet-stream") header("Content-length: " . filesize([証明書ファイル名]); header("Content-Disposition: attachment: filename=" . [ダウンロードファイル名]); // ファイル出力 readfile([証明書ファイル名]); unlink([証明書ファイル名]); ?> 最終行の"?>"の後に、改行含め余計な文字を加えると、ダウンロードファイルにゴミが混じるので要注意です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[laravel 8.52]shiftとpopの関数が複数のアイテムを返せるように!

概念 今までlaravelのコレクションのpop()とshift()が一つのアイテムだけを削除し、返すことでしたが、Laravel8.52に含まれているこのPRでは、引数が受け取れるようになって、複数のアイテムを返すようになりました。 使い方 基本 返したいレコード数をpop()かshift()に引数として渡すと、そのレコード数がコレクションから削除され、新しいコレクションとして返されます。いずれの関数のデフォルト引数値が1ですので、引数を定義しない場合には、今までと同じように1アイテムがコレクションから削除され、返されます。 $collect = collect([ 'Craig', 'is', 'very', 'handsome!' ]); // 最後の二つのアイテムを削除し、新しいコレクションとして返す $collect->pop(2); // collect(['handsome!', 'very']); $collect->all(); // ['Craig', is]; // 最後のアイテムを削除し、返す $collect->pop(); // 'is' shift()の関数はpop()と違って「最後」のではなく、「最初」のアイテムを処理する動きで、実行の仕方も同じなので、ここで省略します。 注意 コレクションのアイテム数より大きいな引数を渡すと、返されるコレクションのサイズが必ず渡された値になるので、存在しないアイテムの分がNULLとして返されたコレクションに入れるので気を付ける必要があります。 // 4アイテムのコレクションを作る $collect = collect([ 'Craig', 'is', 'very', 'handsome!' ]); // 最初の6つのアイテムを削除し、返す $collect->shift(6); // 存在しないアイテムの分がNULLとして入ってしまします // collect(['Craig', 'is', 'very', 'handsome!', NULL, NULL]) 参照 https://github.com/laravel/framework/pull/38093 https://laravel.com/docs/8.x/collections#method-pop https://laravel.com/docs/8.x/collections#method-shift
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Aush認証のリンクで404エラー

LaravelでAuth認証を導入した際に、ログインページへのリンクで404エラーになってしまいました。 解決までの道筋を載せます。 環境 MAMP OS:macOS Laravel:8.51.0 PHP:7.4.12 MySQL:5.7.32 エラー ログインしていたら「設定」「ログアウト」のボタンを表示、もしログインしていない場合は「ログイン」と「新規登録」に飛ぶ。 ログインは"/login"というアドレスで、新規登録は"/register"というアドレスに飛ぶが、このように表記しても404エラーになる。 index.blade.php @if (Auth::check()) <p>USER: {{$user->name}}</p> <a class="btn btn-primary" href="#" role="button">設定</a> <a class="btn btn-primary" href="#" role="button">ログアウト</a> @else <p>ログインしていません</p> <a class="btn btn-primary" href="/login" role="button">ログイン</a> <a class="btn btn-primary" href="/register" role="button">新規登録</a> @endif この画面からボタンを押すと ※作成中のためデザインがしょぼくてすみません ログイン画面での404エラー 新規登録画面での404エラー アドレス部分を見てみると、遷移後はアドレスが短縮されている。 ちなみにhref="/login"を、href="study_stamp/public/login"に変更してみると、アドレス部分は「localhost:8888/study_stamp/public/study_stamp/public/login/」になってしまった。 どうやら指定アドレスで公開する設定をしていなかったことが原因だということが分かった。 指定アドレスで公開するとは? 例えばMAMPを利用すると、Webサーバーの公開ディレクトリが「htdocs」になる。 「htdocs」内にファイルを配置すればWeb上に公開される。 今回の件だと「htdocs」フォルダに「study_stamp」というフォルダを入れているので、アクセスする際には。 http://localhost:8888/study_stamp/public/ にアクセスする必要があった。 しかし、このアドレスの/study_stamp/public/部分を無くしたい。 その際にするのが今回の指定アドレスで公開するという設定になる。 指定アドレスで公開するためには 今回はMAMPを利用しているので、MAMPでの設定方法になります。 MAMPのフォルダ内に、「conf」フォルダがある。 その中の「apache」フォルダ内のhttpd.confファイルを開く。 以下の記載の場所を探す httpd.conf # Virtual hosts # Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf Include前の#を外し、記述を追加する。 httpd.conf # Virtual hosts Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf <VirtualHost *:8888> DocumentRoot "/Applications/MAMP/htdocs/study_stamp/public" ErrorLog "logs/laravel-error_log" CustomLog "logs/laravel-access_log" common </VirtualHost> DocumentRootは自分のプロジェクト名で書く。 保存して再起動すると、無事指定アドレスで公開することができました。 無事ログイン画面に遷移することもできました。 この設定は最初にやらなければいけなかったことですが、それを忘れたまま進めてしまったためでたエラーでした。 もし同じ状況の方がいれば、少しでも参考になればと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

高卒ド文系女子がポートフォリオ作りました。

Web制作の勉強をするにあたり、制作が一番の学習と聞き、ひとまず自身のポートフォリオサイトを作ってみました。 後々の備忘録として、記録します。 高卒ド文系女子 Web制作初心者が作ったポートフォリオサイト https://www.hironaoemi.com/ 女子っていうかもう子持ちのアラサーなんですけど。ごめんなさい(笑) 設計 まずはコンテンツの中身をどうするか。 いろんな方のポートフォリオサイトを参考にして、 プロフィール・スキル・成果物(今後更新)・コンタクトフォーム を、入れようと思いました。 あとはデザインをざっくり決めてコーディングにかかります。 とりあえず、ペラ1で。ページ内リンクにしていこうかな。 制作 ローカルでの開発環境はMAMPを使用しました。 外観はブートストラップを利用して、作っていきます。 普段はSCSSで作っていましたがブートストラップも触ってみようということで。 クラス指定をいれていくだけで、レスポンシブ対応のデザインができて便利でした。 おもしろいな、Bootstrap。 スキルは画像一枚でパッと伝わればいいなと思い、イラストレーターで自作してみました。 成果物は今のところ掲載できるものがありませんが、 SNS運用を頑張っているので、自身のInstagramを埋め込んどきます。 まずはインスタグラムアカウントをFacebook連携・ページを作成し、アクセストークンをそこから引っ張ってきて、phpにて埋め込みます。 以下参考URL https://toriton.link/coding/insta_embed/ 網羅されており、非常にわかりやすかったです。m(_ _)m 最後に一番時間がかかったコンタクトフォーム。 はじめはphpで確認画面→送信完了画面としようとしましたが、そうすると、リロードの度に最下部までスクロールされるのがチラつく。 ここで調べれば調べるほどいろんな方法がでてきて、設計の甘さを痛感しました。 はじめにしっかり設計をするべきですね。 たくさん遠回りした結果、jQueryを使用して、ページを更新せずに(AJAXを使用して)フォームを処理し、エラーを示し、成功メッセージを表示します。 送信はphpのmb_send_mailを使い入力者への確認メールと、私に届くメール2通で処理しました。 送信メールは、サーバーのメールアドレスを設定します。 参考URL https://www.digitalocean.com/community/tutorials/submitting-ajax-forms-with-jquery https://techplay.jp/column/550 デプロイ エックスサーバーを持っていたんですが、乗り換えてみたくて、ConoHa WING契約してみました。 動作確認できるまでは、ベーシック認証をかけて開発作業を進めます。 サーバーで設定しても良いし、htaccesで記述しても。 今回は、後者で行いました。 参考URL https://www.itra.co.jp/webmedia/basic_authentication.html htmlで作ったページをWordpress化。 header・Index.php・footerにわけて、パスを通します。ややこしい。し、これやらなくてもよかったな(笑) 多分私のページをワードプレス化は無意味だったけど、今後きっと何かの役に立つだろう。。 参考URL https://b-risk.jp/blog/2020/05/howto-coding-for-wp/ https://haniwaman.com/static-to-wordpress/ https://code-step.com/wp-html-menu/ とりあえず形にはなったかな、、 あとは細かいところのレスポンシブ化と ゆっくりアップデートしていきながら運用していければと思います!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vscodeでdockerに接続してxdebugでphpデバッグ

概要 VSCodeからdockerコンテナに接続してxdebugでphpデバッグする方法。 できてみたら簡単だったんだけど道を間違えて大はまりしたので残しておきます。 対象環境 VSCode on Windows WSL2 + Docker Desktop、またはvagrant + docker 前提 dockerコンテナでphpプログラムが動いてること phpにxdebugが入ってること もしphpのコンテナにxdebugが入ってない場合は、Dockerfileに RUN pecl install xdebug && docker-php-ext-enable xdebug とか付け足せばいけると思います。 予防線 VSCode初心者なので変な事してるかもしれません。 手順 1. php.iniの設定 概要 xdebugの設定をします。 vscodeでコンテナに接続してのデバッグなので、client_hostは127.0.0.1です。 手順 コンテナ内のphp.iniの [xdebug] セクションを、以下のようにします。 php.ini [xdebug] xdebug.client_host=127.0.0.1 xdebug.client_port=9003 xdebug.log=/tmp/xdebug.log xdebug.log_level=7 xdebug.mode=debug xdebug.start_with_request=yes xdebug.start_upon_error=yes xdebug.trigger_value= この通りでないとだめなのは、 client_host , client_port , mode , start_with_request の4つです。 ほかは変えても大丈夫なはずです。 2. VSCodeを起動する 起動してください。 3. dockerを動かしている環境への接続(vagrantの場合のみ必要) 概要 vscodeを、dockerコンテナを検出できる状態にします。 具体的には、dockerの動いている環境に接続します。 不要な場合 WSL + Docker Desktop の場合は、VSCodeを起動した時点でコンテナを検出可能なので、ここは飛ばしてください。 手順 a. vagrantへ接続するためのssh設定 c:\users\[username]\.ssh\config に、vagrantにssh接続するための設定を書きます。 .ssh/config Host vagrant HostName 127.0.0.1 Port 2222 IdentityFile c:\users\kumanobori\.vagrant.d\insecure_private_key User vagrant 補足:ssh接続情報は、 vagrant ssh-config で見ることができます。 ssh-config c:\dev\vm\dev ssh-config Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile C:/Users/kumanobori/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL 補足:接続に失敗する場合はだいたい鍵絡みという印象でした。パスの書き方がおかしいとか、権限が自分以外にあるとか。VSCodeにログが出ているので丹念に調べましょう。。。 b. 拡張機能 Remote - SSH のインストール 拡張機能 Remote - SSH が入ってない場合は入れます。 c. vagrantへの接続 コマンドパレットで >remote-ssh: connect current window to host を実行します。 少し待つと、前項で作成した .ssh\config の設定名が選択肢に出てくるので、それをクリックします。 少し待つと、接続先のOSを聞かれるので、Linuxをクリックします。 初回接続の場合はfingerprintの確認が出るので、continueをクリックします。 接続が成功したら、VSCodeの画面の左下に接続先が表示されます。 エクスプローラの「フォルダーを開く」をクリックします。 Dockerfileまたはdocker-compose.ymlの格納されているディレクトリを入力し、開きます。 (補足:これをしておかないと、次工程の Attach to Running Container がうまくいきません) 4. コンテナへの接続 概要 vscodeを、コンテナに接続します。 手順 a. 拡張機能 Remote - Containers のインストール 拡張機能 Remote - Containers が入ってない場合は入れます。 b. コンテナへの接続 コマンドパレットで Remote-Containers: Attach to Running Container を実行します。 少し待つと、稼働中コンテナが選択肢に出てくるので、phpコンテナをクリックします。 コンテナが新しいウィンドウで開きます。前のウィンドウは消しても問題ないです。 エクスプローラの「フォルダーを追加」をクリックします。 コンテナ内の、プロジェクトルートとなるべきディレクトリを指定します。 ファイルが表示されます。 5. コンテナの設定 概要 コンテナ内でデバッグ実行のための設定をします。 a. コンテナの拡張機能設定 コンテナに拡張機能 PHP Debug が入っていない場合は入れます。 b. コンテナのデバッグ設定 デバッグウィンドウの、「launch.jsonファイルを作成します」をクリックします。 言語を聞かれます。「PHP」にします。 (補足:前工程でPHPデバッガを入れておかないと、ここでPHPが選択肢に出てきません。) launch.json が生成されます。 jsonの configurations 内に Listen for Xdebug, Launch currently open script, Launch Build-in web server の3つがあります。使うのは Listen for Xdebug だけなので、あとの2つは消します。 jsonにパスマッピング設定を追加します。${workspaceRoot} は、vscodeのエクスプローラーで開いているフォルダです。 Listen for Xdebug をクリックします。これでデバッグ開始です。 どこか適当なところにブレークポイントを置いてみて、止まれば成功です。 あとがき vagrant経由のやり方は、ほかのリモートサーバに接続する場合にも使えそうです。 入れるデバッガとlaunch.jsonのところを変えれば、他の言語もいけそうな気がしてます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む