5

未満文字「<」を許可する方法を教えてくださいstrip_tags()

コードスニペット

$string ="abc<123";
StringFromUser($string);

function StringFromUser($string)
{

    if (is_string($string))
    {
        return strip_tags($string);

    }

}

出力: abc

期待される出力 abc<123

4

4 に答える 4

1

strip_tagsデータをサニタイズするための非常に基本的であまり良い方法ではありません(つまり、「任意の値を形にする」)。繰り返しますが、ご覧のとおり、これはあまり良い機能ではありません。非常に正当な理由がある場合にのみ、データをサニタイズする必要があります。多くの場合、正当な理由はありません。値の一部を恣意的に取り除くことで何を得ることができるかを自問してください。

構文の問題やインジェクション攻撃を回避するために、検証またはエスケープする必要があります。サニタイズが正しいことはめったにありません。トピック全体の背景については、The Great Escapism (または、テキスト内のテキストを操作するために知っておくべきこと)をお読みください。

于 2013-07-15T09:51:36.923 に答える
0

問題: trip_tags を使用する目的は、HTML または PHP インジェクションによる攻撃を防ぐことです。ただし、trip_tags は HTML および PHP タグを削除するだけでなく、< 演算子を使用した数式の一部も削除します。したがって、「abc<123」が「abc」に置き換えられていることがわかります。

解決策: 私たちが知っているのは、< の後にスペースが続くものは、strip_tags によって HTML または PHP タグとして識別されないということです。そこで、「abc<123」を「abc< myUniqueID123」に置き換えます。<記号の後にスペースがあることに注意してください。また、< 記号に続く数字のみが置き換えられます。次に、文字列に strip_tag を付けます。最後に、「abc< myUniqueID123」を「abc<123」に戻します。

$string = "abc<123";
echo StringFromUser($string);

function StringFromUser($string)
{
    if (is_string($string)) {
        //change "abc<123" to "abc< myUniqueID123", so math expressions are not stripped.
        //use myQuniqueID to identity what we have changed later.
        $string = preg_replace("/(<)(\d)/", "$1 myUniqueID$2", $string);
        $string = strip_tags($string);
        //change "abc< myUniqueID123" back to "abc<123"
        $string = preg_replace("/(<) myUniqueID(\d)/", "$1$2", $string);
        return $string;
    }
}
于 2016-06-24T18:32:53.497 に答える