タグのアーカイブ: php (RSS)

MagpieRSSが嫌われた?

ベイエリアPlanetに追加したHAKさんのMy life as an APEというサイト、実は登録依頼は先月にあって、フィードはすぐ追加したんだけどなぜかfetchがうまくできてなかったのです。

引越しの忙しさもあって、なかなか調べられなかったんだけど、どうやらwablogがMagpieRSSからのアクセスに対して403 Forbiddenを返してるということが判明!

wablogに連絡して理由をきいてみたい気もしたんだけど、変なアクセスポリシーもまぁ人それぞれだろうなってことで、MagpieRSSをrequireする前に
define('MAGPIE_USER_AGENT', 'Mozilla/4.0 (compatible; rss_fetch;)');
ってしておくことにしました。

テンプレートシステムはデフォルトでエスケープするべきじゃなかろうか?

mixiに機能要望の投票とトラッキングがついたらしいので、個人ごとにタイムゾーン設定できるようにってのに投票しました。
# 現時点で評価は 良い94/悪い4 なんだけど、いつになったら検討されるのかさっぱり謎です。

で、他にどんな面白い要望があるんだろうかとブラウズしたりして、ふと実装済のところを見てみると、XSS脆弱性の修正が並んでる・・・
しかも、「mixi機能要望におけるXSSの問題を根本的に修正してほしい」なんてのを筆頭に、最近リリースされてる機能にも平気でXSS脆弱性があった模様。

いまどきリリースされるwebアプリでも、XSS脆弱性はゴロゴロしてるのね。
まあ、そこらのサンプルコードや入門書にXSS脆弱性やSQLインジェクションがゴロゴロしてるのは知ってましたが、mixiでリリースされてるアプリケーションでも未だにゴロゴロしてるとは、ちょっとびっくりです。

mixiのシステムはおいといて、ふと思ったのが「テンプレートシステムはデフォルトでエスケープするべきじゃなかろうか?」ってこと。

DBなどに入力値をそのまま持っておく設計(極めてフツーだけど)のwebアプリケーションだと、たとえばsmartyなら、HTMLを保存しているもの以外の全ての変数表示項目で{$hogehoge|escape}として、エスケープする必要があります。
「ちゃんとエスケープしろよ」といっちゃえばそれまでなのですが、テンプレートってのはwebデザイナーさんもいじることがあるわけで、webデザイナーさんがescapeを忘れちゃったり間違えて取っちゃったりする可能性ってのは十分あるわけです。

このあたりの危うさを考慮すると、テンプレートシステムではデフォルトでエスケープするほうが安全だし、コードの量も減るでしょうね。

PHP-gettext(wordpressに入ってたヤツ)

すごくひさしぶりにPHPのプログラムをまとめて書くことになり、PHPでgettextを使うってのを、いい機会なので調べてみました。

gettextエクステンション無しで直接MOファイルを読み込むPHP-gettextライブラリ

このサイトでも使っているWordpressというブログアプリケーションでは、gettextのMO filesを読み込むのにPHP-gettextというライブラリが使われています。

このライブラリをつかった場合の特徴としては、直接MOファイルを読むライブラリなので・・・

  • –with-gettextつきでコンパイルしてないPHPでもMOファイルを読み込むことができる
  • もちろん、LOCALEを使わなくてもgettextの恩恵を受けることができる
  • 当然、あの深いディレクトリ構造(BASE/${locale}/LC_MESSAGES/${domain}.mo)と戯れなくてすむ

Wordpressのソースの中から、PHP-gettextの成果物でありwp-includes/の下にあるgettext.phpstreams.phpをincludeしているwp-l10n.php
を読めば、使い方はすぐにわかると思います。
このwp-l10n.phpでは、_()ではなく__()_e()という関数を用意しています。アンダースコア1個の関数を定義しようとすると、gettextエクステンションが組み込まれたPHPでコケてしまうので、素直にこの方法に従っておくのが吉ですね。

PHPでgettextしたい!って人のための参考リンク

phpなweb開発者はストロング読め

MLや雑誌などで活躍されてるかなだまさかつさんのおさかなラボ(kaede.to)
php使うweb開発者は読むべし!です

# 何故か今日まで存在に気がつかなかったのですがものすごくお勧め

PHPからGoogle Baseにポストする

Google Baseが動いてますね」で

今までのclassfiedサイトがAPIでGoogle Baseに対応すれば、ユーザーはカンタンに両方にpostすることができるわけで、さらに情報は今まで以上に検索されやすくなるわけで、情報を適切に広げたいと思うユーザーにとっては、これはとってもイイことだと思います。

と書いたのですが、PhpBase (phpbase.org)をつかえばPHPプログラムからGoogle Baseにデータを登録することができるみたいです。

