2013-12-24 2 views
1

Я использую функцию $ _GET в php для выполнения функций для моего 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 

Является ли этот метод безопасным или нет? Благодаря!

+0

Я знаю, что это не MD5 в $ key1 и $ key2. Это просто пример. – user3132865

+0

Нет, его можно кэшировать. –

+0

Использование MD5-хешированных строк на самом деле не имеет никакого значения здесь, не так ли? Вы можете использовать любую старую случайную строку. Тем не менее, это несколько безопасно - за исключением того, что URL-адрес может регистрироваться в пути, в прокси-серверах и в журнале доступа вашего собственного сервера. Я бы не использовал его для обеспечения банковской транзакции, но для многих других менее чувствительных применений это нормально. –

ответ

0

Нет, этот метод не является безопасным, а скорее «безопасностью безвестности».

Прежде всего, используйте TLS/SSL. Во-вторых, найдите стороннюю библиотеку для проверки подлинности запроса. Я не мог найти того, что делал то, что мне было нужно, поэтому я поставил его вместе.

Библиотека называется Query Auth, и я написал ее для обработки этого точного прецедента. Это общая реализация реализации Signature Version 2 от AWS SDK for PHP 2. Он управляет ключом API и секретным генератором API, созданием и проверкой подписи и может дополнительно защищать от повторных атак. Документация и example implementation доступны.

1

Вы на правильном пути, имея два секретных ключа, но люди в комментариях выше, все правильно. Это не особенно безопасно. Что бы я сделал? Я бы сделал один общий ключ, о котором знают ваши два сервера. Ключ такой как

$key1 = "skghlskfhgj42u6928749856478937683471095sndgfnsvnrandom"; 

Этот ключ становится солью для какой-либо операции, которую вы выполняете по всем параметрам. Оба сервера используют соль для создания хэша, который передается по запросу. Получающий конец скрипта будет проверять, чтобы прошедший хэш был таким же, какой он будет строить из запроса.

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

Обязательно укажите временную метку в запросе, чтобы два запроса не совпадали.

+0

Можно ли просто проверить IP-адрес человека, запрашивающего посещение страницы PHP? Было бы только 1 или 2 разных IP-адреса, которые должны были бы получить доступ к этой функции. – user3132865

+0

Да. Это должно быть в суперкоммуляторе $ _SERVER. См. Этот поиск (или быстрый поиск Google по подмене IP-адресов), чтобы понять риски безопасности, которые вы выполняете там http://serverfault.com/questions/381393/can-the-ip-address-for-an-http-request-be -spoofed. Я предложил безопасное решение, которое было бы легко реализовать. – user2923779

Смежные вопросы