Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHPSecInfoのテスト項目を追加

PHPSecInfoネタの続きです。
配賦されているzipアーカイブのphpsecinfo-20060801/PhpSecInfo/Test/Coreあたりを見てもらえれば説明の必要もナサゲですが。。。xUnitと同様で、PhpSecInfo_Test_Coreクラスを継承し、

  • _execTestメソッド
    • 具体的なテスト内容を記述し、結果レベル(PHPSECINFO_TEST_RESULT_XXXとして定義済)を返す
    • XXX:OK, NOTICE, WARN, ERROR, NOTRUN
  • _setMessagesメソッド
    • 各結果レベルに対するメッセージを定義する

を実装したファイルをTest以下のディレクトリに配置するだけで簡単に作れます。
たとえば、大垣さんのセキュリティ本

Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?

Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?

にある推奨されるphp.iniの設定を元に、short_open_tagについてのテスト項目は次のように書けます。

<?php
/**
 * Test class for shortA_open_tag
 *
 * @package PhpSecInfo
 * @author Hideyuki Shimooka <shimooka@doyouphp.jp>
 */


/**
 * require the PhpSecInfo_Test_Core class
 */
require_once('PhpSecInfo/Test/Test_Core.php');

/**
 * Test class for short_open_tag
 *
 * @package PhpSecInfo
 */
class PhpSecInfo_Test_Core_Short_Open_Tag extends PhpSecInfo_Test_Core
{
    /**
     * This should be a <b>unique</b>, human-readable identifier for this test
     *
     * @var string
     */
    var $test_name = "short_open_tag";

    /**
     * Checks to see if short_open_tag is enabled
     *
     */
    function _execTest() {

        if (!$this->getBooleanIniValue('short_open_tag')) {
            return PHPSECINFO_TEST_RESULT_WARN;
        }

        return PHPSECINFO_TEST_RESULT_NOTICE;
    }

    /**
     * Set the messages specific to this test
     *
     */
    function _setMessages() {
        parent::_setMessages();

        $this->setMessageForResult(
            PHPSECINFO_TEST_RESULT_NOTICE, 'en',
            'short_open_tag is enabled. For portable, redistributable code, be sure not to use short tags.');
        $this->setMessageForResult(
            PHPSECINFO_TEST_RESULT_WARN, 'en',
            'short_open_tag is disbled.  Your code will be disclosed if the short tags (&lt;?) in your scripts. For portable, redistributable code, be sure not to use short tags.');
    }
}

しかし、PhpSecInfoクラスのloadTestsメソッドで、BAKファイルとか*~ファイルまでinclude_onceしてしまうのはどうかと。。。

if (!is_dir($this_dir->path.DIRECTORY_SEPARATOR.$entry)) {

せめて、

if (!is_dir($this_dir->path.DIRECTORY_SEPARATOR.$entry) && preg_match('/\.php$/', $entry)) {

ぐらいして欲しいぞ。。。