如何隐藏$ _GET变量以在PHP中更安全?

时间:2010-04-15 03:19:04

标签: php

到目前为止,我的所有网站都使用$ _GET来获取页面的数据。

前:

editad.php?posting_id=131

editaccount.php?user_id=2

- >有没有办法隐藏或更安全地了解用户可以看到的内容?我不希望他们只能在URL中输入“editad.php?posting_id = 40”。我知道我可以使用POSTS,但有没有办法获取GET?

- >我通过GET传递数据,然后通过检查用户的id是否等于页面的用户ID来验证该数据。如果它们相同,则允许用户编辑该页面,如果不相同,则只显示该页面。我还确保数字是数字,字符串是字符串等。 还有其他方法可以让它更安全吗?

12 个答案:

答案 0 :(得分:6)

传递_GET中的查询参数没有错。 _POST不再安全。

如果用户能够编辑广告30而不是广告31,则您的代码需要强制执行这些规则。

答案 1 :(得分:4)

不,您不能使用$_GET执行此操作。要通过默认*获得安全性,您可以使用$_POST变量,但$_POST也不安全(并且可以由用户修改)。无论您使用$_GET还是$_POST,都应始终验证传入数据,并确保允许用户访问数据。

*这对外行人来说只是模糊不清。任何感兴趣的程序员/黑客都会立即透明。

答案 2 :(得分:1)

保护窃听者数据的唯一方法是使用POST而不是https://

但是,无法保护用户,因为用户可以轻松修改GETPOST数据。

答案 3 :(得分:1)

谈到安全性,您可以考虑使用以下任一方法:

  1. 使用会话传递变量
  2. 在要传递的网址中添加salt +哈希密钥。
  3. 发件人:

    $hashedKey = sha1( $salt + 'posting_id=131' );
    editad.php?posting_id=131&$key=$hashedKey; 
    

    接收方:

    $params = getUrlParams();
    $hashedKey = sha1( $salt + params );
    
    if ( $_POST['$key'] == $hashedKey ) 
       continue; 
    else 
        displayError();
    

答案 4 :(得分:0)

你回答了自己的问题*,你使用POST。

  • 但是,我不确定“更安全”是什么意思。这是一个网页,您可以查看来源,看看哪些键/值对被发布到表单中。

答案 5 :(得分:0)

如果要隐藏用户的参数,可以始终序列化数据并在查询中传递加密的字符串。 POST不会提高安全性,如果您不向服务器发送数据,则不应使用POST。

请注意,根据您的应用程序,即使加密也是不够的。例如,如果您传递安全令牌,即使您无法查看内容也很容易窃取,您需要使用https以及其他一些内容。但那是一种完全不同的蠕虫病毒。

答案 6 :(得分:0)

也许您可以使用会话状态来跟踪此信息。 PHP具有内置函数,可以为您管理会话状态。

用户无法看到此信息,因为会话信息仅存储在服务器上。

然后,您基本上可以使用$ _SESSION数组访问和存储信息。

以下是我在google上发现的有关会话状态的一些网站:

答案 7 :(得分:0)

在这个Firefox和Firebug时代,隐藏从页面到页面传递的值并不容易,特别是如果它与URL一起...

任何“感兴趣的各方”都可以使用与浏览器捆绑在一起的开发者工具来撬开并查看页面的实际工作方式....

唯一的解决方案,正如上面提到的许多其他解决方案一样,是加密显示用户身份的部分,并且具有一些独创性,以便只有开发人员知道它是如何工作的......

示例:为什么将其作为'user_id'传递....?尝试将其作为'cxv = 32'传递...此外,您可以使用某种算法加密实际ID,然后在下一页中将其解密。这可能会阻止任何尝试修改URL ...至少,它可以让它变得难...... !!

只是用你的想象力......! ;)

答案 8 :(得分:0)

人们尚未提及的一件事是在这里使用PHP扩展Suhosin。您可以通过安装Suhosin来修复PHP超级全局中的许多已知安全漏洞,此外,还可以控制每个$_GET$_POST等的最大阵列长度/深度/大小。它还可以提供会话数据的透明加密。摘自标准的suhosin.ini配置文件:

  

使用的加密密钥包括    [a]用户定义的字符串(可以通过ini_set()更改脚本)    以及可选的User-Agent,Document-Root和0-4 Octects [原文如此]    REMOTE_ADDR。

Suhosin仍然应该通过HTTPS与$_SESSION一起使用,因为如果不在传输层中使用加密,就没有可行的方法来防止信息丢失。你应该用类似Suhosin的加密会话数据本身的方法(使用对用户来说半独特的东西,也可能是时间或日期)来加密你的会话ID。

答案 9 :(得分:0)

更安全的一种方法是使用随机会话ID而不是明文用户ID。用户登录后,创建类似41b96964c35747e19019d2d0f2efb0d1的内容,并将其用于会话以识别用户。这样,另一个用户就不能猜测下一个id。

答案 10 :(得分:-1)

我通常做的是urldecode(只是为了得到原始值),然后运行这个函数

function safedata($original) {
 return stripslashes(strip_tags(htmlspecialchars(trim($original))));
}

像魅力一样工作。此外,如果您已连接到数据库,则可以将mysql_real_escape_string()添加到该函数中。

答案 11 :(得分:-1)

使用nextpage.php?uid=base64_encode($id); 并在nextpage.php上使用

$user_id=base64_decode($_GET[uid]);