これでウェブサイトがますますセマンティックで検索されやすいものになる!(Googleだけの閉じた世界で?)

phpでGoogle Mapsをカンタンに使う – GoogleMapAPI

GoogleMapAPI (phpinsider.com)
にて、PHPからGoogle Mapsをカンタンに使うことのできるライブラリが公開されています

サンプルを見ると

require(‘GoogleMapAPI.class.php’);
$map = new GoogleMapAPI();
// setup database for geocode caching
$map->setDSN(‘mysql://USER:PASS@localhost/GEOCODES’);
// enter YOUR Google Map Key
$map->setAPIKey(‘YOURGOOGLEMAPKEY’);

と、コメント除いた4行で準備は完了。
requireとnewはいわずもがな。
setDSN()は、住所から座標への変換結果をキャッシュする機能のために、PEAR::DBのDSNを使用してデータベースを指定。
setAPIKey()はもちろんGoogleMapsのAPIキーを指定します。

地図にマーカーをうつには

// create some map markers
$map->addMarkerByAddress(‘621 N 48th St # 6 Lincoln NE 68502′,’PJ Pizza’,'<b>PJ Pizza</b>’);
$map->addMarkerByAddress(‘826 P St Lincoln NE 68502′,’Old Chicago’,'<b>Old Chicago</b>’);
$map->addMarkerByAddress(‘3457 Holdrege St Lincoln NE 68502′,”Valentino’s”,”<b>Valentino’s</b>”);

と、メソッドaddMakerByAddress($address,$title,$html)でカンタンにマーカーを作成することができますな。
この住所から座標への変換にはYahooのgeocode APIを使っているそうです。
で、この住所から座標への変換結果を、さっき指定したデータベースにキャッシュしてくれるってわけです。
キャッシュ用のデータベースには

CREATE TABLE GEOCODES (
address varchar(255) NOT NULL default ”,
lon float default NULL,
lat float default NULL,
PRIMARY KEY (address)
);

ってな具合のテーブルを用意しておけとのこと。

HTML側では、
head内で$map->printHeaderJS();と$map->printMapJS();を出力
bodyのonload属性に”onLoad()”を指定
$map->printMap()で地図本体を表示
$map->printSidebar()でサイドバーとしてマーカー群のリンクを表示
となってます。

テンプレートシステムに対応するために、上記のメソッドのprintの部分がgetになった、文字列を返すメソッドも用意されていますね。
Smartyを使用した例もドキュメントに含まれてます。

JavaScriptをごちゃごちゃ書くのがめんどくさくて敬遠してた人が多い気がするGoogle Maps APIですが、これでphperへの敷居がぐぐっと低くなったんじゃないでしょうか?

md5とさよならしよう

MD4/MD5 コリジョンの実証コードが公開(slashdot.jp)

phpコードの中でも、死んでしまったmd5とは可能な限りさよならしましょう

パスワードの保存にハッシュ関数をつかっているか確認し、md5関数の変わりにsha1関数を使うようにしましょう
RDBMSで、md5()でつくった16進32文字をに保存するフィールドがchar(32)になっているなら、sha1()でつくられる16進40文字を保存できるようにchar(40)に拡張しましょう

セッション処理の識別子にmd5で生成したIDをつかっている場合、可能ならsha1を使用するように移行すべきです
PHP5の場合、session.hash_function に1を設定するとsha1を使用するようです
詳しくはマニュアルのセッション処理関数の章を見てください

ベイエリアPlanet

サイドバーに
Planet Fedora Japanese
Planet PHP Japan
Planet PostgreSQL Japan
と並べてるんですが、なんとなくマネして

ベイエリアPlanet
シリコンバレー・SFベイエリア近辺に住む人々の日本語のブログ

ってのをつくってみました。
こーいう、ローカルに並べると住んでる人には面白い、と思う。

例によってphp+magpieRSS+smartyでザクっと書いたので、ソースを見たい奇特な人は
index.php
index.tpl
index_rss.tpl
をどうぞ

GetSenでRSS/ATOMフィードを流し読み

GetSenでもうちょっと遊んでみようってことで、GetSen Readerをつくってみました。

(サンプル)
FPNを流し読み
うーん、いい感じかも

100SHIKIを流し読み
目をひく(が中身がわかりにくい)タイトルに対しズバリの一文が抜け出せてる、と思わない?

PHP+XML/RPC(Pear)+MagpieRSSで、なかなかの生産性です。

(6/13 100SHIKIを追加)
(6/18 Open Alexandriaを追加)

(2/25/2008 いろいろ削除)

PHPWalkerのGoogle Sitemap Generator

Google Sitemap GeneratorをPHPで書く【序章】 (web-frigo.com)
と、いうわけでGoogle Sitemaps Generator for PHPよろしくです
続きを読む »