$ _GET在PHP参数的函数

问题描述:

我有同样的问题,但...我重定向根据的,如果使用标头是通过函数构建动态页面语句的用户。为了使该功能正常工作,它需要在标题的GET部分中传递的参数。

根据什么来提供的答案,这是一个不好的做法。我该怎么做呢?

function page($title,$msg){ 
    $title = $_GET['title']; 
    $msg = $_GET['msg']; 
    echo '<h1>'.$title.'</h1>'; 

    echo '<p>'; 
    switch($msg){ 
     case 1: 
      echo 'dwasdwadawdwadwa'; 
     break; 
     case 2: 
      echo 'wasdadwadwdad'; 
     break; 
     default: 
      echo 'wadasdasd'; 
     break; 
    } 
    echo '</p>'; 
} 

ps:随意指出你看错的东西。

我发现this,但它并没有真正帮助我。

+0

其中回答?你有同样的问题,哪个问题? – ceejayoz

+0

首先,不是从函数中'echo',而是将内容存储到函数返回的变量中,即'return $ func_html'。 –

+6

为什么你的函数需要立即覆盖的参数? –

答案给你链接的问题表明,功能不应该依赖任何外部(例如全局)变量,你可以访问所有相同的属性。 $_GET$_POST(其中包括)是'超级全局',这是PHP的一种语言特性,可以在任何范围内使用它们。这意味着它们可能会在脚本的任何地方被意外修改。

避免这种情况的一种方法是避免在方法中使用超类全局变量,而不是像另一个问题的答案所表明的那样,而是需要变量的参数,否则这些变量会从超级全局变量中获得。的

例如,而不是:

function add_user() { 
    $user = $_GET['user']; 
    // ... 
} 
add_user(); 

你可以使用:

function add_user($user) { 
    // ... 
} 
add_user($_GET['user']); 

在你的情况,你会怎样想的是:

function page($title, $msg){ 
    echo '<h1>'.$title.'</h1>'; 
    echo '<p>'; 
    switch($msg){ 
    case 1: 
     echo 'dwasdwadawdwadwa'; 
    break; 
    case 2: 
     echo 'wasdadwadwdad'; 
    break; 
    default: 
     echo 'wadasdasd'; 
    break; 
    } 
    echo '</p>'; 
} 

然后,当你调用page你可以这样称呼它:

page($_GET['title'], $_GET['msg']); 
+0

'“......从脚本中的任何位置意外修改” - 这是一个现实问题吗? – mario

+0

@mario:是的。如果您调用修改'$ _GET'和'$ _POST'变量的函数以及其他读取它们的函数,那么更改函数调用的顺序可能会产生逻辑错误。 – Rob

+0

@mario:在这种情况下是虚构的,但完全符合现实,并且常见的错误原因。最大限度地减少函数的副作用总是一个好主意。这种心态是像不变性和无状态编程这样的实践的原因:http://*.com/questions/844536/advantages-of-stateless-programming – Rob

不知道如果我明白你的问题,但这里是一些代码,我用处理我的AJAX调用有:

$mc = new MyClass(); 
echo $mc->{$_GET["operation"]}($_GET); 

这意味着“操作”是指内部MyClass的方法名称和我没有加每种方法都有一个新的switch语句。现在就可以增加一个功能“的addRecord($参数)”,以MyClass的,和我的Ajax调用是这样的:

ajax_users.php?operation=addRecord&name=testuser&dob=1980-01-01 

你的PHP函数接收阵列中的参数,所以内部功能addRecord()你必须访问像$args['name']$args['dob']这样的变量,并且它有多少参数需要传递给您的方法。

确保你使用准备好的语句这里或适当的逃逸,以防止SQL注入。

虽然你不一定用的东西的$_GET输入需要安全性的考虑(在这种情况下),这是一个不好的做法不是从URL进行消毒值。

您不仅应该检查恶意输入(尤其是如果您使用输入来查询数据库),但您应该验证预期的整数值确实是整数,并且所需的字符串不是空的。

此外,您page($title, $msg)函数接受$title$msg并设定他们,即使他们不是passed by reference

  1. 如果您希望修改输入参数,请通过引用传递它们。

  2. 如果您需要使用的输入参数,不要马上覆盖它们。

  3. 如果你不需要输入参数,只有使用价值从$_GET本地到你的函数,声明page()不带任何参数。

为什么你需要使用GET?如果你使用POST这也是更安全

+0

POST比POST更安全吗? POST的唯一好处是它允许你发送更多的数据(文件上传,非常长的textareas);但是您不需要比Firebug,TamperData或其他任何webdev工具来操作POST数据。 – iHaveacomputer

+0

它不会混乱网址/显示用户数据。 示例login.php?username = iHaveacomputer&password = generic。要获取他们输入的信息,您只需键入网站的网址,然后按向下箭头键即可。而不是鼓励使用GET来消息鼓励POST,因为这就是它的用途。没有人想要一个400长的网址。 – Bankzilla

+0

URL混乱是一个合理的论点。安全恐吓不是。也请等待[更多]点(http://*.com/privileges/comment),直到您可以发表简短的问题作为评论。 – mario