1

$_POST設定されているかどうかにかかわらず、変数を返すクラス用の小さな静的メソッドを作成しましたNULL。HTML フォームの入力要素には、'customer-name' などのハイフンを含む名前があります。

だから、このようにアクセスできたと思います$var = $_POST['customer-name']。しかし、私の方法では:

public static function getPost($param) {
    echo $param." = ".$_POST[$param]."<br/>";
    return isset($_POST[$param]) ? $_POST[$param] : NULL;
}

私はできません。echoそして、メソッドにいくつかのステートメントを追加すると、奇妙な動作に気付きます。ハイフンの後にすべてが切り捨てられるため、エラーが発生しました。

Notice: Undefined index: customer- in .. on line ..

これは私がそれをテストする方法です:

$arr = (array)$object;
$newArr = array();
foreach($arr as $key => $val) {
    $newKey = str_replace(get_class($object), "", $key);
    $newArr[$newKey] = MyObject::getPost(strtolower(get_class($object))."-".$newKey);
}

そして、これは私のテストからの出力です:

...
Notice: Undefined index: customer- in .. on line 116
customer-id =

Notice: Undefined index: customer- in .. on line 116
customer-name =

Notice: Undefined index: customer- in .. on line 116
customer-phonecode =
...

EDIT 1 - HTMLフォームを求められました:

<form action="" method="post" class="form-horizontal" role="form">
   <input type="text" name="customer-name" id="customer-name" class="form-control" placeholder="Name" required="required" autocomplete="off" />
   <select id="customer-phonecode" name="customer-phonecode" class="form-control">
      <option value="+123"></option>
   </select>
</form>

EDIT 2 - 5.2、5.3、5.4、5.5 php バージョンのphptester.netでテスト済み。同じエラーが発生します。

EDIT 3 - 次のスクリプトをテストしました。文字列をキーとして渡すと、スーパーグローバル $_POST/an 配列の要素を取得します。ただし、文字列を指す変数を渡すと、要素にアクセスできません

<?php
$test = array('customer-test1' => 1, 'customer-test2' => 2);
function getPost($param) {
    global $test;
    $newParam = (string)$param;
    echo $param." = ".$test[$newParam]."<br/>";
    return isset($test[$newParam]) ? $test[$newParam] : NULL;
}
class Customer {
    private $test1;
    private $test2;     
    function __construct() { }
}
$object = new Customer();
$arr = (array)$object;
$newArr = array();
foreach($arr as $key => $val) {
    $newKey = str_replace(get_class($object), "", $key);
    $newArr[$newKey] = getPost(strtolower(get_class($object))."-".$newKey);
}

これはPHPのバグでしょうか?

4

2 に答える 2

0

問題は、オブジェクトを配列にキャストすると、null 文字が配列キーに追加されることでした。クラス名+プロパティ名だけではありません。これは、キャスト時に PHP がプライベート クラス プロパティを管理する方法です。

$object = new Customer();
$arr = (array)$object;
print_r(array_map("addslashes", array_keys($arr)));

出力:

Array ( 
        [0] => \0Customer\0test1 
        [1] => \0Customer\0test2
      )

var_dump()これらのヌルバイトが表示されない理由がわかりません。私の次の質問かもしれません。したがって、これらの null は静的メソッドの引数にまだ残っていました。しかし、ダッシュ/ハイフンの直後に PHP が停止するのはなぜですか?

PHP では、次のように簡単に記述できます。

$Tmp= 'hehe';

ただし、C で同じことを行うには、次のコードを使用します。

Char Tmp [4];
Tmp [0] = 'h';
Tmp [1] = 'e';
Tmp [2] = 'h';
Tmp [3] = 'e';
Tmp [4] = '\0';

C は文字列を文字配列として処理するため、文字列の最後の文字を定義する方法が必要です。これはヌルバイトを使用して行われます。null バイトは C の \0 によって提供されます。そのため、プログラムを実行すると、最初の文字から null バイトに到達するまで文字列の読み取りが開始されます。これは問題を引き起こします。ご存じのように、PHP は C でも実装されています。PHP の一部の関数は、C で処理されるように入力文字列を処理する可能性があるため、これが問題になる可能性があります。

ソース: #71673null-byte-injection-php

編集1:ソリューションが追加されました

解決策は、「\ 0」文字とクラス名を""foreach ループで置き換えることです。

foreach($arr as $key => $val) {
    $newKey = str_replace(array(get_class($object), "\0"), "", $key);
    $newArr[$newKey] = getPost(strtolower(get_class($object))."-".$newKey);
}
于 2016-02-27T09:42:27.480 に答える