


PHP、Java、C#實(shí)現(xiàn)URI參數(shù)簽名算法,保準(zhǔn)應(yīng)用與REST服務(wù)器之間的安全通信,防止Secret Key盜用、數(shù)據(jù)篡改等惡意攻擊行為
Jun 13, 2016 pm 12:10 PM
PHP、Java、C#實(shí)現(xiàn)URI參數(shù)簽名算法,確保應(yīng)用與REST服務(wù)器之間的安全通信,防止Secret Key盜用、數(shù)據(jù)篡改等惡意攻擊行為
簡(jiǎn)介
應(yīng)用基于HTTP POST或HTTP GET請(qǐng)求發(fā)送Open API調(diào)用請(qǐng)求時(shí),為了確保應(yīng)用與REST服務(wù)器之間的安全通信,防止Secret Key盜用、數(shù)據(jù)篡改等惡意攻擊行為,REST服務(wù)器使用了參數(shù)簽名機(jī)制。應(yīng)用在調(diào)用Open API之前,需要為其所有請(qǐng)求參數(shù)計(jì)算一個(gè)MD5簽名,并追加到請(qǐng)求參數(shù)中,參數(shù)名為“sign”。REST服務(wù)器在接收到請(qǐng)求時(shí)會(huì)重新計(jì)算簽名,并判斷其值是否與應(yīng)用傳遞過來的sign參數(shù)值一致,以此判定當(dāng)前Open API調(diào)用請(qǐng)求是否是被第三者偽造或篡改。
應(yīng)用在調(diào)用Open API之前需要通過?OAuth2.0服務(wù)獲得用戶或平臺(tái)的授權(quán),獲取到授權(quán)后將會(huì)拿到以下3個(gè)重要參數(shù):
- access_token:基于https調(diào)用Open API時(shí)所需要的訪問授權(quán)碼;
- session_key:基于http調(diào)用Open API時(shí)所需要的訪問授權(quán)碼;
- session_secret:基于http調(diào)用Open API時(shí)計(jì)算參數(shù)簽名用的簽名密鑰。
其中,session_secret這個(gè)參數(shù)就是做參數(shù)簽名時(shí)所需要的簽名密鑰。這與Facebook、人人網(wǎng)等平臺(tái)稍微有所區(qū)別,這兩個(gè)平臺(tái)在做參數(shù)簽名時(shí)所用的簽名密鑰一般有2個(gè):
- 如果是通過應(yīng)用服務(wù)端調(diào)用Open API,則注冊(cè)應(yīng)用時(shí)所拿到的應(yīng)用密鑰(即API Key)就是參數(shù)簽名密鑰;
- 如果是通過JavaScript、ActionScript等客戶端語言調(diào)用Open API,則應(yīng)用獲取到用戶授權(quán)后所拿到的Session Secret就是參數(shù)簽名密鑰。當(dāng)然,通過服務(wù)端調(diào)用Open API時(shí)也可以用Session Secret作為簽名密鑰。
簽名算法
假設(shè)參與參數(shù)簽名計(jì)算的請(qǐng)求參數(shù)分別是“k1”、“k2”、“k3”,它們的值分別是“v1”、“v2”、“v3”,則參數(shù)簽名計(jì)算方法如下:
- 將請(qǐng)求參數(shù)格式化為“key=value”格式,即“k1=v1”、“k2=v2”、“k3=v3”;
- 將格式化好的參數(shù)鍵值對(duì)以字典序升序排列后,拼接在一起,即“k1=v1k2=v2k3=v3”;
- 在拼接好的字符串末尾追加上應(yīng)用通過OAuth2.0協(xié)議獲取Access Token時(shí)所獲取到的session_secret參數(shù)值;
- 上述字符串的MD5值即為簽名的值。
注意:計(jì)算簽名時(shí)的請(qǐng)求參數(shù)中不要包含sign(簽名)參數(shù),因?yàn)閟ign參數(shù)的值此時(shí)還不知道,有待計(jì)算。
另外,計(jì)算簽名的時(shí)候不需要對(duì)參數(shù)進(jìn)行urlencode處理(“application/x-www-form-urlencoded”編碼),但是發(fā)送請(qǐng)求的時(shí)候需要進(jìn)行urlencode處理,這是很多開發(fā)者最容易犯錯(cuò)的地方。
簽名過程示例
假設(shè)某個(gè)應(yīng)用需要獲取某個(gè)uid為67411167的用戶的基本資料,應(yīng)用在之前的通過OAuth2.0服務(wù)獲取Access Token的過程中所拿到的session_key和session_secret參數(shù)值分別為:
- session_key:?"9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A="
- session_secret:?"27e1be4fdcaa83d7f61c489994ff6ed6"
調(diào)用Open API時(shí)的系統(tǒng)時(shí)間(PHP中可以通過date('Y-m-d H:i:s')來獲取當(dāng)前系統(tǒng)時(shí)間)為"2011-06-21 17:18:09",希望REST服務(wù)器以JSON格式返回調(diào)用結(jié)果,即相當(dāng)于參與參數(shù)簽名計(jì)算的請(qǐng)求參數(shù)集合為:
<span style="color: #000000;">[ </span>"session_key" => "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A="<span style="color: #000000;">, </span>"timestamp" => "2011-06-21 17:18:09"<span style="color: #000000;">, </span>"format" => "json"<span style="color: #000000;">, </span>"uid" => 67411167<span style="color: #000000;">]</span>
則計(jì)算簽名的具體過程如下:
- 將請(qǐng)求參數(shù)格式化為“key=value”格式,格式化后的請(qǐng)求參數(shù)集合為:
<span style="color: #000000;"> [ </span>"session_key=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A="<span style="color: #000000;">, </span>"timestamp=2011-06-21 17:18:09"<span style="color: #000000;">, </span>"format=json"<span style="color: #000000;">, </span>"uid=67411167"<span style="color: #000000;"> ]</span>
- 將格式化好的參數(shù)鍵值對(duì)以字典序升序排列,得到如下參數(shù)集:
<span style="color: #000000;"> [ </span>"format=json"<span style="color: #000000;">, </span>"session_key=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A="<span style="color: #000000;">, </span>"timestamp=2011-06-21 17:18:09"<span style="color: #000000;">, </span>"uid=67411167"<span style="color: #000000;"> ]</span>
- 將前面排序好的參數(shù)集拼接在一起,得到如下字符串:
format<span style="color: #339933;">=</span>jsonsession_key<span style="color: #339933;">=</span>9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A<span style="color: #339933;">=</span>timestamp<span style="color: #339933;">=</span><span style="color: #cc66cc;">2011</span><span style="color: #339933;">-</span><span style="color: #208080;">06</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">21</span> <span style="color: #cc66cc;">17</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">18</span><span style="color: #339933;">:</span>09uid<span style="color: #339933;">=</span><span style="color: #cc66cc;">67411167</span>
- 在拼接好的字符串末尾追加上應(yīng)用通過OAuth2.0協(xié)議獲取Access Token時(shí)所獲取到的session_secret參數(shù)值,得到如下字符串:
format<span style="color: #339933;">=</span>jsonsession_key<span style="color: #339933;">=</span>9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A<span style="color: #339933;">=</span>timestamp<span style="color: #339933;">=</span><span style="color: #cc66cc;">2011</span><span style="color: #339933;">-</span><span style="color: #208080;">06</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">21</span> <span style="color: #cc66cc;">17</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">18</span><span style="color: #339933;">:</span>09uid<span style="color: #339933;">=</span>6741116727e1be4fdcaa83d7f61c489994ff6ed6
- 對(duì)前面得到的字符串求MD5簽名,得到的d24dd357a95a2579c410b3a92495f009就是調(diào)用API時(shí)所需要的sign參數(shù)值。
接下來便可以通過HTTP POST方法或HTTP GET方法請(qǐng)求Open API的REST服務(wù)器,進(jìn)行接口調(diào)用了,如:
GET /rest/2.0/passport/users/getInfo?session_key=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A%3D×tamp=2011-06-21+17%3A18%3A09&format=json&uid=67411167&sign=d24dd357a95a2579c410b3a92495f009 HTTP/1.1<span style="color: #000000;">Host: openapi.baidu.comUser</span>-<span style="color: #000000;">Agent: Client of Baidu Open PlatformAccept: </span>*<span style="color: #008000;">/*</span><span style="color: #008000;">Accept-Encoding: gzip,deflateAccept-Charset: utf-8Connection: close或POST /rest/2.0/passport/users/getInfo HTTP/1.1Host: openapi.baidu.comUser-Agent: Client of Baidu Open PlatformAccept: </span><span style="color: #008000;">*/</span>*<span style="color: #000000;">Accept</span>-<span style="color: #000000;">Encoding: gzip,deflateAccept</span>-Charset: utf-8<span style="color: #000000;">Content</span>-Length: 179<span style="color: #000000;">Connection: close session_key</span>=9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A%3D×tamp=2011-06-21+17%3A18%3A09&format=json&uid=67411167&sign=d24dd357a95a2579c410b3a92495f009
簽名算法實(shí)現(xiàn)代碼
PHP代碼實(shí)現(xiàn)
獲取簽名的PHP代碼實(shí)現(xiàn)方式如下所示:
<span style="color: #008000;">/*</span><span style="color: #008000;">* * 簽名生成算法 * @param array $params API調(diào)用的請(qǐng)求參數(shù)集合的關(guān)聯(lián)數(shù)組,不包含sign參數(shù) * @param string $secret 簽名的密鑰即獲取access token時(shí)返回的session secret * @return string 返回參數(shù)簽名值 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">function</span> getSignature(<span style="color: #800080;">$params</span>, <span style="color: #800080;">$secret</span><span style="color: #000000;">) { </span><span style="color: #800080;">$str</span> = ''; <span style="color: #008000;">//</span><span style="color: #008000;">待簽名字符串 //先將參數(shù)以其參數(shù)名的字典序升序進(jìn)行排序</span> <span style="color: #008080;">ksort</span>(<span style="color: #800080;">$params</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;">遍歷排序后的參數(shù)數(shù)組中的每一個(gè)key/value對(duì)</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$params</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$v</span><span style="color: #000000;">) { </span><span style="color: #008000;">//</span><span style="color: #008000;">為key/value對(duì)生成一個(gè)key=value格式的字符串,并拼接到待簽名字符串后面</span> <span style="color: #800080;">$str</span> .= "<span style="color: #800080;">$k</span>=<span style="color: #800080;">$v</span>"<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;">將簽名密鑰拼接到簽名字符串最后面</span> <span style="color: #800080;">$str</span> .= <span style="color: #800080;">$secret</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">通過md5算法為簽名字符串生成一個(gè)md5簽名,該簽名就是我們要追加的sign參數(shù)值</span> <span style="color: #0000ff;">return</span> <span style="color: #008080;">md5</span>(<span style="color: #800080;">$str</span><span style="color: #000000;">); }</span>
調(diào)用示例:
<span style="color: #800080;">$uid</span> = 67411167<span style="color: #000000;">;</span><span style="color: #800080;">$params</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>"session_key" => "9XNNXe66zOlSassjSKD5gry9BiN61IUEi8IpJmjBwvU07RXP0J3c4GnhZR3GKhMHa1A=", "timestamp" => "2011-06-21 17:18:09", "format" => "json", "uid" => <span style="color: #800080;">$uid</span>,<span style="color: #000000;">);</span><span style="color: #800080;">$sign</span> = getSignature(<span style="color: #800080;">$params</span>, "27e1be4fdcaa83d7f61c489994ff6ed6");
Java代碼實(shí)現(xiàn)
獲取簽名的java代碼實(shí)現(xiàn)方式如下所示:
<span style="color: #008000;">/**</span><span style="color: #008000;"> * 簽名生成算法 * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> HashMap<String,String> params 請(qǐng)求參數(shù)集,所有參數(shù)必須已轉(zhuǎn)換為字符串類型 * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> String secret 簽名密鑰 * </span><span style="color: #808080;">@return</span><span style="color: #008000;"> 簽名 * </span><span style="color: #808080;">@throws</span><span style="color: #008000;"> IOException </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> String getSignature(HashMap<String,String> params, String secret) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException{ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 先將參數(shù)以其參數(shù)名的字典序升序進(jìn)行排序</span> Map<String, String> sortedParams = <span style="color: #0000ff;">new</span> TreeMap<String, String><span style="color: #000000;">(params); Set</span><Entry<String, String>> entrys =<span style="color: #000000;"> sortedParams.entrySet(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 遍歷排序后的字典,將所有參數(shù)按"key=value"格式拼接在一起</span> StringBuilder basestring = <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(); </span><span style="color: #0000ff;">for</span> (Entry<String, String><span style="color: #000000;"> param : entrys) { basestring.append(param.getKey()).append(</span>"="<span style="color: #000000;">).append(param.getValue()); } basestring.append(secret); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用MD5對(duì)待簽名串求簽</span> <span style="color: #0000ff;">byte</span>[] bytes = <span style="color: #0000ff;">null</span><span style="color: #000000;">; </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { MessageDigest md5 </span>= MessageDigest.getInstance("MD5"<span style="color: #000000;">); bytes </span>= md5.digest(basestring.toString().getBytes("UTF-8"<span style="color: #000000;">)); } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (GeneralSecurityException ex) { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> IOException(ex); } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 將MD5輸出的二進(jìn)制結(jié)果轉(zhuǎn)換為小寫的十六進(jìn)制</span> StringBuilder sign = <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(); </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i < bytes.length; i++<span style="color: #000000;">) { String hex </span>= Integer.toHexString(bytes[i] & 0xFF<span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (hex.length() == 1<span style="color: #000000;">) { sign.append(</span>"0"<span style="color: #000000;">); } sign.append(hex); } </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sign.toString();}</span>
注意:計(jì)算簽名時(shí)所有參數(shù)的key和value都必須先轉(zhuǎn)換為對(duì)應(yīng)的字符串類型,因?yàn)樵贖TTP請(qǐng)求中傳遞的內(nèi)容都是字符串類型的,很多開發(fā)者都因?yàn)闆]注意到這點(diǎn),直接將非字符串類型的參數(shù)的二進(jìn)制值傳遞了進(jìn)去,結(jié)果導(dǎo)致簽名與服務(wù)端計(jì)算的不一致而出錯(cuò)。
C#代碼實(shí)現(xiàn)
獲取簽名的C#代碼實(shí)現(xiàn)方式如下所示:
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span><span style="color: #808080;">///</span><span style="color: #008000;"> 計(jì)算參數(shù)簽名</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span><span style="color: #808080;">///</span> <span style="color: #808080;"><param name="params"></span><span style="color: #008000;">請(qǐng)求參數(shù)集,所有參數(shù)必須已轉(zhuǎn)換為字符串類型</span><span style="color: #808080;"></param></span><span style="color: #808080;">///</span> <span style="color: #808080;"><param name="secret"></span><span style="color: #008000;">簽名密鑰</span><span style="color: #808080;"></param></span><span style="color: #808080;">///</span> <span style="color: #808080;"><returns></span><span style="color: #008000;">簽名</span><span style="color: #808080;"></returns></span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">string</span> getSignature(IDictionary<<span style="color: #0000ff;">string</span>, <span style="color: #0000ff;">string</span>> parameters, <span style="color: #0000ff;">string</span><span style="color: #000000;"> secret){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 先將參數(shù)以其參數(shù)名的字典序升序進(jìn)行排序</span> IDictionary<<span style="color: #0000ff;">string</span>, <span style="color: #0000ff;">string</span>> sortedParams = <span style="color: #0000ff;">new</span> SortedDictionary<<span style="color: #0000ff;">string</span>, <span style="color: #0000ff;">string</span>><span style="color: #000000;">(parameters); IEnumerator</span><KeyValuePair<<span style="color: #0000ff;">string</span>, <span style="color: #0000ff;">string</span>>> iterator=<span style="color: #000000;"> sortedParams.GetEnumerator(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 遍歷排序后的字典,將所有參數(shù)按"key=value"格式拼接在一起</span> StringBuilder basestring= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(); </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (iterator.MoveNext()) { </span><span style="color: #0000ff;">string</span> key =<span style="color: #000000;"> iterator.Current.Key; </span><span style="color: #0000ff;">string</span> value =<span style="color: #000000;"> iterator.Current.Value; </span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">string</span>.IsNullOrEmpty(key) && !<span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(value)){ basestring.Append(key).Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">=</span><span style="color: #800000;">"</span><span style="color: #000000;">).Append(value); } } basestring.Append(secret); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用MD5對(duì)待簽名串求簽</span> MD5 md5 =<span style="color: #000000;"> MD5.Create(); </span><span style="color: #0000ff;">byte</span>[] bytes =<span style="color: #000000;"> md5.ComputeHash(Encoding.UTF8.GetBytes(basestring.ToString())); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 將MD5輸出的二進(jìn)制結(jié)果轉(zhuǎn)換為小寫的十六進(jìn)制</span> StringBuilder result = <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(); </span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < bytes.Length; i++<span style="color: #000000;">) { </span><span style="color: #0000ff;">string</span> hex = bytes[i].ToString(<span style="color: #800000;">"</span><span style="color: #800000;">x</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (hex.Length == <span style="color: #800080;">1</span><span style="color: #000000;">) { result.Append(</span><span style="color: #800000;">"</span><span style="color: #800000;">0</span><span style="color: #800000;">"</span><span style="color: #000000;">); } result.Append(hex); } </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> result.ToString();}</span>
服務(wù)器接受請(qǐng)求后,同樣對(duì)參數(shù)進(jìn)行簽名,如果簽名相同則數(shù)據(jù)沒有被修改或者丟失。
注意:計(jì)算簽名時(shí)所有參數(shù)的key和value都必須先轉(zhuǎn)換為對(duì)應(yīng)的字符串類型,因?yàn)樵贖TTP請(qǐng)求中傳遞的內(nèi)容都是字符串類型的,很多開發(fā)者都因?yàn)闆]注意到這點(diǎn),直接將非字符串類型的參數(shù)的二進(jìn)制值傳遞了進(jìn)去,結(jié)果導(dǎo)致簽名與服務(wù)端計(jì)算的不一致而出錯(cuò)。

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah Identity dalam SQL? Contoh kod khusus diperlukan Dalam SQL, Identity ialah jenis data khas yang digunakan untuk menjana nombor penambahan automatik. Ia sering digunakan untuk mengenal pasti setiap baris data dalam jadual. Lajur Identiti sering digunakan bersama dengan lajur kunci utama untuk memastikan setiap rekod mempunyai pengecam unik. Artikel ini akan memperincikan cara menggunakan Identiti dan beberapa contoh kod praktikal. Cara asas untuk menggunakan Identity ialah menggunakan Identit semasa membuat jadual.

Tukar jenis data asas kepada rentetan menggunakan fungsi String.valueOf() Java Dalam pembangunan Java, apabila kita perlu menukar jenis data asas kepada rentetan, kaedah biasa ialah menggunakan fungsi valueOf() kelas String. Fungsi ini boleh menerima parameter jenis data asas dan mengembalikan perwakilan rentetan yang sepadan. Dalam artikel ini, kami akan meneroka cara menggunakan fungsi String.valueOf() untuk penukaran jenis data asas dan menyediakan beberapa contoh kod untuk

Kegagalan sesi biasanya disebabkan oleh tamat tempoh seumur hidup sesi atau penutupan pelayan. Penyelesaian: 1. Memanjangkan hayat sesi; 2. Gunakan storan berterusan;

Kaedah menukar tatasusunan char kepada rentetan: Ia boleh dicapai dengan penugasan Gunakan sintaks {char a[]=" abc d\0efg ";string s=a;} untuk membenarkan tatasusunan char terus memberikan nilai kepada rentetan, dan laksanakan. kod untuk melengkapkan penukaran.

Penyelesaian kepada masalah silang domain PHPSession Dalam pembangunan pemisahan front-end dan back-end, permintaan merentas domain telah menjadi kebiasaan. Apabila menangani isu merentas domain, kami biasanya melibatkan penggunaan dan pengurusan sesi. Walau bagaimanapun, disebabkan oleh sekatan dasar asal penyemak imbas, sesi tidak boleh dikongsi secara lalai merentas domain. Untuk menyelesaikan masalah ini, kita perlu menggunakan beberapa teknik dan kaedah untuk mencapai perkongsian sesi merentas domain. 1. Penggunaan kuki yang paling biasa untuk berkongsi sesi merentas domain

JavaScriptCookies Menggunakan kuki JavaScript ialah cara paling berkesan untuk mengingati dan menjejaki keutamaan, pembelian, komisen dan maklumat lain. Maklumat diperlukan untuk pengalaman pelawat yang lebih baik atau statistik tapak web. PHPCookieCookies ialah fail teks yang disimpan pada komputer pelanggan dan disimpan untuk tujuan penjejakan. PHP secara telus menyokong kuki HTTP. Bagaimanakah kuki JavaScript berfungsi? Pelayan anda menghantar beberapa data ke penyemak imbas pelawat anda dalam bentuk kuki. Pelayar boleh menerima kuki. Jika ada, ia akan disimpan pada pemacu keras pelawat sebagai rekod teks biasa. Sekarang, apabila pelawat mencapai halaman lain di tapak

1. Melaksanakan log masuk SMS berdasarkan sesi 1.1 Carta alir log masuk SMS 1.2 Melaksanakan penghantaran kod pengesahan SMS Perihalan permintaan hujung hadapan: Penerangan kaedah permintaan POST laluan permintaan/pengguna/kod parameter permintaan telefon (nombor telefon) nilai pulangan Tiada antara muka belakang pelaksanaan: @Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){/1

Kerentanan kunci pengesahan dua faktor Yubico yang tidak dapat ditambal telah memecahkan keselamatan kebanyakan peranti Yubikey 5, Kunci Keselamatan dan YubiHSM 2FA. JavaCard A22 Feitian dan peranti lain yang menggunakan TPM siri Infineon SLB96xx juga terdedah. Semua
