php create_function、semicolonなしの機能?
-
11-10-2019 - |
質問
基本的に、私が知りたいのは、create_function関数の2番目のパラメーターについて、とにかくセミコロンなしで文字列を渡すことですか?または、それは機能しませんか。
例:
taken from php.net
create_function('$a,$b', 'return "CRCs: " . crc32($a) . " , ".crc32(b);'),
文字列にセミコロンがあることに注意してください。まだ実行/評価するセミコロンなしで誰かが関数を入力できる可能性はありますか?
解決
いいえ、不可能です。 PHPはセミコロン感受性であり、右包装の前にすべてのステートメントを終了するために使用する必要があります。私はこのような通常の機能を試しました:
function f() {
return 1
}
また、JavaScriptとは異なり、構文エラーを吐き出しました。
他のヒント
create_function()を使用すると、匿名関数を作成します。 2番目のパラメーターは、関数のコードである文字列です(記述する他の関数と同様)。たとえば、セミコロンで終わる必要はありません。
$coolfunction = create_function('$thing', 'if ($thing > 0) {return "Yes"; } else { return "no!"; }');
echo $coolfunction(1) . ' and ' . $coolfunction(-1);
「}」で終わり、印刷します:はいといいえ!
使用する前に、常にユーザー入力を消毒する必要があります。ユーザー入力でセミコロンを探すことをお勧めします。
ユーザーがここに何かを入力できる場合、無効な関数名または単なるゴミを入力した場合、まだ問題があります。
で検証できます preg_match() (私はpregの専門家ではないので、他の誰かにあなたを助けてもらいます)。
まず、なぜそれが必要なのですか?それは機能を作成するための本当に汚い方法です。人々が関数を直接作成できるインターフェイスを作成したいので、これはあなたのためだけのものであるか、それが大きなセキュリティの問題になるでしょう)。私はあなたがそれをどのように使いたいかを本当に理解していません。
とにかく、あなたは質問するために、それが機能しているかどうかを気にする必要はありません。つまり、セミコロンを自分で置くだけではないにしても、それが機能しているかどうかをテストするだけです。文字列で単純にテストするだけです。