在url中传递用户名,这是一个安全问题吗?

时间:2015-01-14 19:18:59

标签: php

我是一位寻求帮助的新开发人员。 我试图搜索这个问题,但是我找不到任何令人满意的东西。

我所拥有的基本上是: 报名表格。用户输入他的详细信息并注册我的网站。 如果字段太短,则会处理错误并使用url中的变量重定向同一页面。 然后我在同一页面上获取url变量并显示错误。

然而,当我刷新页面时,表单信息消失了,错误数组正常工作并显示在页面上但是我必须在网址中传递用户名,电子邮件等。

所以我的问题是:将名字,姓名,用户名,电子邮件传递到网址是否有问题,以便刷新后可以在表单中显示?我知道怎么做,我只是想知道是否应该这样做。

修改

我的代码示例。但我想用这个用户名来保存提交后的数据。

if (strlen($firstName) <= 3)
{
$error_array_4 = array("er4" => "t");
}

header('Location:'.$_SERVER['PHP_SELF'].'?'.$error_array_4.'');

if(isset($_GET['er4']) && $_GET['er4'] == "t")
{
echo "<div id='errorContainer'>Your firstname is too short</div>";
}

4 个答案:

答案 0 :(得分:2)

为什么要在刷新后保留错误?

该错误与此最新提交有关,只有在提交的上下文中才有意义。如果我重新加载页面(或者为该实例,关闭选项卡并再次输入表单),为什么我需要看到相同的错误?显示新鲜的形式对我来说更有意义。

但是,如果你坚持,你可以采取几种方法:

  • 验证客户端,并将错误保存到localStorage,localStorage保留在客户端,因此只有该客户端才能看到它。 (请注意,这并不能免除您验证服务器端的问题,只是服务器端错误处理不需要那么好)。
  • 使用会话,这就是他们的配偶。

在查询中传递这些参数是不可取的,因为:

  • 它会创建冗长而丑陋的网址,您可能不在乎,但是......
  • 它可能会在URL中显示敏感信息(如密码),这些信息很容易肩上冲浪。

答案 1 :(得分:0)

虽然很多人提到他应该使用POST而不是GET,但是没有人告诉他如何。我现在会做的,因为他是新开发人员寻求帮助

在您的html中,如果您有表单,请使用值method添加属性POST

<form method="POST" ...

当然,您需要将PHP脚本更改为使用$_POST而不是$_GET

区别为GET(默认情况下,当您忽略method=时)会附加到网址,例如?name = foo&amp; action = bar,但POST将与标题一起发送。< / p>

现在,当您在结果页面上点击刷新时,您的浏览器会要求您再次提交数据。

答案 2 :(得分:0)

假设您正在使用过程PHP代码,这使得这个问题很容易解决(这可以使用OOP ofcourse来完成)。考虑这个少量的代码。这应该都在同一个文件中,不应该重定向,因为它会破坏逻辑。

<?php

if(isset($_POST['submit'])) {

    $errors = [];

    // Assign posted values to variables
    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

    /*
     * Error checking here. If an error occurs you update your errors array and 
     * leave the posted as it is.
     */ 
    if(strlen($username) < 4 || strlen($username) > 30) {
        $errors[] = 'The username must be between 4 and 30 characters in length.';
    }

    // Do your registration logic here.

    // If all is good and well redirect to another page (login page maybe)

}else{

   $username = null;
   $email    = null;
   // Add any other required variables here...

}
?>

然后在HTML表单中执行以下操作:

<form method="POST" action="">

    <p>Username:</p>
    <input type="text" name="username" value="<?php echo $username; ?>" />

    <p>Email:</p>
    <input type="text" name=email" value="<?php echo $email; ?>" />

    <input type="submit" name="submit" value="Register" />
</form>

请注意value HTML标记的input属性。您可以在此处回显输入字段的值。

这将确保始终定义变量$username$email,并且默认值等于NULL,您可以毫不费力地将它们回显到屏幕上。然后,当发布页面时,$username$email变量将被用户提供的值覆盖,并在发生错误时显示。

奖励信息

在youtube上有一个小编,其中创建了注册和登录系统。请记住,这是一个非常糟糕的系统,应该只用于学习基础知识,永远不会在实时服务器上使用! 还有更多你所问的内容,因为他略微涵盖了数据库交互,但遗忘了一个基本的东西(我稍后会描述)。但是你可以用它来了解幕后发生的事情。

PHPAcadamy: Registration & Login System

如果您愿意,可以在Google上阅读以下两件事(这是一些非常好的基础知识)。

  1. 如何清理输入
  2. 输出转义。
  3. 希望这会有所帮助。我知道这可能有点令人生畏,而且很难理解。如果信息太少,请随时问我。

答案 3 :(得分:-1)

如果正在使用HTTPS,则没有关于用户名的安全问题。

如果没有使用HTTPS,有关安全性的问题没有实际意义,因为不存在任何安全问题
不使用HTTPS时无法保护GET查询字符串或POST数据。