我在php中使用$ _GET函数来为我的Java服务器执行函数。
变量 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
此方法是否安全?谢谢!
答案 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 2中AWS SDK for PHP 2实现的通用实现。它处理API密钥和API密钥生成,签名创建和验证,并可以选择性地防止重放攻击。文档和example implementation可用。