前回はPostgreSQLを例に、
PHPのXPath機能
PHP 5.
次回のXPathインジェクションの解説に利用するので、
<?xml versoin="1.0" encoding="UTF-8" ?>
<account>
<user id="1">
<name>user1</name>
<password>password1</password>
</user>
<user id="2">
<name>user2</name>
<password>password2</password>
</user>
<user id="3">
<name>user3</name>
<password>password3</password>
</user>
<user id="4">
<name>user4</name>
<password>password4</password>
</user>
</account>
DOMXPathの利用方法
DOMXPathはオブジェクトとして実装されています。DOMオブジェクトを引数にコンストラクタを呼び出し、
簡単なXPathの実行
<?php
$doc = new DOMDocument;
$doc->load('account.xml');
$xpath = new DOMXPath($doc);
//XPathでaccount文書のすべてのノードを取得
$nodes = $xpath->query('/account/*');
//$nodesはDOMElement。$nもDOMElement
foreach ($nodes as $n) {
var_dump($n);
}
?>
object(DOMElement)#3 (0) { } object(DOMElement)#4 (0) { } object(DOMElement)#5 (0) { } object(DOMElement)#6 (0) { }
account.
XML文書をユーザ認証データベースとして利用
account.
XPathもSQLと同様に比較や結合、
<?php
$doc = new DOMDocument;
$doc->load('account.xml');
$xpath = new DOMXPath($doc);
//ユーザ名が"user1"でパスワードが"password1"であるノードを取り出す
$nodelist = $xpath->query('/account/user[name="user1" and password="password1"]');
var_dump($nodelist->length, $nodelist->item(0)->nodeValue);
?>
account.
[yohgaki@dev tmp]$ php xpath.php int(1) string(22) " user1 password1 "
ユーザ名かパスワードが一致しなければ結果はないので次のようになります。
[yohgaki@dev tmp]$ php xpath.php Notice: Trying to get property of non-object in /home/yohgaki/tmp/xpath.php on line 10 int(0) NULL
このようにXML文書を利用したユーザ管理システムは比較的簡単に実装できることが分かります。ここではコマンドラインから利用する認証を考えてみます。
$ php auth.php USERNAME PASSWORD
と入力し、
<?php
$doc = new DOMDocument;
$doc->load('account.xml');
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query('/account/user[name="'.$argv[1].'" and password="'.$argv[2].'"]');
if ($nodelist->length) {
echo "OK to login".PHP_EOL;
} else {
echo "Not OK to login".PHP_EOL;
}
?>
警告:あえて脆弱性があるコードになっています。絶体にこのようなコードで認証しないでください。
試しに実行してみると、
[yohgaki@dev tmp]$ php auth.php user1 password1 OK to login [yohgaki@dev tmp]$ php auth.php user1 password2 Not OK to login
まとめ
筆者の好みとしてはDOMElementやDOMNodeオブジェクトとしてではなく、
XMLでデータ管理を行うと、
お待たせしました。次回はいよいよXPathインジェクションと対策の解説です。