[英]How can I secure PHP API to use in the android application?
書籍表
CREATE TABLE `BOOKS` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` char(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
addNewBook.php
<?php
$connection = mysqli_connect("...", "...", "...", "...");
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$bookName = $_POST["bookName"];
if (isset($bookName))
$query = mysqli_query($connection, "INSERT INTO BOOKS (NAME) VALUES ('$bookName')");
我是 JWT 的新手,我正在嘗試保護這個簡單的 API。
如果來自 android 應用程序外部,我想拒絕添加請求。
當我嘗試使用 Postman 添加新書時,我想拒絕該操作,但如果請求來自 android 應用程序(原始應用程序而不是逆向工程應用程序),則必須成功添加。
這是一個簡單的例子,因為我想逐步了解 JWT。
你的幫助對我來說意義重大。 謝謝你。
這是使用 JWT 令牌的示例流程:
兩件重要的事情,您不必檢查數據庫來驗證和檢查角色,並且您可以相信令牌在驗證時是未被篡改的。
對於代碼開始,我推薦這篇文章: https ://roytuts.com/how-to-generate-and-validate-jwt-using-php-without-using-third-party-api/
以下代碼來自網站,並在驗證時添加了獲取管理員角色(TRUE 或 FALSE)。
生成令牌:
function generate_jwt($headers, $payload, $secret = 'secret') {
$headers_encoded = base64url_encode(json_encode($headers));
$payload_encoded = base64url_encode(json_encode($payload));
$signature = hash_hmac('SHA256', "$headers_encoded.$payload_encoded", $secret, true);
$signature_encoded = base64url_encode($signature);
$jwt = "$headers_encoded.$payload_encoded.$signature_encoded";
return $jwt;
}
function base64url_encode($str) {
return rtrim(strtr(base64_encode($str), '+/', '-_'), '=');
}
$headers = array('alg'=>'HS256','typ'=>'JWT');
$payload = array('sub'=>'1234567890','name'=>'John Doe', 'admin'=>true, 'exp'=>(time() + 60));
$jwt = generate_jwt($headers, $payload);
驗證令牌:
function is_jwt_valid($jwt, $secret = 'secret') {
// split the jwt
$tokenParts = explode('.', $jwt);
$header = base64_decode($tokenParts[0]);
$payload = base64_decode($tokenParts[1]);
$signature_provided = $tokenParts[2];
// check the expiration time - note this will cause an error if there is no 'exp' claim in the jwt
$expiration = json_decode($payload)->exp;
$is_token_expired = ($expiration - time()) < 0;
// get role here, simple admin example
$admin = json_decode($payload)->admin;
// build a signature based on the header and payload using the secret
$base64_url_header = base64url_encode($header);
$base64_url_payload = base64url_encode($payload);
$signature = hash_hmac('SHA256', $base64_url_header . "." . $base64_url_payload, $secret, true);
$base64_url_signature = base64url_encode($signature);
// verify it matches the signature provided in the jwt
$is_signature_valid = ($base64_url_signature === $signature_provided);
if ($is_token_expired || !$is_signature_valid) {
return FALSE;
} else {
return TRUE;
}
}
$is_jwt_valid = is_jwt_valid('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6dHJ1ZSwiZXhwIjoxNTgyNjE2MDA1fQ.umEYVDP_kZJGCI3tkU9dmq7CIumEU8Zvftc-klp-334');
請記住用您的秘密字符串替換“秘密”,例如它可以是 GUID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.