使用PHP传递URL参数

时间:2012-03-29 23:27:52

标签: php md5

我正在创建一个与Web服务器上的PHP脚本通信的程序,为此我需要能够将参数从程序传递到PHP脚本。

现在这是我的问题。在某些时候,需要将用户名和密码传递给脚本。现在这不是以一种对用户来说很明显的方式(例如在地址栏中)完成的,但我知道对某人真的想要解决它的问题有点嗤之以鼻。因此,虽然我的脚本可以安全地注入,但显然可变篡改是一个问题。

这是我提出的一个想法,所以请帮助我绕过它,看看这是否会像我想的那样发挥作用。

我的想法是在发送之前在客户端加密用户密码(或其他唯一密钥)变量,这样你就会得到一个像(显然只是编造)mypage.php的网址?un = Oa348uty8& ps = op986hGTfreu然后当它获取PHP脚本解密并使用不同的盐再次加密。

因此,当它离开应用程序时,它将被加密但不是正确的方式,然后当它命中PHP脚本服务器端解密它并使用正确的盐重新加密它,这样它将正确匹配存储的加密密码。

这样,他们的用户就不会知道他们的密码的加密版本应该是什么样子,所以如果不这样,他们将无法篡改URL并尝试插入假值。

4 个答案:

答案 0 :(得分:1)

简而言之,您正在考虑这个问题:

在服务器端,你有:

  • 数据库,登录/密码匹配。
  • 一个带有2个参数(密码和用户名)的脚本,如果这对夫妇存在,则检查数据库

你的问题:

当您的本地应用程序在服务器端调用php脚本时,2个参数以纯文本形式给出。并且你想要避免篡改(如果你的脚本是安全的注入我只看到篡改用于强制认证< =请记住我会在整个帖子中保留这个假设)

您的解决方案:

  • 在客户端,加密2个参数
  • 在服务器端,在脚本中添加salt以加盐
  • 然后解密2个参数并用盐加密

我的想法:

这不会解决篡改问题,有人仍然可以伪造请求。 第一次加密是无用的,因为有人可以检索客户端使用的密钥。 第二次加密并不安全,因为您为所有用户使用相同的盐。

我建议:

如果您不使用HTTPS等安全协议(可以使用SSL或TLS),则接受无法避免篡改。 如果你想要一个没有HTTPS的可接受的安全性,我将实现以下内容:

  • 您将检查的令牌系统,以查看用户是否可以执行登录操作
  • 无法加密的用户名
  • 密码sha1散列存储在数据库中
  • 在客户端,您调用脚本并提供非加密用户名和密码为sha1哈希,并使用随机盐(sha1(sha1(pass)+ salt)重新进行处理(salt存储在用户会话中)在服务器端)
  • 然后,脚本会将提供的哈希与使用会话盐重新填充的db密码哈希进行比较

改进之处在于攻击者必须尝试连续强制使用两个sha1密码,并且必须提供有效的令牌来执行登录操作。另外,如果你使用变量均匀长度的十六进制字符作为一个字符串使用盐,它将使攻击者更难以识别第二个散列强制执行的值是一个sha1散列,即使他知道这是一个sha1他将不得不测试多个案例,以尝试找到与哈希对应的值的正确部分。

由于变量salt,如果散列,相同的密码将不相同: 想象一下,攻击者嗅到一个哈希并知道使用了哪个密码,然后嗅到用另一个密码制作的另一个哈希,攻击者将无法知道2密码在哪里相同(有点矫枉过正但仍然有用) )。

将密码存储为散列值更安全,因为如果攻击者设法转储您的用户表,他将无法立即使用密码,他将不得不强制执行每个密码。 最后sha1哈希比md5更安全(我告诉你,因为你在帖子中使用了md5标签)

此方法的缺点是密码无法撤消,因此如果用户丢失密码,您将无法将密码退回给用户。你必须让他们设置一个新的。

一种硬核方式(仍未使用HTTPS),将使用强密码(如AES或3DES)加密您的密码和用户名,并使用安全密钥交换算法(如Diffie Hellman之一)进行交换随机共享密钥。

此方法不会阻止篡改,但会阻止攻击者,因为他无法解密该值(假设他只是在嗅探网络)。密钥是随机的,永远不会在您的任何应用程序中进行硬编码,因此即使有人撤销您的客户端,他也无法检索密钥。 我仍然建议你存储你的密码值有哈希。

一种极端的方式是合并两种方法,但是完全过度。

希望这会给你一些想法

答案 1 :(得分:0)

您的方法的问题不在于您是否在URL中使用加密的密码和用户名。如果用户通过向您发送加密字符串进行身份验证,那么我作为攻击者仍然可以嗅出这些哈希值,将它们传递给您的应用程序并进行身份验证。除非这样,你事先做了一些公钥/私钥交换,但这只是重新实现HTTPS,所以你也可以只使用HTTPS。

您应该做的是使用POST通过HTTPS发送请求。

  • POST:以便身份验证详细信息不会出现在URL中,并显示在日志和引荐来源网址中。
  • HTTPS,以便整个请求的内容完全加密,并且只能由客户端应用程序和服务器端解密。

答案 2 :(得分:0)

使用Javascript从客户端加密到服务器只能防止非SSL发布失败。 我认为你必须使用sessions而不是这种类型的加密。

答案 3 :(得分:0)

更新: 您可以在两个脚本中添加自己的密钥。