PHP使用MD5保护$ _GET函数

时间:2013-12-24 15:38:24

标签: php security hash get

我在php中使用$ _GET函数来为我的Java服务器执行函数。

该网站与此类似:http://api.somewebsite.com/perform/function.php?authkey1=randomMD5&authkey2=randomMD5&parameters=something

变量 authkey1 authkey2 表示随机生成的MD5。 PHP脚本确实连接到MySQL,我已经阻止了注入。但是,在代码解析任何其他内容之前,URL必须包含这2个authkeys,否则他们会收到一条消息“不正确的身份验证”。

以下是我的代码所做的一个示例:

// Security key check
$key1 = "skghlskfhgj42u6928749856478937683471095sndgfnsvnrandom";
$key2 = "dbnksgh794ytowhjklgn934ngmsnnmlrj9096345u075u80375ngsr";

$g_key1 = $_GET['authkey1'];
$g_key2 = $_GET['authkey2'];

if (empty($g_key1) || empty($g_key2)) {
die("Improper authorization");
}

if ($g_key1 != $key1 || $g_key2 != $key2) {
die("Improper authorization");
}

// If authentication passes, move on to other functions

此方法是否安全?谢谢!

2 个答案:

答案 0 :(得分:1)

你有两个秘密密钥在正确的轨道上,但上面评论中的人都是正确的。这不是特别安全。我该怎么办?我会制作一个你的两个服务器知道的共享密钥。像

这样的关键
$key1 = "skghlskfhgj42u6928749856478937683471095sndgfnsvnrandom";

此键成为您对所有参数执行的某种操作的盐。两个服务器都使用salt来构建在请求中传递的哈希。脚本的接收端将检查以确保传递的哈希与它从请求构建的哈希相同。

$passed_hash = $_GET['hash'];

$params = $_GET;
unset($params['hash']);
ksort($params);
$str = '';
foreach($params as $k => $v){
  $str .= $v;
}

// the key is the salt
$str .= $key1;

$calculated_hash = md5($str);

if($passed_hash == $calculated_hash){
  // you know everything is good
}

确保在请求中包含时间戳,因此没有两个请求相同。

答案 1 :(得分:0)

不,这种方法不安全,而是“默默无闻”。

首先也是最重要的,使用TLS/SSL。其次,找到第三方库来处理请求身份验证。我找不到一个能做我需要的东西,所以我自己把它放在一起。

该库名为Query Auth,我编写它来处理这个确切的用例。它是Signature Version 2AWS SDK for PHP 2实现的通用实现。它处理API密钥和API密钥生成,签名创建和验证,并可以选择性地防止重放攻击。文档和example implementation可用。