使用带有标志EXTR_SKIP的extract()来防止出现安全问题

时间:2016-03-24 03:20:45

标签: php security extract

我使用extract来获取POST发送的表单的所有值,并将它们保存在不同的变量中。 我怀疑的是,使用带有标志EXTR_SKIP的extract()是防止安全问题的“最佳方式”,例如(可能?)覆盖表单的值以及我不知道的其他安全问题(我对Web安全的了解是非常有限)

1 个答案:

答案 0 :(得分:3)

  

我有很多投入,我总是喜欢学习最快的方法,提高工作效率(显然意识到安全性

优化能够快速阅读,无法快速写入。

但如果你真的想沿着这条路走下去:

<?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稍微安全一些,如果已经定义了变量,将来可能不会将变量设置为他们的理智值。

但严重的是,这更像是一个代码高尔夫球场,而不是你应该实际跟随的练习。