是否首选将POST变量分配给实际变量?

时间:2012-01-29 00:06:04

标签: php sql variables post

我刚刚完成了我网站的注册表单以及所有SQL发生的操作页面我刚刚跳过将POST变量分配给实际的变量,就像这样......

$ username = $ _POST ['username'];

相反,我只是在整个PHP页面中使用POST变量。练习时是否有任何风险或错误?

另外,如果我使用不正确的术语,请原谅......

5 个答案:

答案 0 :(得分:5)

您可能正在运行的一个风险是处理原始用户数据,仍然保存在原始$_POST[]变量中。我倾向于将我使用的所有原始数据保存到其他变量中,就像您在$username = $_POST['username']中提到的那样,这样我就可以更有效地操作和消毒该输入。我没有保存对全局$_POST数组所做的任何调整,而是暂时保存了所有更改,并且处于更易于管理的范围。

例如:

$username = mysql_real_escape_string($_POST['username']);

......比以下更好:

$_POST['username'] = mysql_real_escape_string($_POST['username']);

通常最好保留原始用户数据并对其他变量进行调整。

答案 1 :(得分:5)

我认为没有优点或缺点。一旦你开始修改值,你应该将它们放入自己的变量中,但是如果你只是读取它们,你可以将它们留在原来的位置。只有两点:

  • 如果它使您的源代码更易于使用短变量名称而不是$_POST[...],那么这就是将值放入自己的变量的一个很好的理由。
  • 不一定要逐个取值,只需将数组内容分配到另一个数组中:

    $values = $_POST;
    
    // not:
    
    $foo = $_POST['foo'];
    $bar = $_POST['bar'];
    ...
    

答案 2 :(得分:1)

当您决定实现另一种输入方法(json编码的帖子,xml-rpc,soap等)时,将它分配给另一个变量将很有用。确保在早期开始从$_POST数组获得所需内容并稍后使用这些值将更容易将代码重用于其他输入:唯一需要更改的是实例化那些投入。

此外,通常你想稍微改变一个值(默认trim() - ing等),这对局部变量然后是$_POST数组中的项更好。当然,对于拥有数十个编码器的大型项目,我认为始终保持$_POST数组接收是一个很好的做法,而不是直接激怒一个无望的调试同事......

风险和错误不会改变:它仍然是用户输入的,你永远不应该信任,并且总是假设最糟糕的情况。单独的练习不会阻止标准的SQL注入,XSS和其他攻击。

答案 3 :(得分:0)

我个人不喜欢欺骗变量。坚持你所得到的,直到你需要彻底改变它。 Dupe变量使得跟踪更加困难,只会浪费内存和时间。为什么要把沙子带到沙滩上。

从tbl中选择*,其中='"。 mysql_real_escape_string(trim($ _ POST [' that']))。"'

答案 4 :(得分:0)

这一天,我遇到了一个相同的问题,得出的结论是,您应该始终检查索引是否存在,以防止出现“未定义的索引”错误。如果您多次使用POST数据,建议您将测试结果分配给新变量,因为您可能会修改POST数据:

public class IntoParagraphParser implements ActionParser {
    private static final String PARAGRAPH_SPLIT_REGEX = "(?m)(?=^\\s{4})";
    private static final IntoParagraphParser paragraphParser = new IntoParagraphParser();
    private static final IntoSentenceParser sentenceParser = IntoSentenceParser.getInstance();

    private IntoParagraphParser() {
    }

    public static IntoParagraphParser getInstance() {
        return paragraphParser;
    }

    public ComponentText parse(String text) throws TextException {
        ComponentText oneParagraph;
        ComponentText componentParagraph = new CompositeText(text, TypeComponent.PARAGRAPH);
        String[] arrayParagraph = text.split(PARAGRAPH_SPLIT_REGEX);

        for(String element: arrayParagraph) {
            oneParagraph = new CompositeText(element, TypeComponent.PARAGRAPH);
            oneParagraph.add(sentenceParser.parse(element));
            componentParagraph.add(oneParagraph);
        }
        return componentParagraph;
    }
}

等同于:

//at least PHP 7.0.0 required
$foo = $_POST['foo'] ?? '';
$bar = $_POST['bar'] ?? '';

如果仅使用POST数据一次,则可以跳过分配新变量,而仅使用$foo = isset($_POST['foo']) ? $_POST['foo'] : ''; $bar = isset($_POST['bar']) ? $_POST['bar'] : ''; 作为参数。

此解决方案基于this excellent answer。 进一步阅读:https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op