3

次のようなコードがあります。これはクラスを宣言し、その名前は取得した文字列に基づいています。ただし、問題は、PHPがクラス名として受け入れない不正な文字が文字列に含まれている可能性があることです。それで、クラス名として使用する前に文字列をサニタイズする良い方法はありますか?

$retrieved_string = 'some unformatted string; it may contain illegal characters to be passed as a class name.';

$strMyScript = basename(__FILE__, ".php"); 
$strMyScript = sanitize_variable($strMyScript);
$strClassName = sanitize_variable($retrieved_string);

eval('
    class ' . $strMyScript . '_' . $strClassName . ' extends AnotherClass {
        // some code here
    }
');

funaction sanitize_variable($string) {
    // sanitize the string
}
4

3 に答える 3

2

文字列が有効な識別子(クラス名、変数名、または関数名)であるかどうかは、次を使用して確認できます。

if (preg_match("/^[_a-zA-Z][_a-zA-Z0-9]*$/", $received_string)) {
    // valid name
} else {
    // invalid name
}
于 2012-09-09T14:35:59.130 に答える
1

PHPの作成者が提供する正規表現があります。クラスのマニュアルエントリを参照してください。

<?php

if (preg_match('/^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$/', $strClasssName)) {
    // etc.
}

関数名やその他のラベルについても同じです。

文字列をサニタイズする場合は、そうでないものをすべて削除してから[a-zA-Z0-9_\x7f-\xff]検証する必要があります^([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$(違いは、整数は文字として許可されていますが、クラス/関数名は1で始まらない場合があります)。

于 2012-09-09T14:34:37.037 に答える
1

まず、フィルターまたはバリデーターが必要なものを決定します。バリデーターはtrue/falseを返します。次に、例外を発生させるか、ユーザーにエラーを生成するか、ファイルを無視することができます。もう1つのオプションは、入力文字列から文字を効果的に削除するフィルターを使用することです。

public function sanitize($input)
{
    $pattern = '/[^a-zA-Z0-9]/';

    return preg_replace($pattern, '', (string) $input);
}

また、Unicodeを確認することもできます。パターンは次のとおりです。

public function sanitize($input)
{
    if (!@preg_match('/\pL/u', 'a'))
    {
        $pattern = '/[^a-zA-Z0-9]/';
    }
    else
    {
        $pattern = '/[^\p{L}\p{N}]/u';
    }
    return preg_replace($pattern, '', (string) $input);
}

考慮すべき問題:

  • 空白のサポートを有効にしますか?この場合、$pattern変数にスペースを追加する必要があります。
  • ファイル名は英語以外の言語ですか?次に、$ patternを最新の状態にするために、ロケール固有の操作を行う必要があります。

HTH

于 2012-09-09T14:45:11.817 に答える