【问题标题】:PHP - hide url (GET) parametersPHP - 隐藏 url (GET) 参数
【发布时间】:2014-06-27 20:05:26
【问题描述】:

我的 PHP/HTML 中有一个这样的链接:

<a href="http://search.mywebsite.com/login.aspx?checktype=uid&user=adam&password=pass1234&profile=dart&defaultdb=kts"> Log me into this website </a>

当用户点击链接时,参数由第三方网站处理,用户无缝登录。

是否可以隐藏/屏蔽/伪装 url,以便用户在将参数传递到指定站点的同时看不到参数?

如果没有,你们会怎么做呢?我主要担心用户和密码参数,需要那些隐藏的。 (user=adam&password=pass1234)

我知道如何隐藏参数的唯一方法是使用表单发布方法,但在这种情况下,它不是一个选项,因为我使用的是直接链接。

编辑: 对于那些一直建议使用 POST 方法的人来说,这不是一个选项,因为我没有使用表单并且接收网站是我无法控制的。我正在从一个站点登录到另一个(第 3 方)网站

【问题讨论】:

  • 不能让用户登录吗?是什么让您在 url 中传递用户名和密码?另外,为什么你会有纯文本的密码?
  • 个人登录不是一种选择,因为我们整个部门都用来登录的第 3 方网站上只有一个(企业)帐户。这有点像一次登录适合所有人。我刚刚发现了这个漏洞,需要找到解决它的方法。

标签: php post parameters get


【解决方案1】:

如果您登录的页面由第三方控制,您唯一的选择是使用表单和 POST:

<form action="http://search.mywebsite.com/login.aspx" method="post">
   <input type="hidden" name="checktype" value="uid" />
   <input type="hidden" name="user" value="adam" />
   <input type="hidden" name="password" value="pass1234" />
   <input type="hidden" name="profile" value="dart" />
   <input type="hidden" name="defaultdb" value="kts" />
   <input type="submit" value="Log me into this website" />
</form>

编辑:如果它必须是链接并且可能需要 javascript,那么您可以使用 javascript 创建并提交form on the fly

<a href="#" onclick="postLogin()">Log me into this website</a>

<script type="text/javascript">
function postLogin() {
    var form = document.createElement("form");
    form.setAttribute("method", "post");
    form.setAttribute("action", "http://search.mywebsite.com/login.aspx");

    var params = {checktype: 'uid', user: 'adam', password: 'pass1234', profile: 'dart', defaultdb: 'kts'};
    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}
</script>

【讨论】:

  • 我将使用它,看看它是如何进行的。谢谢。
【解决方案2】:

请勿使用 $_GET 传递任何个人、机密或重要数据。改用 $_POST。

我不知道是什么阻止了您使用 $_POST 但如果您仍然坚持使用它,请尝试 md5() 对这些数据进行编码并在必要时对其进行验证。您始终可以使用 $_SESSION 传递 $_POST 登录数据以供进一步使用。

【讨论】:

    【解决方案3】:

    同意加密/哈希方法(例如 MD5)。然后有一个重新处理页面,在调用所需的脚本之前解密消息。我在 php 中这样做...只是为了向您展示这个想法。

    例如。 www.mydomain.com/preporcessor.php?request=qouiapfiwe0i9qrr9qyy83r34rqejl

    preprocessor.php(伪代码)

    $request = $_REQUEST["request"];
    $decrypted = mydecryptfunction($request);
    //$decrypted will now contain: targetpage=login.php?username=abc&password=34453js&location=ABJ...
    //Now you can route the parameters to login.php. 
    

    请注意,mydecryptfunction($request) 是您将创建的函数。

    【讨论】:

    • 这是一个有效的解决方案,唯一的问题是我无法控制处理登录请求的接收网站。
    • 如果有使用 SSL 的选项,那就去吧。如果您无法控制接收网站,您的选择将受到限制。您可以向他们建议这种可能性。
    【解决方案4】:

    应该通过 POST 而不是 GET 登录。此外,敏感信息应通过 HTTPS 发送。

    创建安全登录功能的过程可能会写一整本书,所以我建议你从阅读the definitive guide to web-based forms authentication开始。

    如果您对安全性有其他具体问题,建议您通过Security.SE 尝试。

    【讨论】:

    • 我明白这一点。我很抱歉在我的第一篇文章中不够清楚。我通过提到我无法控制接收端来编辑问题。这是一个第三方网站。
    【解决方案5】:

    您不能使用 GET 方法执行此操作。如果您向我们提供更多信息,将会很有帮助。您是否试图让您网站上的用户登录另一个网站?在这种情况下,他们可能有一个您可以检查的 API。

    【讨论】:

    • 是的,我从一个站点登录到另一个站点,但他们没有 API
    【解决方案6】:

    您可以为此函数生成令牌: 在您的数据库中生成一个随机字符串: 这是一个返回随机字符串的函数

    function gt_rnd_str($min=2,$max=9){
        $str="";
        while (strlen($str)<$max) 
            $str.=rtrim(base64_encode(md5(microtime())),"=");
        return substr($str, 0, rand($min, $max));
    }
    

    现在使用用户名/id 保存一个令牌,使用它您可以轻松地为同一用户生成更多令牌以及轻松取消任何令牌..

    【讨论】:

    • 我无权访问/控制接收网站进行任何解码。
    • 如果您无法访问网站,则没有安全的方法可以做到这一点,您可以做的一件事是缩短链接,但这无助于向极客隐藏它们。
    • 如果我要创建一个将标题、url 和参数存储在数据库中的表单会怎样。然后在php中构建一个foreach循环,为每个url(包括参数)生成一个表单,但只呈现指向“search.mywebsite.com/login.aspx”的标题/链接?从这个意义上说,每次点击链接都会提交一个帖子。想法?
    【解决方案7】:

    您可以将 iframe 与页面的 URL 一起使用并设置样式以填充父级并移除边框。

    <!DOCTYPE html>
    <html>
        <body>
            <iframe id="win" src="bookmarks_3_22_20.html" frameborder="0">
            </iframe>
            <script>
                this.onload=function(){
                    document.getElementById("win").style="width:"+window.innerWidth+"px;height:"+window.innerHeight+"px;";
                }
            </script>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 2016-12-02
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      相关资源
      最近更新 更多