直接使用$ _POST [“x”]或复制到局部变量然后使用?

时间:2010-02-13 23:34:43

标签: php post standards

考虑以下一对片段,两者都基本相同。

<html>
<body>
    <?php
    if(isset($_POST["firstName"]) && isset($_POST["lastName"])){
    //I'm copying the POST variable to a local one.
    $firstName = $_POST["firstName"];
    $lastName = $_POST["lastName"];     
    echo "<h1>Thank you for taking the census!</h1>";
    echo "On behalf of Sergio's Emporium, we name you: " . $firstName . $lastName . ", conquerer of worlds!";
    //Here I'm just pulling it from the POST info.
    echo "I think that's fitting since you're a " . $_POST["item"];
    }
    else {      
    echo "You didn't write in the necesarry information.";      
    }
    ?>
</body> 
</html>

哪个更好(从安全角度来看),鼓励哪一个被标准使用。

因为我是PHP的新手,所以这就是我的链条。多谢你们! :)

3 个答案:

答案 0 :(得分:7)

我想说,只要你做得恰当,这两个解决方案都不会从安全的角度改变任何东西:

  • 过滤/验证输入
  • 和Escape输出。

在这里,当您输出一些HTML时,例如,使用htmlspecialchars转义数据可能很有用; - )


为了促进这一点,有些人喜欢考虑:

  • $_POST包含原始输入
  • 和一些局部变量用于包含过滤后的输入 - 即您可以在其余脚本中“安全地”使用。

答案 1 :(得分:-1)

我相信你应该因为你应该对post vars进行某种消毒然后分配给一个本地var

答案 2 :(得分:-1)

根据谷歌的表现大师的说法,应该尽可能避免PHP变量复制:http://code.google.com/speed/articles/optimizing-php.html

就个人而言,我喜欢它,因为我可以在脚本的顶部清楚地看到脚本期望从请求中获得哪些变量,所以我曾经在顶部写下$_REQUEST和朋友的副本:

<?php
    $req_param1 = $_REQUEST['param1'];
    ...
    if (isset($req_param1)) {
        ...
    }
    ...

如今,我做得与众不同。我通常使用define()或在类const中定义我希望从请求中获取的参数的名称。然后,我可以在代码中搜索那些,以查看我实际上在哪里取消它们:

define('REQ_PARAM1', 'param1');
...
function foo(){ 
    if (isset($_REQUEST[REQ_PARAM1])){
    ...
    }
    ...
}

类的例子:

class MyClass {
    const REQ_PARAM1 = "param1";
    ...
    function foo(){
        if (isset($_REQUEST[MyClass::REQ_PARAM1])){
            ...
        }
    }
}