データインタフェースの安全コース
ビジネスは前に必要として、爬虫類の作品のいくつかの側面を含み、データインタフェースのニッチ製品のセキュリティ問題の一部を発見し、インターフェースは、(ああどんな安全対策なし)データの任意の部分を変更しても呼び出すことができます。「天国」であるとされていません。だから私は、ポートセキュリティレコードの背景の理解と連動して動作します。
特に今プロジェクトの大部分は前後端から分離されていること、バックエンドインターフェースセキュリティが最優先事項です。結局、データは金なり
トークンの検証
トークン検証私はプロジェクト道のモバイルインターフェースの初めに行うために使用。
いわゆるトークン検証は、ユーザーIDとパスワードが動作してログインしたときに、サーバは、ログイントークンとトークンキャッシュサーバ(でログインし、ユーザー協会後にクライアントに返すということですRedis
)、その設定された制限時間(通常30分)、顧客サービス側に続いて、すべてのアクセスは、サーバ側にトークン必要が、背景には、確認することによって、正しいトークン、トークンを検証します
キーコード
//验证token
String token = request.getHeader("Token");
if(!jedisPoolService.exists(token))
throw new TokenException("token is invalid");
复制代码
トークン検証+ IP不正アクセス
しかし、現在のトークンの上にのみ存在するかどうかを判断することができますが、何かをしてトークンがある場合、あなたがコントロールすることはできません。(コードは、長い時間のために、このインタフェースを介して呼び出します)
したがって、トークン検証一緒に違法なIPとの判断に基づきます:
IPブラックリスト:我々は問題を定義した訪問の数よりも、一定期間(1分)を超える現在のIPアクセスは、対応するIPアクセスである場合には、禁止と現在のIP IPアクセスは、ブラックリストに追加
インターフェイスにアクセスする前に、IPのIPブラックリストかどうかを判断するため、場合は、IPアクセスの禁止について
キーコード
//判断ip
String ip = GlobalUtil.getIpAddr(request); //获取当前IP
if(jedisPoolService.sismember(IP_BLOCK, ip)) {
throw new NoParamException("黑名单禁止访问");
}
//判断当前ip是否超过访问次数
String key = IP_KEY.replace("{key}", ip);
int count = StringUtil.toInteger(jedisPoolService.get(key) != null ? jedisPoolService.get(key) : 0);
if(count > MAX_COUNT) {
jedisPoolService.putSet(IP_BLOCK, ip);
throw new NoParamException("超过访问次数");
}
jedisPoolService.incrAtTime(key, MAX_COUNT);
复制代码
トークン+タイムスタンプ+署名+ IP不正アクセスに署名
サードパーティ製の支払いの多くに曝露した後、それは独自のインターフェイスのアップグレードプロジェクトをしようとします
トークンの検証に基づいて、一緒にタイムスタンプ付きと署名タイムスタンプに署名。現在インタフェースにアクセスしている:(1分など)不正な決定される規則タイムスタンプタイムスタンプと現在の時刻が所定の範囲を超えています。
サイン署名操作について
- ソートされたリクエストのパラメータは、昇順ASCIIに配置されました
- ソートフォームKEY1でスプライシングパラメータ(符号化パラメータ)が行われ=値1&KEY2 =値2の
- スプライシングの文字列は、MD5署名符号(前方及び後方端部が塩の適切な表記であってもよい)を得るために行わ
キーコード
//时间戳
Object o = objectMap.get("timestamp");
if(o == null)
throw new NoParamException("参数timestamp为空");
Long timestamp = StringUtil.toLong(o);
if (LocalDateUtils.nowTime().getTime() - timestamp >= 1 * 60 * 1000)
throw new NoParamException("timestamp已过期");
//sign
private String getSign2Map(Map<String, Object> map) {
StringBuffer sb = new StringBuffer();
ArrayList<String> list = new ArrayList<String>(map.keySet());
Collections.sort(list);
for (String key : list) {
Object value = map.get(key);
if (!key.equalsIgnoreCase("sign"))
sb.append(key).append("=").append(map.get(key)).append("&");
}
sb.deleteCharAt(sb.length() - 1);
return DigestUtil.getInstance().md5(sb.toString());
}
复制代码
大きな動きトークン+タイムスタンプ+署名を署名+ + HTTPS違法なIPアクセス
HTTPS:互いのアイデンティティとデータ整合性の保護を確認し、SSLやTLSを通じて暗号化されたデータを提供するために、HTTPベースのプロトコル
HTTPSわずかに高いコスト、SSL証明書は、アプリケーションを購入する必要があり、より強力な証明書の手数料
大きくするために、上記のポートセキュリティを確保するが、それは必ずしも安全ではありませんし(愚かな、まだ多くの人が行います)。-_- ~~
お知らせ
理論は、改善が必要なものの多くの詳細がまだある、実際の開発実際の戦闘と同じではありません。次のセクションでは、上記の特定の方法を達成するために