HttpUtility.UrlEncodeコード書き換え
4235 ワード
1.いくつかのシステム方法、例えば.NETシステムの方法UrlEncodeは「=」を%3 Dではなく「%3 d」に符号化し、暗号化署名が検証に通じないため、開発者に注意して確認してください.
2.Java 1.3および以前のバージョンではjavaが呼び出された.net.URLEncoderの下の方法でURL符号化を行う場合、アスタリスク(*)などの特殊な文字は符号化されません.URL符号化ルールではアスタリスク(*)が符号化されなければならないことが規定されているため、要求文字列にアスタリスク(*)が含まれている場合、上記の方法を使用すると、生成された署名が検証できなくなります.例えばv3/pay/buy_goodsインタフェースを呼び出す場合、payitemパラメータ値には必ず*が含まれ、クラスjavaを使用する.net.URLEncoderの下の方法で符号化した後、開発者が手動でアスタリスク文字「*」を「%2 A」に置き換える必要があります.そうしないと、暗号化署名が検証に直通しません.開発者は注意してください.
3.一部の言語のurlencodeメソッドでは、「スペース」を「+」に符号化し、実際には「%2 B」に符号化する必要があります.これにより、誤った署名が生成され、署名が検証に失敗します.開発者は「+」を手動で「%2 B」に置き換えることに注意してください.PHPでは、rawurlencodeメソッドによるURL符号化を推奨します.
以下に、UrlEncodeへのc#言語の書き換えについて説明します.
2.Java 1.3および以前のバージョンではjavaが呼び出された.net.URLEncoderの下の方法でURL符号化を行う場合、アスタリスク(*)などの特殊な文字は符号化されません.URL符号化ルールではアスタリスク(*)が符号化されなければならないことが規定されているため、要求文字列にアスタリスク(*)が含まれている場合、上記の方法を使用すると、生成された署名が検証できなくなります.例えばv3/pay/buy_goodsインタフェースを呼び出す場合、payitemパラメータ値には必ず*が含まれ、クラスjavaを使用する.net.URLEncoderの下の方法で符号化した後、開発者が手動でアスタリスク文字「*」を「%2 A」に置き換える必要があります.そうしないと、暗号化署名が検証に直通しません.開発者は注意してください.
3.一部の言語のurlencodeメソッドでは、「スペース」を「+」に符号化し、実際には「%2 B」に符号化する必要があります.これにより、誤った署名が生成され、署名が検証に失敗します.開発者は「+」を手動で「%2 B」に置き換えることに注意してください.PHPでは、rawurlencodeメソッドによるURL符号化を推奨します.
以下に、UrlEncodeへのc#言語の書き換えについて説明します.
/// <summary>
/// UrlEncode : ,
/// </summary>
/// <param name="strSrc"> </param>
/// <param name="encoding"> </param>
/// <param name="bToUpper"> </param>
/// <returns></returns>
private string UrlEncode(string strSrc, System.Text.Encoding encoding, bool bToUpper)
{
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
for (int i = 0; i < strSrc.Length; i++)
{
string t = strSrc[i].ToString();
string k = HttpUtility.UrlEncode(t, encoding);
if (t == k)
{
stringBuilder.Append(t);
}
else
{
if (bToUpper)
stringBuilder.Append(k.ToUpper());
else
stringBuilder.Append(k);
}
}
if (bToUpper)
return stringBuilder.ToString().Replace("+", "%2B");
else
return stringBuilder.ToString();
}
:
string org_loc = this.UrlEncode("/dfdasf/get_api_m", Encoding.UTF8, true);