我正在接管一个旧网站的维护,并遇到了这种令人困惑的语法,用于处理我以前从未见过的表单,我不确定它的作用:
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);
}
Run Code Online (Sandbox Code Playgroud)
它是"和",它让我 - 我把它读作"如果设置变量将其转换为htmlentities,但为什么那里有"和"?
最后,最后一行做了什么?
isset($$vuln) and $$vuln = htmlentities($$vuln);
Run Code Online (Sandbox Code Playgroud)
它以不寻常的方式使用PHP 的运算符优先级规则.
如果你有一个and语句,如果左边是假的话,PHP将停止处理它 - 没有必要检查右边,因为它不会对最终结果产生影响.(or如果左侧是真的话,对于一个陈述也是如此.)
因此编写此代码的编码器将其用作以下内容的简写:
if (isset($_REQUEST[$vuln])) {
$_REQUEST[$vuln] = htmlentities($_REQUEST[$vuln]);
}
Run Code Online (Sandbox Code Playgroud)
他们节省了少量的打字,但代价是使代码难以阅读.最好使用它isset来确保在使用它们之前设置数组值,这就是检查的原因.
至于最后一行; 从逻辑上讲,它与上面的相同,但是带有变量变量.第一次通过时,$vuln将设置为数组中的第一项,即address- 最后一行代码检查是否有一个被调用的变量$address,如果是,则将其值设置为htmlentities($address).
这就是代码正在做的事情.为什么它检查REQUEST,GET和POST超出了我的范围.