Heim  >  Artikel  >  Backend-Entwicklung  >  So erstellen Sie einen Bildverifizierungscode in der API-Interaktion

So erstellen Sie einen Bildverifizierungscode in der API-Interaktion

步履不停
步履不停Original
2019-06-18 16:20:033281Durchsuche

So erstellen Sie einen Bildverifizierungscode in der API-Interaktion

Vorwort

Im herkömmlichen Webentwicklungsprozess ist die Verarbeitung grafischer Verifizierungscodes sehr einfach. Sie müssen lediglich ein Bild mit einer zufälligen Zeichenfolge im Hintergrund generieren und hinzufügen Geben Sie den Inhalt des Bestätigungscodes einfach in Session ein. Wenn der Benutzer das Formular absendet, nehmen Sie ihn einfach aus Session[1] heraus und treffen Sie die Entscheidung.

Aber heutzutage werden API-Interaktion und Staatenlosigkeit zunehmend respektiert. Obwohl die Standardkonfiguration nicht unterstützt wird, gibt es immer noch viele Möglichkeiten, das Land zu retten.

Sitzungsbasierte Implementierung

In der API-Entwicklung können wir auch SessionID an das Frontend ausgeben und all dies durch die integrierten Methoden von PHP erreichen.
Zum Beispiel haben wir mit dem vorherigen Absatz vereinbart, dass, wenn die Anfrage X-Session-Id enthält und nicht leer ist, dies bedeutet, dass diese Sitzung bereits eine SessionID registriert hat. Andernfalls wird eine SessionID bekannt gegeben und das X-Session-Id in Der Antwortheader wird zurückgegeben. Lassen Sie den vorherigen Absatz diese Sitzungs-ID aufzeichnen und unten kurz implementieren.

// code_session.php
session_start();
// 这里假设已经通过 Header 获取到了 SessionID,并保存到了 $sessionId 变量中。
// 当 SessionID 不存在,或者 为空 则创建新的 SessionID 。
if(!isset($sessionId) || empty($sessionId)){
    $sessionId = session_create_id();
    // 因为前台还没有 SessionID ,所以下发一个,通知前端保存。
    header('X-Session-Id: '.$sessionId);
}
// 设置当前会话的 SessionID 。
session_id($sessionId);
// 这里我们就可以自由的读写 Session 了。
// 生成验证码
$code = mt_rand(1e3 ,1e4-1);
// create_image 请自行实现 或者使用现有的图形验证码库生成。
$image = create_image($code);
// 存储进去 Session
$_SESSION['code'] = $code;
// 输出一张图片
$image->output();

Das Obige implementiert grundsätzlich die Generierung von Bildern. Das Frontend muss beim Absenden des Formulars nur X-Session-ID in die Kopfzeilen einfügen.

// code_session_validate.php

session_start();
// 这里假设已经通过 Header 获取到了 SessionID,并保存到了 $sessionId 变量中。
// 当 SessionID 不存在,或者 为空 则创建新的 SessionID 。
if(
  !isset($sessionId) 
|| empty($sessionId) 
|| !isset($_POST['code']) 
|| empty($_POST['code'])
){
    // 因为没有提交 SessionID 过来 这个肯定就是不成立的了,所以直接终止即可。
    exit;
}
// 设置当前会话的 SessionID 。
session_id($sessionId);
if($_POST['code']!=$_SESSION['code']){
    // 验证码错误啦
    exit;
}
// 验证通过了就删掉 code,
unset($_SESSION['code']);

Mit der oben genannten Sitzung haben wir grundsätzlich eine einfache Überprüfung implementiert, die auf API-Interaktion basiert und nicht auf Browser-Cookies angewiesen ist. Wenn wir etwas Komplexes benötigen, wie z. B. das Teilen einer Sitzung, würde dies den Rahmen dieses Artikels sprengen (tatsächlich sprengt es jetzt den Rahmen).

Aktive Signatur basierend auf dem Client

Das nächste Die Methode ist nicht Stateful, sondern erfordert die Verwendung von Redis. Dies wird mithilfe der PHPRedis-Erweiterung gehandhabt.

In den meisten Fällen müssen wir nicht zu viele Sitzungen wie oben erstellen, was zu einer gewissen Ressourcenverschwendung führt. Natürlich kann Session unten mehr tun 客户端主动签发 Bildbestätigungscode.

Theoretisches Prinzip

Der Client generiert lokal eine zufällige Zeichenfolge und fügt sie dann hinter die Adresse ein, um den Bestätigungscode zu erhalten. Das Backend fängt die vom Client generierte zufällige Zeichenfolge ab und verwendet sie als Geben Sie Redis ein, und wenn Sie es an den Client senden, müssen Sie die zuvor generierte Zufallszeichenfolge zur Überprüfung mitbringen.

// code_client.php
$salt = 'wertyujkdbaskndasda';
if(!isset($_GET['sign'])){
    // 客户端没有提供签名,停止执行
    exit;
}
// 用户传来的一切数据都是不可靠的,我们需要对其加盐后执行 md5
$sign = md5($_GET['sign'].$salt);
// 拼接上签名作为 Redis 的 key
$key = 'code:'.$sign;
// 连接 Redis 
$cache = new \Redis();
// 生成验证码
$code = mt_rand(1e3,1e4-1);
// 保存验证码到 Redis 并设置2分钟的有效期。
if($cache->exists($key)){
    // 这个 Key 已经被占用了,这里先停止。
    exit;
}
$cache->set($key,$code,60*2);
// 创建图片并返回
$image = create_image($code);
$image->output();

Okay, lass es uns überprüfen.

