2016-07-12 9 views
4

私は古いウェブサイトのメンテナンスを引き継ぐと私は前に見たことのないフォームを処理するために、この混乱の構文に出くわした、と私はそれが何をするかを正確に特定ないですしています:奇数と混乱PHPの文法

foreach (array('address','comments','country','email','mail_content','name','title') as $vuln) 
{ 
    isset($_REQUEST[$vuln]) and $_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]); 
    isset($_GET[$vuln]) and $_GET[$vuln] = htmlentities($_GET[$vuln]); 
    isset($_POST[$vuln]) and $_POST[$vuln] = htmlentities($_POST[$vuln]); 
    isset($$vuln) and $$vuln = htmlentities($$vuln); 
} 
私のようにそれを読んで、「変数が設定されている場合にhtmlentitiesに変換するが、なぜそこにある 『と』そこに

最後に、最後の行には何をするのか -

それは「と」それは私を投げているのですか??

isset($$vuln) and $$vuln = htmlentities($$vuln); 
+1

なぜ私はdevloperが 'REQUEST'、' GET'、 'POST'を使っているのか分かりません。 '$$ vuln'は可変変数です。 http://php.net/manual/en/language.variables.variable.php – chris85

+0

すばやく有益な回答をいただき、ありがとうございます。すべての回答を受け入れることが大好きですが、できません。 – BigMac66

答えて

7

これは普通の方法でPHPの規則operator precedenceを使用しています。

andステートメントがある場合、PHPは左辺がfalseの場合は処理を停止します。最終結果に影響を与えないため、右辺を確認する必要はありません。

if (isset($_REQUEST[$vuln])) { 
    $_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]); 
} 

彼らは小さなを保存しました:(。左側がtrueの場合、逆はor声明についても同様である)

だから、これを書いたコーダは、の省略形として、それを使用していますコードの読み込みを少し難しくするという代償を払って、タイピングの量を減らすことができます。 issetを使用して、使用する前に配列の値が設定されていることを確認することをお勧めします。そのため、チェックがそこにあります。

最終行については、論理的には、これは上記と同じですが、variable variableとなります。初めて$vulnが配列の最初の項目に設定されます。これはaddressです。コードの最後には$addressという変数があるかどうかがチェックされています。その場合は、値をhtmlentities($address)に設定します。

これは、コードが実行していることです。 なぜ要求、取得、POSTが私を超えているかチェックしています。

2
isset($var) and <statement goes here that uses $var>; 

(この場合isset($var)で)andに先行する文がtrueに評価される場合、これは基本的にのみ<statement ...>を実行します。これは、andの前に何かが間違っていると、残りを評価(または実行)する必要がないためです。 conditionがどんなに条件が常にfalseに評価される場合は、その値は、と評価されたどのようなことから、評価されることはありません

if (false && condition) { ... } 

:これはと同様に動作します。最初例えば

Aより読み選択肢は:

@ chris85によるコメントで指摘したように
if (isset($var)) { 
    <statement goes here that uses $var>; 
} 

$$variableを参照してください。

変数変数の例:

$vuln = 'abc'; /* Regular variable assignment */ 
$$vuln = 'def'; /* This is "equivalent" to $abc = 'def' 
       * because $$vuln expands to $<contents of $vuln>, 
       * therefore $abc is assigned with 'def'. 
       */ 

/* $abc is now a variable with 'def' as its value */ 
2

こんにちは、これらはshortendフォームに過ぎません。ライン上

isset($_REQUEST[$vuln]) and $_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]); 

if(isset($_REQUEST[$vuln])){ 
$_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]); 
} 

はまた$$vulnreferencevariableであることを意味し、そのチェック同じ参照variableが設定されている場合、その値割り当てること

2

のように理解しやすいかもしれません以下のように、配列を通る最初の反復のために:

<?php 

if(isset($_REQUEST['address'])) { 
    $_REQUEST['address'] = htmlentities($_REQUEST['address']); 
} 
if(isset($_GET['address'])) { 
    $_GET['address'] = htmlentities($_GET['address']); 
} 
if(isset($_POST['address'])) { 
    $_POST['address'] = htmlentities($_POST['address']); 
} 
if(isset($address)) { 
    $address = htmlentities($address); 
} 

「グローバル登録」を有効にしたときに、おそらく「魔法引用」の代わりとなる(またはおそらくそれに加えて)レガシーコードのように見えます。おそらく彼らは、データベースの挿入やページのエコーの前に変数の擬似エスケープを行う可能性があります。