使用extract()和标志EXTR_SKIP来防止安全问题


Using extract() with flag EXTR_SKIP to prevent security issues

我使用extract获取POST发送的表单的所有值,并将它们保存在不同的变量中。我怀疑使用extract()和EXTR_SKIP标志是否是防止安全问题的"最佳方法",比如(也许?)覆盖表单的值和其他我不知道的安全问题(我对网络安全的了解非常有限)

我有很多投入,我总是喜欢以最快的方式学习,以提高生产力(显然意识到的安全性

优化为能够快速阅读,而不是能够快速写作。

但如果你真的想走这条路:

<?php    
// Important, ONLY allow the indices you really want to support
$whitelist = array_key_whitelist($_POST, [
    'foo',
    'bar', 
    'baz',
    'moo',
    'usr',
    'lol'
]);
// Then run extract() as expected
extract($whitelist, EXTR_SKIP);

当然,功能是:

<?php
/**
 * Only allow the whitelisted array keys to exist:
 *
 * @ref http://stackoverflow.com/a/36193403/2224584
 * @param array $input
 * @param array $allowedKeys
 * @return array
 */
function array_key_whitelist(array $input, array $allowedKeys = []): array
{
    $return = [];
    foreach ($allowedKeys as $key) {
        if (array_key_exists($key, $input)) {
            $return[$key] = $input[$key];
        }
    }
    return $return;
}

在循环的上下文中,这比extract()EXTR_SKIP稍微安全一些,在循环中,如果变量已经定义,那么将来可能不会将其设置为正常值。

但说真的,这更多的是一个代码高尔夫的细节,而不是你应该实际遵循的练习。