BLOGTIMES
» ArchiveList (Tag for "php" )
«Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
2020/11/05

php + MariaDB で Malformed communication packet というエラーが出るときは

mysql  php  centos7 

今日は朝から php + MariaDB の環境で以下のエラーが発生して困ってしまいました。

500 SQLSTATE[HY000]: General error: 1835 Malformed communication packet (SQL: select * from ・・・・)

Malformed communication packet というエラーは初めて見たかもしれません。

MariaDB をダウングレードして暫定対処

原因としては MariaDB のバージョンアップに起因するようなので、以下のように MariaDB をダウングレードして暫定対象しました。

systemctl stop mariadb yum downgrade MariaDB-server MariaDB-common MariaDB-shared MariaDB-client MariaDB-compat MariaDB-devel --skip-broken yum --showduplicates search MariaDB-* yum install MariaDB-server-10.4.15-1.el7.centos.x86_64 MariaDB-client-10.4.15-1.el7.centos.x86_64 systemctl status mariadb systemctl enable mariadb

同じ話題が Stack Overflow にも

以下の Stack Overflow のエントリににもあるように、意外と同じところでハマった人は多いようです。
これを見ると PHP 7.3 では発生しないという話も出ているので PHP 7.1 と最新版の Maria DB の問題みたいですね。


    at 12:58 |
    2019/10/27

    Laravel でパスワードを忘れたときの再設定方法

    php  laravel 

    Laravel の Auth を使うとパスワードは DB にハッシュ化された状態で格納されます。
    これはこれでセキュリティのために必要な挙動なので、これに文句を言うつもりはありません。

    しかしながら、例えば管理者用のパスワードを忘れてしまい、DBを強制的に上書きしてログインしたいような場合、このハッシュがどのように作られているのか分からないとお手上げです。今日はまさにそんな状態に陥ってしまったので、解決方法を調べてみました。結論から言うと、以下のようにインタラクティブな php (artisan の tinker)を起動して、プログラムで DB を書き換えることができます

    $ php artisan tinker Psy Shell v0.9.9 (PHP 7.1.33 ― cli) by Justin Hileman >>> \App\User::where('UserId','1')->update(['password' => strtoupper(\Hash::make('hoge'))])

    これだと一撃で実行できるので、楽ちんです。

    [Laravel でパスワードを忘れたときの再設定方法 の続きを読む]

      at 14:11 |
      2019/05/09

      PHP の内容を AST で解析する

      php  softwareengineering  tutorial 

      PHP のファイルが静的解析したくなったので、ソースから AST を得る方法を調べてみました。
      以前、Eclipse の ASTParser を使う話を書いたことがありましたが、それの PHP 版になります。

      今回の作業にあたって、以下のスライドがとても参考になりました。

      PHP は 7 になってから内部的に AST が利用されているため、以前よりも AST を得るのは簡単になっています。
      既に以下のような extension が提供されているので、いずれかをインストールすれば大丈夫です。

      今回はマニュアルが充実している前者の nikic/php-ast を入れてみることにしました。
      以下、構築メモになります。

      [PHP の内容を AST で解析する の続きを読む]

        at 23:31 |
        2016/12/07

        PHP 7.1 リリース

        php 

        PHP 7.1 がリリースされました*1
        昨年 12 月の PHP 7.0 リリース以来の大型バージョンアップとなります。

        詳細な変更点については PHP: PHP 7 ChangeLog に記載がありますが、型まわりでいろいろと改良が加わっているようです。

        「PHP 7.1」リリース、型関連の機能を強化 | OSDN Magazine

        PHP開発チームは12月1日、プログラミング言語の最新版「PHP 7.1.0」をリリースした。Nullable型が導入されたほか、関数の戻り値としてvoidを指定できるようになるなど、多数の新機能が加わっている。

        at 23:11 |
        2016/11/12

        MySQL で implode() のようなことがしたい

        mysql  php 

        MySQL (MariaDB)で PHP で言うところの implode() をやりたいと思っていろいろ調べてみたら、GROUP_CONCAT()*1 を使えば一撃で実現できることが分かったのでメモ。

        例えば以下のようなテーブルがあったときに GROUP_CONCAT() を使うとこんな感じになります。
        GROUP_CONCAT() には DISTINCT や ORDER BY が効くところもポイントです。

        SELECT * FROM foo; +---+ | a | +---+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +---+
        SELECT GROUP_CONCAT(a ORDER BY a DESC SEPARATOR ',') AS aaaaa FROM foo; +-------------+ | aaaaa | +-------------+ | 6,5,4,3,2,1 | +-------------+

        カンマ区切りのデータの検索は FIND_IN_SET() で

        カンマ区切りになった1つのフィールドから、一致するデータの個数を返してくれるのが FIND_IN_SET()*2

        真っ当な正規化を行っていればこんな関数のお世話になる機会はないはずですが、テーブル設計の時に「どうせ検索条件としてこのフィールドは使わないはずだから、非正規形のままカンマ区切りでフィールドにいれちゃえ」なんていう無精をしたりするとお世話になることがあります。真っ当な解決方法としてはテーブル構造を正規化することですが、それがイヤな場合はFULLTEXT インデックスを使ったりしていましたが、一番お手軽に解決できるのが FIND_IN_SET() です。パフォーマンス的にはアレかもしれないので注意は必要ですけどね。

        実際の例としては以下のような感じになります。FIND_IN_SET() の第1引数は検索する文字列第2引数はカンマ区切りの文字列で、返り値は見つかった個数(見つからないときは 0 )になります。GROUP_CONCAT() と違ってセパレーターが指定できないので、元になる文字列の構造には注意が必要です。

        SELECT FIND_IN_SET('2','1,2,3,2,4,5,6') AS result; +--------+ | result | +--------+ | 2 | +--------+

        at 13:46 |
        2016/11/04

        Cookie を JavaScript から取得させない

        malware  javascript  php  java  chrome  rfc 

        Chrome の機能拡張にマルウェアが仕込まれていて騒ぎになっているようです。

        その中で紹介されていた Cookie の httponly という属性*1が興味深かったのでメモ。

        Cookie の仕様とセキュリティ

        httponly 属性をつけると、そのクッキーは Cookie ヘッダ以外から読み取ることができなくなりなり、JavaScript から参照できなくなります。 Secureの反対の意味、 http でしか送信されないCookieという意味では ない ので気をつけて下さい。
        このオプションはXSS脆弱性があった場合の被害を小さくします。 XSS脆弱性によって攻撃者が任意のJavaScriptが実行できてしまうと、 document.cookie の値を読んで Session ID などのログイン情報などを盗み見れてしまう可能性がありますが、 HttpOnly属性をつけておくとクッキーが XSS 脆弱性によって読み取られることがなくなります。

        アプリを書くときに Cookie の Secure 属性は意識してつけていたものの、HttpOnly は Secure の逆かと勘違いしていて、完全にスルーしていました。なかなかの大失態です。

        Java の場合には Servlet 3.0 から HttpOnly を指定するためのメソッド javax.servlet.http.Cookie#setHttpOnly()*2があります。また、PHP の場合には PHP 5.2 以降であれば setcookie()*3の第7引数を使って設定することができます。


        at 21:22 |
        2016/09/06

        続・IFTTT を使って Twitter アイコンを日替わりにする

        php  twitter  ifttt 

        以前にIFTTT を使って Twitter アイコンを日替わりにするというのをやりましたが、今日は日替わりかつランダムにアイコンが変わるようにしてみたいと思います。

        IFTTT だけではランダムにアイコンを変えることができないので、以下のような PHP のスクリプトを用意しました。これを PHP が使えるウェブサーバの適当なディレクトリにアップロードし、同じディレクトリに画像ファイルを好きなだけを入れておきます。設定が終わったら URL をブラウザで開くと、画像がランダムに表示されるのが分かると思います。(http://example.jp/path/to/randomicon.php の部分は各自の環境に読み替えてください。

        randomicon.php

        <?php $imgdir = dirname(__FILE__); $imgs = glob($imgdir . '/*.{jpg,gif,png}', GLOB_BRACE); $img = $imgs[array_rand($imgs)]; $mime_type = getimagesize($img); $mime_type = $mime_type['mime']; header('Content-type: '.$mime_type); echo file_get_contents($img);

        あとは画像のような感じで IFTTT の設定欄にアップロードした php へのパスを仕込めば OK。
        IFTTT レシピの編集 - 続・IFTTT を使って Twitter アイコンを日替わりにする


          at 23:44 |
          2016/04/21

          プログラミングで美少女を集めるゲーム「コードガールこれくしょん」公開

          programming  php  ruby  python 
          コードガールこれくしょん - プログラミングで美少女を集めるゲーム「コードガールこれくしょん」公開

          かんこれに始まって、「○○これくしょん」というゲームがあちこちで登場していますが、「コードガールこれくしょん」というプログラミングで美少女を集めるという一風変わったゲームが登場しています。

          プログラミング学習ゲーム「コードガールこれくしょん」公開! - GAME Watch

          プレーヤーは、最初は簡単な問題から、徐々にレベルが上がっていくクエスト形式でストーリーを進行させていく。プログラミング言語はPHP、Rubyに対応しており、6月にはPythonへの対応も予定されている。

          ソフトウェアを本職にしている身としては問題の難易度がどんな感じなのかちょっと気になりますね。。。。


            at 19:33 |
            2016/03/11

            PHP から Apache のログファイルにログを書く

            php 

            PHP でログ出力を行うためには例えば log4php などのライブラリを使うという手もありますが、mod_php を使っている場合には Apache の CustomLog を使って Apache にログ出力をしてもらうという手が使えることが分かったのでメモ。

            まず、httpd.conf や <VirtualHost> 定義の中に以下のような CustomLog の定義を作成しておきます。

            LogFormat "%h %l %u %t \"%r\" %>s %b %{foo}e" foo_log CustomLog logs/foo_log foo_log env=foo

            今回は出力に foo という環境変数を使うので LogFormat に追加されているのは %{foo}e だけですが、これらの定義は必要に応じて追加してください。

            あとは PHP 側から apache_setenv() を使って該当の環境変数をセットしてやれば OK。

            apache_setenv("foo", "[INFO] hoge");

            上記の場合はこんな感じでログ出力がされます。

            192.168.0.1 - - [11/Mar/2016:12:50:36 +0900] "GET /example/app/ HTTP/1.1" 200 - [INFO] hoge

              at 16:43 |
              2016/03/10

              PHP から Active Directory 認証を使う

              windowsserver  php  ldap 

              PHP から AD (Active Directory) を認証データベースとして使うスクリプトを作ってみました。
              SSO 関連の実装となると、とにかく LDAP は避けて通れないですからね。

              PHP で LDAP を使えるようにする

              まず基本的な事項ですが、AD の実体は LDAP なので、PHP からは LDAP を使ってアクセスすることになります。PHP の LDAP サポートはデフォルトでは有効になっていないので、CentOS や RHEL の場合には yum でモジュールを追加したり、ソースからインストールしている場合は--with-ldap[=DIR] をつけてリコンパイルしてやる必要があります。

              yum install php-ldap -y

              Base DN を調べておく

              サンプルを動作させるために必要になるので、AD サーバ上で Base DN (Distinguished Name) を調べておきます。
              LDAP に馴染みがないとこれが何なのか分かりづらいかもしれませんが、ツリー状のデータ構造を持つ LDAP の検索の起点になるのが BaseDN です。

              例えば AD が入っている Windows Server 上でコマンドプロンプトを開いて以下のようなコマンドを打つと hoge ユーザーの DN が表示できます。
              (うまく行かない場合はユーザー名の部分を * にするとユーザーの一覧が表示できるはずです。)

              C:\Windows\System32>dsquery user -upn hoge* "CN=hoge,CN=Users,DC=example,DC=local"

              表示されている文字列はユーザーの DN なので Base DN としてはその末尾の部分 DC=example,DC=local を使います。
              これはかなりシンプルな構成の AD の例ですが、構成等によっては OU= という部分が含まれていたりするはずです。

              [PHP から Active Directory 認証を使う の続きを読む]

                at 19:46 |
                «Prev || 1 · 2 · 3 · 4 · 5 ·... | | Next»
                » ArchiveList (Tag for "php" )