Как функция validate() останавливает ложные запросы аутентификации?

Я только что отладил часть своего php-кода, где мой код для входа не правильно проверял запрос. Я как-то пропустил, используя функцию ->validate(), и одному из моих тестировщиков веб-сайта удалось войти в учетную запись администратора, получив ответ от Google (см. Ниже) и изменив его адрес электронной почты на адрес администратора.

http://mydomain/login/?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=id_res&openid.op_endpoint=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fud&openid.response_nonce=2013-02-15T03%3A56%3A27ZY153c0JFI0G5wA&openid.return_to=http%3A%2F%2Flocalhost%2Flogin%2F&openid.assoc_handle=AMlYA9UI33WW3XfuQGjITXSgB0a0x8nsqD91iuWK9mdvwyBm4EEbk08g&openid.signed=op_endpoint%2Cclaimed_id%2Cidentity%2Creturn_to%2Cresponse_nonce%2Cassoc_handle%2Cns.ext1%2Cext1.mode%2Cext1.type.namePerson_first%2Cext1.value.namePerson_first%2Cext1.type.namePerson_last%2Cext1.value.namePerson_last%2Cext1.type.contact_email%2Cext1.value.contact_email&openid.sig=laAMatkmFjOPrKPsmaIEg%3D&openid.identity=https3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%3DAawnUG6Mr7_ynO1mN-fThr9wbOo&openid.claimed_id=https%3A%2F%2Fwww.google.com%2Faccounts%2Fo8%2Fid%3Fid%OawnUG6Mr7_ymuB1mN-fTFhr9wbOo&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ext1.mode=fetch_response&openid.ext1.type.namePerson_first=http%3A%2F%2Faxschema.org%2FnamePerson%2Ffirst&openid.ext1.value.namePerson_first=T&openid.ext1.type.namePerson_last=http%3A%2F%2Faxschema.org%2FnamePerson%2Flast&openid.ext1.value.namePerson_last=M&openid.ext1.type.contact_email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail&openid.ext1.value.contact_email=**myemail%email.com**

Это нас довольно заинтересовало, как open id проверяет, используя функцию validate (), откуда поступил запрос, отправляется обратно в нужный источник и перехватывает все, что не отправлено обратно напрямую с сервера openid? Используются ли переменные sig или idenitiy как некая система открытого / закрытого ключа?

Если бы кто-то мог помочь мне понять, это было бы круто.

Большое спасибо

1 ответ

Решение

Положительное утверждение, возвращаемое поставщиком, содержит поле с именем openid.signed который используется на стороне потребителя для проверки подписи в openid.sig, Процесс генерации / проверки подписи описан здесь.

Из показанного вами утверждения это подписанные поля:

op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle,ns.ext1,
ext1.mode,ext1.type.namePerson_first,ext1.value.namePerson_first,
ext1.type.namePerson_last,ext1.value.namePerson_last,ext1.type.contact_email,
ext1.value.contact_email

Ты это видишь ext1.value.contact_email является одним из подписанных полей и, следовательно, является частью подписи, поэтому, если подпись совпадает, вы можете быть уверены, что значение не было подделано.

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

Если общий секрет не может быть найден, check_authentication метод должен быть использован, изложен здесь и используется здесь.

Другие вопросы по тегам