PHPプロ!TIPS+

1. emacsでPHP開発

皆さんはPHPでプログラムを作る時、どんな開発環境を使っていますか?

今回は、emacsを使う場合に便利なtipsをご紹介します。

PHP開発で普段emacsを使う人はそんなに多くないと思いますが、使わないといけない状況になった時のために、知っておくと役に立つのではないかと思います。

[1]php-modeでカラフルに

php-modeを使うと、プログラム内の変数や関数が色分けされ、かなり見やすくなります。

やり方は簡単。

1.http://sourceforge.net/projects/php-mode/から最新のphp-modeをダウンロードします。

2.ダウンロードしたファイルを解凍して、解凍したディレクトリ内のphp-mode.elをemacsのsite-lispディレクトリに配置します。site-lispディレクトリは、Linuxだとディストリビューションによって異なりますが、例えば、

/usr/share/emacs/site-lisp

などになります。

3.emacsを起動して、php-mode.elをバイトコンパイルします。Alt と x を同時押ししてから、byte-compile-file と入力してEnter。そしてphp-mode.elファイルを指定(例えば、/usr/share/emacs/site-lisp/php-mode.el)します。

4.ホームディレクトリの.emacsファイル(ない時は作ります)にphp-modeを使 用する設定を書きます。

.emacs
(load-library "php-mode")
(require 'php-mode)

これでPHPファイルを開いた時に、色分けされて表示されるようになります。ならない場合は、.emacsに

(global-font-lock-mode t)
(require 'font-lock)

という2行を加えます。

また、次のような記述を.emacsに加えることで、インデントをタブにするか、スペースに置き換えるか、また、幅を何文字分にするかを設定できます。

(add-hook 'php-mode-user-hook
'(lambda ()
(setq tab-width 2)
(setq indent-tabs-mode nil))
)

tab-width で、タブ幅を指定しています。また、indent-tabs-mode を nil とすると、タブはスペースに置き換わるようになります。タブをスペースで置き換えたくない場合は、indent-tabs-mode t と記述します。

これだけでもずいぶん使いやすくなると思うので、ぜひ試してみてください。

[2]文字コード、改行コードを変えてファイルを再読み込みする

文字コードがうまく判別されずに、文字化けした状態でファイルが開かれてしまった場合、emacsでは次のようにして再読み込みします。

1.Ctl x 同時押し ->Enter -> c と入力後、正しい文字コード、改行コードを指定してEnter文字コードの指定sjis, euc-jp など改行コードの指定文字コードの後に、-dos、-unix、-mac

入力例

sjis-dos, euc-jp-unix など

2.Ctl x 同時押し -> Ctl v 同時押し -> Enterこれで、文字化けして読み込まれたファイルを再読み込みできます。

2. JavaScriptをPHPで記述しよう

JavaScriptを使用したスクリプトを記述していて、条件による分岐をいちいち記述していくのが面倒だなーと思ったことはないでしょうか。そんなときにちょっぴり役に立つ技を紹介したいと思います。

それは読み込むJavaScriptファイルをPHPで記述してしまう方法です。これを使えば、面倒なJavaScriptもPHPスクリプトで動的に変化させることができるようになります。

たとえば、test.phpでJavaScriptを生成するには以下のようになります。

テンプレート内

<script type="text/javascript"src="test.php?flag=1"></script>
<script type="text/javascript">
a();
</script>

test.php内

<?php
echo "function a() {";
if (
$_GET["flag"]) {
  echo 
"alert('aaa');";
} else {
  echo 
"alert('bbb');";
}
echo 
"}";
?>

さらに、PHPでJavaScriptを記述すると、以下のような方法でJavaScriptファイル(ここではtest.php内)から他のJavaScriptファイルをインクルードして、読み込んだ関数を使用することもできるようになります。

test.php内

<?php
// readfileで test()関数を定義したJavaScriptファイルをインクルード
readfile("another_script.js");
?>
// ここからはJavaScript構文を記述
test();

JavaScriptのインクルードは、JavaScriptのcreateElementで<script>タグを 生成する方法でも可能ですが、PHPでreadfileを使うほうが処理が早くなります。

また、これらの技はSmartyなどのテンプレートエンジンを利用すると、さらに使いやすくなります。以下はデリミタを"{{"と"}}"に設定した例です。

function a() {
{{if $is_hogehoge}}
  alert('aaa');
{{else}}
  alert('bbb');
{{/if}}
}

PHPとJavaScriptを絡めた処理を記述する場合などにとても便利なのでぜひお試しください。

3. $_SERVER['PHP_SELF']とXSS脆弱性

皆さんは同じスクリプトへのリンクを貼る時、どの様に記述していますか?$_SERVER['PHP_SELF']を用いることがあるのではないでしょうか。これを直接用いることは危険です。なぜならば、$_SERVER['PHP_SELF']にはクロスサイト・スクリプティング(XSS)脆弱性が存在するからです。

$_SERVER['PHP_SELF']はしばしば次のように使われます。

<form method="post" action="<?php echo $_SERVER['PHP_SELF'?>">

このページ(ここではhttp:/www.example.jp/example.php)へ下記の様にリンクを貼り、クリックしてみて下さい。

<a href="http://www.example.jp/
example.php/%22%3E%3Cscript%3Ealert(%27XSS%27);%3C/script%3E/">

JavaScriptが実行され、アラートでXSSと表示されたと思います。なぜこのようなことが起こるのでしょうか?これは$_SERVER ['PHP_SELF']の本質に関わってくる問題です。

$_SERVER['PHP_SELF']は渡されたURIのHOST部分の後から、GETクエリ部分の前まで(ここには記述していませんが、一般的には?id=10&type=0などの?の前まで)をURLデコードした形で格納します。つまり上記の場合、$_SERVER ['PHP_SELF']は

/example.php/"><script>alert('XSS')</script>/

となります。この結果、formタグ内のaction属性値にそのまま表示されるとJavaScriptを実行してしまいます。

これを防ぐ方法は、$_SERVER['PHP_SELF']をhtmlspecialcharsでエスケープすることです。また、CGI版以外では$ _SERVER['PHP_SELF']の代わりに$_SERVER['SCRIPT_NAME']を用いることも可能です。もしくは、formタグ内の action属性値を空にしてもいいでしょう。

同様の脆弱性が$_SERVER['PATH_INFO']と$_SERVER['PATH_TRANSLATED']にも存在します。お気を付け下さい。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)