1

ログインコードがリクエストを適切に検証していなかったPHPコードの一部をデバッグしました。私はどういうわけか->validate()関数の使用をスキップし、私のWebサイトテスターの1人が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**

これにより、リクエストの送信元であるvalidate()関数を使用して、open idがどのように検証され、適切なソースに返送され、openidサーバーから直接返送されないものをキャッチするかについてかなり興味がありましたか?sigまたはidenitiy変数は、ある種の公開/秘密鍵システムとして使用されていますか?

誰かが私がそれを理解するのを手伝ってくれるなら、それはクールだろう。

どうもありがとう

4

1 に答える 1

2

プロバイダーから返される肯定的なアサーションには、 で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これは署名されたフィールドの 1 つであり、したがって署名の一部であることがわかります。したがって、署名が一致する場合、値が改ざんされていないことを確認できます。

は、メソッドassoc_handle中にコンシューマーとプロバイダーの間で確立される共有シークレットを指します。associateこの共有シークレットは、署名されたフィールド値のキー付きハッシュを生成するために使用され、比較対象の署名を形成します。

共有シークレットが見つからない場合は、check_authenticationメソッドを使用する必要があります。ここで概説され、ここで使用されます

于 2013-02-15T04:27:31.857 に答える