// code_client_validate.php
$salt = 'wertyujkdbaskndasda';
if(
!isset($_POST['sign'])
|| !isset($_POST['code']) // 没有提交验证码过来。
|| !empty($_POST['code'])
){
    // 客户端没有提供签名,停止执行
    exit;
}
// 用户传来的一切数据都是不可靠的,我们需要对其加盐后执行 md5
$sign = md5($_POST['sign'].$salt);
// 拼接上签名作为 Redis 的 key
$key = 'code:'.$sign;
// 连接 Redis 
$cache = new \Redis();

if(!$cache->exists($key)){
    // 根本没有这个 key
    eixt;
}

if($cache->get($key)!=$_POST['code']){
    // 验证码错误
}

// 验证通过了就删除

$cache->del($key);

Es scheint etwas komplizierter zu sein, und selbst Redis sieht zwar nicht gut aus, erreicht aber auch das, was wir wollen, aber das ist keine sehr gute Lösung Außerdem müssen wir berücksichtigen, dass die Clientzeichenfolge nicht zufällig genug ist. Als nächstes ändern wir die Richtung und wechseln zur serverseitigen Ausgabe.

Basierend auf serverseitiger Ausgabe

Die Implementierung basiert gerade auf clientseitiger Ausgabe. Im Folgenden wird eine andere Idee vermittelt, aber im Allgemeinen ist dies fast dasselbe.

Theoretisches Prinzip

Das Zeichen wird ebenfalls ausgegeben, dieses Mal wird es jedoch vom Server signiert und dann wird das Zeichen über den Header an den Client gesendet. Der Client muss zuerst das Bildressource, beachten Sie, dass das, was hier zurückgegeben wird, ein legaler Binärstream sein sollte, und dann wird das Zeichen aus dem Header entfernt und dem Benutzer angezeigt.

// code_server.php
$cache = new \Redis();
$salt = 'wertyujkdbaskndasda';
function generateSign(){
    global $cache,$salt;
    $sign = md5(mt_rand().$salt);
    // 拼接上签名作为 Redis 的 key
    $key = 'code:'.$sign;
    if($cache->exists($key)){
        // 是的 你么有看错,就是如果生成的 Sign 已存在,就进行递归,直到生成出一个不存在的。
        return generateSign();
    }
    return $key;
}
// 连接 Redis 
$key = generateSign();
// 生成验证码
$code = mt_rand(1e3,1e4-1);
// 保存验证码到 Redis 并设置2分钟的有效期。
$cache->set($key,$code,60*2);
// 创建图片并返回
$image = create_image($code);
// 哈哈 要剃掉前缀哟
header('X-Captcha-Sign: ' . str_replace('code:','',$key));
$image->output();
Es scheint, dass es fast keine Änderung gibt, außer dass sich die Art und Weise der Generierung von Zeichen geändert hat. Wenn dies jedoch geschieht, müssen Front-End-Studenten zuerst diese Ressource erhalten und

in Headern vor der Anzeige Auf der Schnittstelle können Sie das Ergebnis natürlich direkt base64 verwenden oder den Binärstrom direkt verwenden, um eine Bitmap für die Anzeige zu generieren. Die Überprüfungsmethode kann wie oben beschrieben direkt verwendet werden . X-Captcha-Sign

Besondere Aufmerksamkeit

Wenn Sie Ajax zum Abrufen dieser Ressource verwenden und Ihr Unternehmen domänenübergreifend tätig ist, müssen Sie auch

Access-Control-Expose-Headers im Antwortheader festlegen - HTTP |. MDN, andernfalls kann Ajax den benutzerdefinierten Antwortheader nicht abrufen. .

header('Access-Control-Expose-Headers: X-Captcha-Sign');
Zusammenfassung

Nachdem wir uns diese drei Lösungen angesehen haben, kann sich jemand im Grunde eine andere Lösung ausgedacht haben. Geben Sie einen JSON-Schnittstellennamen an, generieren Sie das Bild im Hintergrund und speichern Sie es, geben Sie die URL zurück und signieren Sie es an das Front-End. Das ist in Ordnung, aber auf diese Weise sind unsere Ressourcen nicht sehr kontrollierbar und es kommt zu einer gewissen Verschwendung Ressourcen. Ich habe hier keine Ahnung.

Einige der im Artikel erwähnten Kenntnisse basieren auf der Anwendung einiger Grundkenntnisse. Der Code im Artikel wurde direkt beim Schreiben des Artikels eingegeben. Wenn es Tippfehler oder logische Fehler gibt, können Sie mich gerne aufklären .

Das in diesem Artikel verwendete Redis ist die PHPRedis-Erweiterung. Für die Bildgenerierung des Bestätigungscodes können Sie

gregwar/captcha - Packagist verwenden.

Das Obige ist nur mein persönliches Verständnis. Wenn Sie eine bessere Lösung haben, teilen Sie diese bitte mit.

Referenz

PHP: Sitzungen – Handbuch

[Anmerkung 1] Die in diesem Artikel erwähnte Sitzung ist ein technischer Standard und es gibt ein bestimmtes Sitzungskonzept in der Interaktion, bei dem wir oft über die automatische Weitergabe von Cookies über den Browser sprechen. Hier implementieren wir die Übertragung der SessionID einfach manuell. , aber behalten Sie immer die wörtliche Übersetzungssemantik von Session „session“ bei.

Weitere PHP-bezogene technische Artikel finden Sie in der Spalte PHP-Tutorial zum Lernen!

Das obige ist der detaillierte Inhalt vonSo erstellen Sie einen Bildverifizierungscode in der API-Interaktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn