たにぐちまことさんの書かれた『よくわかるPHPの教科書(以下、「よくわかる」)』を購入してパラパラと見ていたら、セキュリティ上の問題がかなりあることに気がつきました。そこで、拙著「体系的に学ぶ 安全なWebアプリケーションの作り方(以下、徳丸本)」の章・節毎に照らし合わせて、「よくわかる」の脆弱性について報告します。主に、徳丸本の4章と5章を参照します。 4.2 入力処理とセキュリティ 「よくわかる」のサンプルや解説では、入力値検証はほとんどしていません。しかし、入力値検証をしていないからといって即脆弱かというとそうではありません。徳丸本でも強調しているように、入力値検証はアプリケーション要件(仕様)に沿っていることを確認するもので、セキュリティ対策が目的ではないからです。 「よくわかる」の中で、私が見た範囲で唯一の入力値検証は、郵便番号のチェックをするものです。以下に引用します(「よくわ

PHP5.3.7のcrypt関数には致命的な脆弱性があります。最悪のケースでは、任意のパスワードでログインできてしまうという事態が発生します。該当する利用者は、至急、後述する回避策を実施することを推奨します。 概要PHPのcrypt関数は、ソルト付きハッシュ値を簡単に求めることができます(公式リファレンス)。crypt関数のハッシュアルゴリズムとしてMD5を指定した場合、ソルトのみが出力され、ハッシュ値が空になります。これは、crypt関数の結果がソルトのみに依存し、パスワードには影響されないことを意味し、crypt関数を認証に用いている場合、任意のパスワードでログインに成功する可能性があります。 影響を受けるアプリケーション crypt関数を用い、ハッシュアルゴリズムとしてMD5を指定しているアプリケーション。 環境にも依存しますが、デフォルトがMD5の場合もあります。筆者のテスト環境
RubyKaigi とか色々あって、ふと、僕がプログラミングを始めたころのことを何となく思い出したので走り書きしておきます。特にPHP に関しては記憶が曖昧なところがおおいので、PHPer モヒカン族によるツッコミを歓迎します。 配列とハッシュが違うPHP においては、配列も連想配列もすべて array() と言う関数で生成する。むしろ、配列というものがキーを数字にしているだけの連想配列と言う位置づけだと思う。Ruby ではもちろん、主たるコレクションには Array と Hash の二種類が存在し、区別される。最初はこの区別に若干戸惑いを覚えた。 ちなみにPython だとリスト・タプル・辞書ともっと増えるわけで、Javaのコレクションクラスに至ってはさらに多いし、この辺はどの実装が正しいとか適切とかではなく慣習なのかなあ、と思ったりする。 型(クラス)がより厳格PHP では
Feature: Prove that software meets my business expectations In order to know when I have correctly implemented a feature As aPHP developer I want a tool to execute tests based on the agreed specifications Background: Given I have discussed a feature with the product team And we have agreed a set of requirements in plain language Scenario: Work is complete Given I have correctly implemented the fe
Blogged by Ujihisa. Standard methods ofprogramming and thoughts including Clojure,Vim, LLVM, Haskell,Ruby and Mathematics written by aJapanese programmer.github/ujihisa InRuby: a = true ? :a : true ? :b : :c p a Guess the answer! Yes, as you thought, the answer is :a. InJavaScript: var a = true ? 'a' : true ? 'b' : 'c'; alert(a); Guess the answer! Yes, as you thought, the answer is a. In Vi
米Facebookは米国時間の2月2日、PHPの性能と拡張性を改善するプロジェクト「HipHop forPHP」を発表した。PHPコードをC++に変換するプログラムで、すでにFacebook内で利用されているという。今後、オープンソースプロジェクトとして公開し、開発を進める計画だ。 FacebookはPHPを利用した大規模なソーシャルネットワーキングサイトだが、拡張性という問題に直面していた。HipHop forPHPはこの問題を解決するために数年前にスタートしたプロジェクトで、現在すでにFacebook内で利用されているとのこと。これによりWebサーバのCPU利用率が改善し、性能の改善に役立ったという。開発者によると、CPUの利用率を平均して50%削減可能としている。 HipHop forPHPにはソースコード変換機構とC++向けに再実装したPHPランタイムシステム、高速化のために

require 'php' とは何かPHP の素晴らしい機能をRuby スクリプトでも使えるようにするためのライブラリです。PHP はRuby にはない「プリティーな」機能がたくさんあり、たとえば数値とそれをあらわす文字列とを等価とみなす == 演算子、未定義定数を文字列として扱ってくれるとっても「親切な」リテラルなどがあります。 今回僕が実装した require 'php' ライブラリはRuby の基本クラスの == メソッドを、PHP の == 演算子の挙動に置き換えるものです。ほかにも実装したかったPHP 的機能がいっぱいあるのですが、実装時間が 3 日のみ*1、さらに発表時間が 3 分しかないことから、今回は演算子 == だけに焦点をしぼることにしました。 おまけですが、本ライブラリには echo 関数や array 関数なども実装されています。しかし実装が数行ですんでし
if ("0x0A" == "10") { print '(´ε` )チュッ'; } チュッ。されちゃいます。 文字列であっても整数と解釈できる文字列の場合は勝手に型変換しやがる今世紀最大の愚行を犯してしまうってのは有名な話だよね。 文字列であっても整数と解釈できる文字列の場合は自動的に整数に型変換してくれる超便利機能があるってのは有名な話だよね。 だけどなんでコレが一致するかわけがわからんかった。 0x0Aは10進数で10になるので一致する。と、言いたいところなんですがそう単純な話じゃないんだ。 以下の例を目ん玉見開いて見て欲しい。 var_dump(0x0A); var_dump("0x0A"); var_dump((int)"0x0A"); var_dump((float)"0x0A"); var_dump(intval("0x0A")); 実行結果 int(10) string(4

下記、正規表現は本当に簡単なチェックで、厳密なチェックをしたい場合は別途検索エンジンなどで調べた方がいいでしょう。参考として、PHPでメールアドレスかどうか調べる方法や、こちらのページで紹介されているようなメールアドレスの正規表現が存在します。 あくまで簡易なので、厳密な正規表現を書きたい方は、小飼弾さんのブログを参照するのが良いかもしれません→メールアドレスの正しい正規表現 <?php $text = "mail@mail.com"; if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $text)) { echo "正しいメールアドレスかもしれません"; } else { echo "正しくないメールアドレスではないかもしれません"; } ?> <?php

2009年03月19日18:00 カテゴリLightweight Languages 「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ ああ、まただよ... かなり使えるPHPの正規表現まとめ - IDEA*IDEA 〜 百式管理人のライフハックブログ 〜 正規表現って、プログラミング言語間の差が少ないサブ言語なのに、なぜ「PHP」がつくとダメ正規表現ばかり登場するのか。うんざりだ。 かなり使えるPHPの正規表現まとめ - IDEA*IDEA 〜 百式管理人のライフハックブログ 〜メールアドレスは厳密にチェックしようとするとなかなか難しいのですが、簡単なチェックだったらこれでOKぽいですね。 /^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$


1リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く