PHP – безопасный переход данных с сайта на другой сайт

У меня есть сайт, который может принимать запросы с нескольких сайтов. Похоже на проверку обновления. Эти сайты отправят информацию, такую ​​как имена пользователей, пароли, версию приложения и т. Д., После чего мой сайт отправит ответ на эту информацию.

В основном это запрос $_GET , что-то вроде:

http://www.mysite.com/?user=boo&password=foo&version=4

Мне было интересно, будут ли какие-либо проблемы с безопасностью делать такие вещи. Могут ли эти данные «перехватиться» каким-то образом?

Хорошо, я бы настоятельно предложил не отправлять имя пользователя / пароль через обычный текст ни при каких обстоятельствах (даже при использовании SSL). Вместо этого я бы предложил использовать форму аутентификации Digest.

Вместо этого я бы предложил создать большой токен аутентификации (случайная строка большого размера, 128 символов будут работать). Затем пользователи установят этот «токен» в своем приложении.

Теперь, когда приложение проверяет наличие обновлений, оно сначала запускает запрос на ваш сервер, запрашивая токен дайджеста. Это случайный одноразовый токен, который используется только для одного запроса. Ваше приложение должно сгенерировать токен, сохранить его в надежном формате (файл, память, базу данных и т. Д.) Вместе с меткой времени, а затем отправить ее обратно.

Теперь ваше приложение получает этот токен дайджеста (здесь $dt ). Затем вы hmac с предварительно настроенным токеном аутентификации, который уже был указан.

 $authBit = $username . ':' . $authToken; $hash = hash_hmac('sha256', $authBit, $digestToken); $authField = $username . ':' . $hash . ':' . $digestToken; 

Затем вы отправляете $authField на сервер. Затем сервер разделит части:

 list ($user, $hash, $digestToken) = explode(':', $authField); 

Теперь вы сначала $authToken токен аутентификации пользователя в базе данных и сохраняете его в $authToken . Затем вы $digestToken чтобы убедиться, что он существует и что он был создан менее чем за 60 секунд назад (вы можете настроить его, если он слишком короткий, но не увеличивайте его дольше). В любом случае, удалите его из базы данных в этот момент (чтобы предотвратить повторное использование).

Теперь, если $digestToken существует и действителен, и вы можете найти $authToken , просто выполните следующую проверку:

 $stub = $user . ':' . $authToken; if ($hash == hash_hmac('sha256', $stub, $digestToken)) { //valid user } else { //Not valid } 

Он имеет преимущество в изменении отправленного токена каждый раз, когда-либо один HTTP-запрос (любой, кто читает поток запросов, не сможет получить какую-либо конфиденциальную информацию из запроса, кроме имени пользователя, которое вы могли бы замаскировать, если хотите) …

Защита от неясности не работает, и использование POST вместо GET делает информацию немного сложнее, если вы действительно смотрите на пользователя через плечо.

Настоящая проблема заключается в том, что люди не могут перехватывать трафик в пути между серверами. Единственный способ справиться с этим – это шифрование, такое как SSL. Рекомендуется всегда использовать SSL, когда вы передаете конфиденциальную информацию, такую ​​как пароли. Это может быть немного сложнее реализовать, но это определенно стоит с точки зрения безопасности.

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

Используйте .htaccess, чтобы изменить и скрыть URL вашего сайта. например:

 www.mysite.com/index.php?cat=1234&foo=5678 

будет выглядеть так:

 www.mysite.com/cat-1234-foo-5678-index.html 

когда u успешно создаст файл .htaccess, оба URL будут действовать одинаково.