タグ

phpとyohgakiに関するshimookaのブックマーク (30)

  • JavaScript文字列のエスケープ

    これらの中で注目すべきは ‘ と ” と \ です。シングルクォート、ダブルクオートは文字リテラルを作成する為に利用され、\ でエスケープできることです。つまり、文字リテラルの最後に \ が現れると文字列の終端が無くなります。単独で不正なJavaScriptの挿入が可能になる訳ではありませんが、プログラムの構造が破壊される事を意味します。 PHPにはJavaScript文字列用のエスケープ関数が用意されていません。htmlspecialchars()やhtmlentities()で代用している場合も多いと思います。しかし、これらの関数ではJavaScript文字列のエスケープを十分に行う事ができません。 JavaScriptプログラムの構造が破壊される例 <?php $msg1 = 'test string\\'; $msg2 = ');alert(document.cookie); //

    JavaScript文字列のエスケープ
  • PHP 7.3 – yohgaki's blog

    (Last Updated On: 2018年12月2日) PHP 7.3が今月(2018/12)リリース予定です。新機能や機能変更は小振りですが、結構多くの追加/変更があります。ソースコード中のUPGRADINGに変更点は記載されています。ここでは独断と偏見で選んだ重要度が高い追加/変更を紹介します。 ※ PHP 7.3.0 RC6時点のUPGRADINGから紹介します。 記載していない変更の方が多いです。詳しくはリリース版のUPGRADINGを参照してください。 エラー処理の強化 バンドルされているモジュールのエラー処理はお世辞にも理想的と言える処理ではなかったモノがあります。これらのエラー処理が改善されました。エラーの発生の仕方やエラー発生後の動作が異なることになります。これでは困る事になるかも?と思うかも知れませんが、おかしな動作を起こすデータやコード、はそもそも問題の原因です。問

    PHP 7.3 – yohgaki's blog
  • PHPのmt_rand()/rand()問題

    (Last Updated On: 2019年1月29日)PHPのmt_rand()とrand()には状態の初期化/再初期化に問題があります。話しを簡単にするためにrand()をmt_rand()のエイリアスにする提案 https://wiki.php.net/rfc/rng_fixes が適用された状態を前提にMT rand問題として解説します。しかし、基的には古いPHPでrand()を使う場合も同じ(かそれ以上)の問題があります。 そもそもMT randは暗号理論的に安全な乱数生成器ではありません。安全な乱数の取得に使ってはなりませんが、MT rand以前の乱数に比べ予測が困難、ということで不適切な箇所で利用しているケースが散見されます。 結論から言うと、MT randで生成された乱数値は安全ではなく非常に危険1、です。 MT randのシード問題 PHPはMT randを自動的にシ

    PHPのmt_rand()/rand()問題
  • PHPのmt_rand関数が壊れている問題

    (Last Updated On: 2018年8月8日)PHPのmt_rand関数のtwistマクロに一文字タイポがあり、修正されたのですが http://git.php.net/?p=php-src.git;a=commitdiff;h=a0724d30817600540946b41e40f4cfc2a0c30f80 でリバートされてしまいました。 追記 PHP 7.1からMT randのコードが修正されています。ユーザーコード(PHPスクリプト)からはアルゴリズムは選べません。Cモジュールの場合、旧アルゴリズムと修正済アルゴリズムから選択できるようになっています。 この他にもPHPのmt_rand()実装の場合、来MT randは2^19937の状態を取り得るのですが、PHPはたったの2^32の状態でしか初期化できません。つまり、MT randアルゴリズムに較べて2^19902くらい

    PHPのmt_rand関数が壊れている問題
  • PHP7のタイプヒントベストプラクティス

    (Last Updated On: 2018年9月26日)PHP 7から基的なデータ型(整数型、浮動小数点型、配列型)タイプヒントが追加されます。直感的に書くコードと正しいコードには乖離があります。PHP7でタイプヒントを使う場合のベストプラクティスを紹介します。 タイプヒントとタイプヒントの問題点については前回のブログを参照してください。 PHP7タイプヒントの注意点 PHPはWebシステムで利用され、データベースやJSONなどの外部データとのやり取りが必要になります。PHP7のタイプヒントはデータ型変換を伴うので 入力データの形式/表現範囲 PHPデータ型の表現範囲 タイプヒント/キャストの動作 に注意する必要があります 入力データの形式 データベースの場合、入力データは基的に”文字列”になります。データベースのデータ型をPHPなどの言語のデータ型と完全に一致するとは限りません。こ

    PHP7のタイプヒントベストプラクティス
  • PHP7とjson_decodeとjson_encodeの困った仕様 – 数値型データの問題

    (Last Updated On: 2018年8月13日)PHP7からint/float/arrayの基的データ型のタイプヒントが導入されます。タイプヒントには困った問題があります。その問題を更に複雑にするjson_decode関数のデータ型変換問題があります。 JSONデータの数値型データ※が特定の型に変換される問題はPHPのjson_decode関数に限った問題ではなく、JSONを利用する処理系を作る全ての開発者が注意すべき問題です。 ※正確には数値型データと書くより「数値型リテラル」と記述するべきですが、「数値型データ」とします。 大きな数値さえ使わなければ気にしなくても問題にならないですが、json_decodeはJSONの整数/浮動小数点形式データをPHPのint型、float型に自動変換します。 JSON RFCの内容 JSONを定義するRFC 7195によると This s

    PHP7とjson_decodeとjson_encodeの困った仕様 – 数値型データの問題
  • PHP7で追加される整数型、浮動小数点型タイプヒントの問題点

    (Last Updated On: 2018年8月13日)PHP7では整数型、浮動小数点型、配列型のタイプヒントが追加されます。データ型をより厳格に取り扱うようになるのは良い事ですが、データ型を変換してしまうため問題となる場合もあります。 データ型は指定した型に変換すればよい、という単純な物ではありません。私はデータ型を変換しない方のRFCを支持していました。残念ながらこちらのRFCでなく、問題が多い方のRFCが採用されることになりました。 参考 PHP7のタイプヒントの使い方 タイプヒントとは? そもそもタイプヒントを使ったことが無い方も多いと思います。PHPはオブジェクトのクラスを「タイプヒント」として指定することが従来から可能でした。例えば、 function (MyClass $obj) { // Do something } のようにタイプヒントとして”MyClass”を指定し、

    PHP7で追加される整数型、浮動小数点型タイプヒントの問題点
  • PHP 5.6の新機能

    (Last Updated On: 2018年8月13日)PHP Advent Calender 2013、3日目の参加エントリです。前日のPHP の配列を使った手品とその種明かしに続き3日目です。PHPの配列(ハッシュ)のキーはバイナリセーフなので何でも入れられる、ということはあまり知られていないですよね。面白い話だったと思います。 私のネタには面白さはありません。予めご了承ください :-) さて今日のテーマのPHP5.6新機能です。PHPプロジェクトのgitレポジトリでは既にPHP5.6用のブランチが作成されています。PHP 5.6は来春リリース予定です。 大ニュース(?)だったので多くの方はご存知だと思いますが、PHPは毎年新しいマイナーバージョンをリリースします。メンテナンスされるのは2つのバージョンのみです。つまりPHP 5.6がリリースされるとPHP 5.4はEOL(メンテナン

    PHP 5.6の新機能
  • PHP最速フレームワークPhalconのインストール

    Framework / Memory Usage (mean, megabytes per request) [lessis better]Memory Usage(MB)ZendSymfonyYiiLaravelKohanaCodeIgniterFuelPhalcon0.40.81.21.62.0 参考 Phalcon PHPとSails Node.jsのベンチマーク Phalcon 1.3 と 2.0のベンチマーク Phalconモジュールのインストール ここではCentOS/Scientific Linuxでのインストール例を紹介しますが、マニュアルにはWindows/OSXなどのインストール手順も記載されています。PhalconはC言語で記載されているのでPHPがビルドできる環境でなければなりません。つまり、CentOSなどであればgccなどのビルドツール、php-develなどの

    PHP最速フレームワークPhalconのインストール
  • WAFの限界 – WAFが追加のセキュリティ対策である理由

    (Last Updated On: 2018年8月8日)このエントリは何年も前(日付を見たら2008年8月)に書きかけで放置していたエントリです。最近書いた、セッションアダプション脆弱性をPHPのモジュールレベルで修正するパッチについての議論の参考になると思うので公開します。私は補助的な意味合いを持つ追加のセキュリティ対策は無意味であるとは全く考えていません。対策の限界を知って、有効に利用する。それで良いのでは無いでしょうか?以下、書きかけで未公開だったエントリです。 関連エントリ: セッションフィクセイションはアダプション脆弱性修正で防御可能 (特にコメント欄) WAFは有用なセキュリティ対策です。これに異論は無いでしょう。ゼロデイ対策にはWAFは非常に有効であり、可能であれば導入すべきだ、とセミナーでも繰り返し説明しています。しかし、WAFは万能ではありません。導入すれば安全性が簡単か

    WAFの限界 – WAFが追加のセキュリティ対策である理由
  • PHP 5.4でのAccessorとPHP 5.5以降で検討されているAccessor

    (Last Updated On: 2018年8月13日)二回目のPHP 5.4 Advent Calender用のエントリです。 今回はPHP 5.4より後のPHP(5.5かな?)で利用可能になると思われるAccessorの仕様について紹介します。まずはAccessorのおさらいから。 追記:この機能は投票で棄却されてしまいました。賛否両論が拮抗していたのですが、実装されなくて残念です。 PHP 5.3まで class foo { private $var; function getVar() { return $this->var; } } などと書いてプライベートプロパティなどにアクセスするのがAccessorです。アクセサの良い部分はアクセスを制限できることです。この例の$this->varはリードオンリープロパティと同じ効果があります。 しかし、クラス、プロパティが沢山ある場合に

    PHP 5.4でのAccessorとPHP 5.5以降で検討されているAccessor
  • PHPのセッションアダプション脆弱性克服への道のり

    (Last Updated On: 2018年8月13日)PHP Advent Calender用のエントリです。 PHPのセッション管理は非常に簡単です。セッションをsession_start()で開始して$_SESSION配列を使うだけです。便利で簡単なセッションモジュールですがセッションアダプションに脆弱であるため、一般に言われてる「ログインする時にはsession_regenerate_id()を呼ぶ」コーディングではセッションアダプションに脆弱になってしまいます。 まずは危険性と対策を紹介します。 セッションアダプションの危険性 セッションアダプションとは外部などから設定されたセッションIDを受け入れ初期化する脆弱性です。一番分かりやすい例はTrans SIDを有効にして http://example.com/index.php?PHPSESSID=1234567890 とアクセ

    PHPのセッションアダプション脆弱性克服への道のり
  • PHP 5.4から配列定義は超簡単に、そして落とし穴も – yohgaki's blog

    (Last Updated On: 2018年8月13日)PHP 5.4 Advent Calender 2011用のエントリです。(まだ空きがあるので是非どうぞ) このエントリを書いているのは11/23です。初めの方から重いネタだと後の方が苦労する(?)ので軽い話です。 PHP 5.3までの動作 現時点ではPHP Manualの配列のページには記載されていませんが、配列の定義が簡略化されます。まず現状の配列の定義方法は <?php $a = array('foo'=>123, 'bar'=>456, 789); var_dump($a); こんな感じですね。これを実行すると $ ../php-src-5.4/php arr.php array(3) { ["foo"]=> int(123) ["bar"]=> int(456) [0]=> int(789) } このような出力になります。

    PHP 5.4から配列定義は超簡単に、そして落とし穴も – yohgaki's blog
    shimooka
    shimooka 2011/12/02
    この落とし穴は。。。
  • PROVE for PHP 1.0.3を公開

    (Last Updated On: 2018年8月14日)私の会社で開発・販売しているPROVE for PHPを更新し、PDOオブジェクトに対応したPROVE for PHP 1.0.3の配布を開始しました。PDOオブジェクトに対応したので幅広いアプリケーションで利用できます。PROVEは非商用の個人利用の場合、無償で利用できます。問題などございましたらツイッターやメールなどでフィードバックを頂けると助かります。 http://www.provephp.com/ja/download PROVE for PHPとはPHPの動作を詳細に記録・比較し、PHPPHPアプリのバージョンアップが安全に行えるか簡単にチェックできるツールです。開発中のリグレッションテストツールとして利用できます。 近日中にこのブログでもいろいろな使い方を紹介したいと思っています。 追記: RHEL5系(CentOS

    PROVE for PHP 1.0.3を公開
  • PHP 5.4から利用できるtraitの利用例

    (Last Updated On: 2018年8月13日)PHP5.4からtraitが利用できるようになる事をご存知の方も多いと思います。 traitはコードの水平再利用を可能にする仕様拡張です。Rubyのmixinのような機能と言えば分り易いかも知れません。 誰でもtraitを利用したくなるようなコードをinternals@php.netのMLで見かけたので紹介しよう、と思って書いたのですがコピペしたコードをしっかり読んでなくておかしな所があった事を @sotarok さんに教えてもらいました。 元のコードは色々問題があるので書き直しました。こうやればアクセサーを沢山書く必要が無くなります。 https://gist.github.com/1379592 (読みやすいコードはこちらをどうぞ) <?php trait Accessors{ public function __get($na

    PHP 5.4から利用できるtraitの利用例
  • PHPセッションアダプションをスクリプト側で修正する方法

    (Last Updated On: 2018年8月13日)PHPのスクリプトを使ってアダプティブなPHPセッションをアダプティブにしない方法を紹介します。 このブログで紹介していたかどうか覚えていないですが、セッションアダプション対策としてsession_regenerate_id()が導入された時に議論・紹介されているので知っている方も多いと思います。(というより、PHPerの常識ですよね?) まずはセッションアダプションの原理と対策の復習をしておきます。 原理: 未初期化のセッションIDを受け入れる 対策: 初期化済みセッションIDのみ受け入れる session_regenerate_id()は新しいセッションIDを生成して新しいセッションクッキーを作成して、セッションデータを保存するようになっています。session_regenerate_id()を呼んだだけでは、なんらかの方法で複

    PHPセッションアダプションをスクリプト側で修正する方法
  • PHP 5.4の文字エンコーディング設定

    (Last Updated On: 2018年8月13日)PHP 5.4 RC1が公開されています。PHP 5.4のリリースが近いです。PHP 5.3の–enable-zend-multibyeの問題でバグレポートをした関係でinternals MLでメールのやり取りをして分った事とその他をまとめておきます。主にSJISを使う場合の注意点です。間違い・勘違いもあるかも知れないので気が付いたらコメントを下さい。 PHP 5.4はデフォルトの内部エンコーディングがISO-8859-1になる SJISでコードを書く場合はzend.script_encoding=SJISを書く SJISでコードを書く場合は内部エンコーディングをSJIS(mbstring.internal_encoding=SJIS)に設定する SJISで出力する場合はmbstring.http_output=SJIS (outp

    PHP 5.4の文字エンコーディング設定
  • 第41回 PHP 5.3.4におけるセキュリティ上重要な仕様変更 | gihyo.jp

    PHP 5.3.4のリリースは2010年12月にリリースされました。このリリースにはセキュリティ上重要な変更が追加されています。 Paths with NULL in them (foo\0bar.txt) are now considered as invalid. (Rasmus) パスに“⁠foo\0bar.txt⁠”などのようにNULLが含まれる場合は無効として処理される、とPHP 5.3.4のリリースノートには記載されています。PHP開発者の間でもあまり大きなニュースとして取り上げられていないので、この仕様変更をご存知でない方も多いと思います。2011年4月現在でもこの仕様変更はマニュアルには記載されていません。しかし、この修正はセキュリティ上非常に重要な意味を持っているので解説します。 仕様変更の必要性 PHP体はC言語で記述されているため、ファイルを開く場合、最終的にはC言

    第41回 PHP 5.3.4におけるセキュリティ上重要な仕様変更 | gihyo.jp
  • PROVE for PHP 0.4.0-dev リリース

    エレクトロニック・サービス・イニシアチブのWebシステムのコンサルタントのブログです。Webシステムを対象としたセキュアコーディング/セキュアプログラミング、SAMM、ソースコード検査、Webシステム開発、パフォーマンスチューニングの技術支援、コンサルティング、セミナー開催、書籍などの執筆、PROVE for PHPの開発、PHP4.x/5.xレガシーPHPセキュリティパッチサービスなどを行っています。 ブログのサブタイトルを「書かない日記」としているのは、ブログを始めた時にあまり書かないつもりで始めたのでこのサブタイトルになっています。 氏名:大垣 靖男 私が記述したブログ中のコードは記載が無い場合はMITライセンスです。その他のコードは参考リンクなどのライセンス情報を参照ください。 ご依頼・ご相談は info@es-i.jp まで。

    PROVE for PHP 0.4.0-dev リリース
  • もうバージョンアップで困らない – PROVE for PHP

    (Last Updated On: 2018年8月14日)昨年のPHPカンファレンスで紹介したPORVE for PHP 開発版の公開を始めました。PROVE for PHPはこんなテストが出来ます。 PHPをアップデートしてアプリに影響が無い事を検証する PHPアプリをアップデートしても以前と同じように動作する事を検証する 使い方もとても簡単です。 テストケースの作成はブラウザからアプリを利用するだけ ロードバランサを用いて実運用サーバからのテストケースも作成可能 テストの実行はプログラムを実行するだけ 違いが在った場所はプログラムの何処か確実&簡単に判明 http://www.provephp.com/ 現状 CUIとコマンドツールでの管理のみ GUI(Web、GTK)は順次整備予定 PROVEを利用すればPHPセキュリティパッチがリリースされた場合に、アプリケーションの動作チェック

    もうバージョンアップで困らない – PROVE for PHP