繁体   English   中英

PHP使用MD5保护$ _GET函数

[英]PHP Using MD5 to secure a $_GET function

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

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

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

这是我的代码的示例:

// 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

这种方法是否安全? 谢谢!

您拥有两个秘密密钥,这是对的,但是上面注释中的人都是正确的。 这不是特别安全。 我该怎么办? 我将为您的两台服务器知道一个共享密钥。

$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
}

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

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

首先也是最重要的是使用TLS / SSL 其次,找到一个第三方库来为您处理请求身份验证。 我找不到能满足我需求的产品,所以我自己动手了。

该库称为“ 查询身份验证” ,我编写了该库来处理这个确切的用例。 它是适用于PHP 2AWS开发工具包中 Signature Version 2实现的通用实现。 它处理API密钥和API机密的生成,签名创建和验证,并且可以选择防止重放攻击。 提供了文档和示例实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM