介绍
可能会有时候,您的Laravel应用程序的队列任务、通知、可邮件类或监听器包含您不想公开的敏感信息。通常,当在数据库中存储敏感信息(如密码、API密钥等)时,您会想对其进行散列或加密。
您可以在队列任务、通知、可邮件类和监听器上做完全相同的事情!
在本文章中,我们将简要介绍如何使用Illuminate\Contracts\Queue\ShouldBeEncrypted
接口来加密您的队列类,以提高安全性。
加密Laravel任务
为了理解为什么我们需要加密您的任务、通知、可邮件类和监听器,让我们看看一个基本的例子。
让我们假设我们的应用程序在登录时需要一次性密码(OTP)。因此,我们生成OTP并将其发送给用户(无论是通过电子邮件、短信等)。我们可能有一个类似以下的作业类
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendOneTimePassword implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*/
public function __construct(public readonly string $oneTimePassword)
{
//
}
// ...
}
在上面的类中,我们不太关心如何发送OTP。我们更关心被传递到作业中的参数。在这个例子中,是一次性密码。
要运行作业,我们将这样做(注意我们传递给OTP的123456
)
\App\Jobs\SendOneTimePassword::dispatch('123456');
在我们调度任务时,数据会被序列化并存储在队列存储中(如数据库或Redis)。在这里,数据等待队列工作器从队列中提取并处理任务。
如果你或他人恶意访问队列存储,他们可以看到以下关于待处理任务的信息(以下内容经过美化以便阅读):
{
"uuid": "3d05be68-8cd0-4c3a-8d05-71e86871713a",
"displayName": "App\\Jobs\\SendOneTimePassword",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "App\\Jobs\\SendOneTimePassword",
"command": "O:28:\"App\\Jobs\\SendOneTimePassword\":1:
{s:15:\"oneTimePassword\";s:6:\"123456\";}"
}
}
你发现了吗?
在 data.command
字段中,oneTimePassword
属性以明文形式可见!如果有人访问队列存储,他们可以看到OTP。
这就可能是任何其他你不想泄露的敏感信息,比如API密钥、密码、社会保障号码等。
为了防止这种情况,我们可以更新我们的任务类以实现 Illuminate\Contracts\Queue\ShouldBeEncrypted
接口
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendOneTimePassword implements ShouldQueue, ShouldBeEncrypted
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*/
public function __construct(public readonly string $oneTimePassword)
{
//
}
// ...
}
使用此接口的结果是,Laravel现在在将数据存储到队列存储之前会进行加密,然后在从队列中提取任务以进行处理时进行解密。
让我们来看看使用 ShouldBeEncrypted
接口后作业数据可能是什么样子
{
"uuid": "ea194df6-ebe1-42a6-9e46-b7ece3b61781",
"displayName": "App\\Jobs\\SendOneTimePassword",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "App\\Jobs\\SendOneTimePassword",
"command": "eyJpdiI6IjRpR1FuRG5NTWpMZ28vdytUaGE0Rmc9PSIsInZhbHVlIjoicERX
MnJieGVleHp3czhYb3drb1N3ZnpHdHd2MVB1OFYvK24xbmlEUHdMcHk4K2Rr
ekdQMk9uczVFWFBmVkYvc1NneXMwVWVndlBxQkZySThkaTV6bk5NaVAzWnpG
aTN2MTZkSEVOUElYQzFSMFMxSnl5NzBkL0V1R1JwUDRYVTUiLCJtYWMiOiI0
NTQ4MmU3NmFhMzg1MjZkODcxNDc5YzQyNzE5ZTFlOWQxNzE4OWNlNTE5ODRl
YmJkN2ZiMjljYzI5Nzc4ODIyIiwidGFnIjoiIn0="
}
}
现在,在 data.command
字段中,oneTimePassword
属性已经加密!这意味着即使有人访问队列存储,他们也无法看到OTP。
当然,这是一个非常基础的例子,但你可以看到在与队列类处理的敏感信息中,这可以多么强大。
加密 Laravel 通知
你不仅可以在作业中使用 Illuminate\Contracts\Queue\ShouldBeEncrypted
接口,还可以用在队列中存储的队列通知、可邮件和监听器上。
这对于在队列存储中存储它们时为它们添加一个额外的安全层是很好的。
让我们来看一个可以用于发送一次性密码的示例通知
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SendOneTimePassword extends Notification implements ShouldQueue
{
use Queueable;
/**
* Create a new notification instance.
*/
public function __construct(public readonly string $oneTimePassword)
{
//
}
// ...
}
我们可以这样调度通知(再次注意我们传递的OTP 123456
)
use App\Notifications\SendOneTimePassword;
$user->notify(new SendOneTimePassword('123456'));
如果我们检查队列存储中等待发送的通知的数据,我们会看到以下内容
{
"uuid": "74e8c7d1-151d-4f05-aeae-b4dfcddba1a6",
"displayName": "App\\Notifications\\SendOneTimePassword",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Notifications\\SendQueuedNotifications",
"command": "O:48:\"Illuminate\\Notifications\\SendQueuedNotifications\":3:
{s:11:\"notifiables\";O:45:\"Illuminate\\Contracts\\Database
\\ModelIdentifier\":5:{s:5:\"class\";s:15:\"App\\Models\\User\"
;s:2:\"id\";a:1:{i:0;i:1;}s:9:\"relations\";a:0:{}s:10:\"
connection\";s:5:\"mysql\";s:15:\"collectionClass\";N;}s:12:
\"notification\";O:37:\"App\\Notifications\\SendOneTimePassword
\":2:{s:15:\"oneTimePassword\";s:6:\"123456\";s:2:\"id\";s:36
:\"9494b2db-7362-4936-8e31-5179594a1c01\";}s:8:\"channels\";
a:1:{i:0;s:4:\"mail\";}}"
}
}
同样,在 data.command
字段中,oneTimePassword
属性以明文形式可见!
然而,我们可以更新我们的通知类以实现 Illuminate\Contracts\Queue\ShouldBeEncrypted
接口
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SendOneTimePassword extends Notification implements ShouldQueue, ShouldBeEncrypted
{
// ...
}
这将导致在队列存储中存储的待处理通知的数据进行加密
{
"uuid": "6dc8206c-c06c-4f21-a495-659a61546864",
"displayName": "App\\Notifications\\SendOneTimePassword",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Notifications\\SendQueuedNotifications",
"command": "eyJpdiI6InV3V0V0dTM0eXRLa0xWdHpnajBqcEE9PSIsInZhbHVlIjoiTkd5M2
pVZUpSMFVOdlJEa0lDY2d4MzdLdE1URW5rUC9iZERoSGFkVEJ4M3ZMSERlcVhi
ZmViUEg4S1R6ZlZzQ2dIY0JQV2N0VXczWGs5dGE3Y3JUUkRwN2hVWkNTRlVtTz
FRQkVnMkVtM0VhWnBRd2U4d05mOS9EVzhuV29JK0pNYkx1cEtIb2hDbm5MbWdH
aVNrR3VPTjI3em5uMkFKbG00dVNRak5BRGFhRkZqeUtodDU0Q2tCaWNBamR2eU
1Ec2pDaTBoN0dSbEpRRnROczl5b09CVUlmT2laVDZVZTdxdU9PbGtwQlV1S0lz
RGRMdTlmVTRWRTZMNnRFbFczZ3NSb25TM0kyYmFyTTIyYmtwY3ZheTJibURhNX
dXQkV1ZjEwSStGRzFBN1gxQmRYZzRodXc3UEY4a05teCtPVU1sVG0yN3hOd3pB
TjdyOFluR0gxckdYeHdNZitYYmJMeUxlcm4yRUl5NVB2NHN4WmRrZzJhYVNiRX
cydzQ3WkM4YTFrZ1dIRnBqLzVndnJOc0U2R1JTUm0vdWVkVVBuUTcvUmcxOWVP
UER1SjN1VTR1cDQ1eDB1a0l0SWFTMHhQWCtEMkVjcDYzS1AvS042djlHTmo1eU
11NWdUcGl0dTlkSWVONVIwLzhOZ2M0SDdHQ1k2S0FJUWh4UTJzT3VRR2dESFpK
MERwZ1dMZUFrRy9aZU55TUdTN3I4SDJjcTQ1M0tjZS9CekZrb3p1OFFucU5YM0
pwTWN1Y1BjTWVCc3E0RDlaSlErSndNRnVZeFFtNExsbzFQSUR6Vmo0WGZSMXJN
TzNteXgvMEZnRGMxRU9CS1pBZUNEbnV1YVB1b0RZb25ENXQ3WjFuN3RZcHFLZ1
ByamxNa1dlTVV1bmZRWE5hcXd6UXpUZmlzOXc9IiwibWFjIjoiYzgyNjA5MGNk
NTA3ZmM2MGNiMGQ3MjFjYzQyNTk2MWI0OWZiMGVmMTUyODFjMjYwNDM1YzM1MW
MyZjY3YmY5YSIsInRhZyI6IiJ9"
}
}
加密 Laravel 可邮件
类似于我们加密作业和通知的方式,我们也可以非常容易地加密可邮件。
让我们看看这个示例可邮件类,它可以用于发送一次性密码
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class SendOneTimePassword extends Mailable implements ShouldQueue, ShouldBeEncrypted
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(public readonly string $oneTimePassword)
{
//
}
// ...
}
我们可以这样发送可邮件(再次注意我们传递的OTP 123456
)
use App\Mail\SendOneTimePassword;
use Illuminate\Support\Facades\Mail;
Mail::send(new SendOneTimePassword('123456'));
如果我们检查队列存储中等待发送的可邮件的数据,我们会看到以下内容
{
"uuid": "07d4671a-b350-4203-9152-d95d10398879",
"displayName": "App\\Mail\\EncryptedMail",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Mail\\SendQueuedMailable",
"command": "O:34:\"Illuminate\\Mail\\SendQueuedMailable\":15:{s:8
:\"mailable\";O:22:\"App\\Mail\\EncryptedMail\":2:{s:
15:\"oneTimePassword\";s:6:\"123456\";s:6:\"mailer\";
s:7:\"mailgun\";}s:5:\"tries\";N;s:7:\"timeout\";N;s:
13:\"maxExceptions\";N;s:17:\"shouldBeEncrypted\";b:0;
s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"
chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"
chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\"
;N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}s:3
:\"job\";N;}"
}
}
就像与作业和通知一样,oneTimePassword
属性在 data.command
字段中以明文形式可见!
但我们可以更新可邮件类以实现 Illuminate\Contracts\Queue\ShouldBeEncrypted
接口
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class SendOneTimePassword extends Mailable implements ShouldQueue, ShouldBeEncrypted
{
// ...
}
这会导致在队列存储中存储的待处理可邮件的数据进行加密
{
"uuid": "e1296554-44b3-4bbb-b5ff-daa6f1660861",
"displayName": "App\\Mail\\EncryptedMail",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Mail\\SendQueuedMailable",
"command": "eyJpdiI6Im1PQUZUWlFmMllYUnNLZmJ2cUxFTlE9PSIsInZhbHVlIjoiUG1SSkJ
kY1NpdmpsNTVhc0U3dHYzcXFabFUxdkw5blZQSlU4OGw5eHNCNy9DUjlhUFEzZl
V3UGFTRVpiNitSaGZFUElZN0xITEcwYnQzMFZtSGk0bGFVdW5GcWNBVlh2K0Vja
FA1dUFmcmVFa1RqNEhDSmthSVJ0c3RweUhlUEJRQTNzUWpmZHhtTVZxVGZSZER3
d1VvZURETFpEb2lPL1VENUhTTjU4eEY2Mk4vemhRL29RTVE4TGVQNklOazAwY1J
wOFRjMTUydVZZZmd4aWZCY2xQUUNvMmw4bXhhczgvYThCV1dnaENZaURFTWw1OG
kybEg2cFVYaDZSS3ZRMERKMzJZZDB4M1c0ZXN0bThJNG1oNlNrdVpGeUZmN2crM
Wl6c09oVkNIN2Y2QVN4dkNXM0hzMGh0N3pDakxpZWpmbjJ2VldHdVdPWWtKcnph
WGRPUW9POTdQN0syVXNWa0ZUa000SmdrelVFQ1hrUkNrYUV3SXhkcGJGamMwZEV
XSjRpOWJhZ25FL0NUZ0lpeERWcG9YWjNkT3ozeEJCVG5LTmVoNzB0bkVPeUs0dm
JxQ2VCRzhsVk42TGF1Y2djYWsxc0ZtQjdPbWtVanF3c3p4cjY5b3d6VTFZRkVPV
mI1SDlJbGRKeHN6Sy9BOTF1K0UrZnJvNjNja0JXME55ZlBNY1FCWkJ6U3BJbnVE
YkJzZFdVNFE1aHdCUDNBTzdva3RBdFkzeDA1WExGTlRacys1V01pNTNzOVU4U2R
ZYUduRHBVSE5lQ3FnSVBQZXVBb2VLSzlKVzVhSkJLaWZKS3gzZm5KUWR3UXRLND
0iLCJtYWMiOiI1NjEyZjljMmZjNjlmMWI3NmIzYjQxM2MwMmQyNWM0YmIxODg4Z
jNlNGM5ODAyOTk4YmRiYzYzOGZjNjZhYjU0IiwidGFnIjoiIn0="
}
}
加密 Laravel 监听器
最后,我们还可以使用 Illuminate\Contracts\Queue\ShouldBeEncrypted
接口加密监听器。
让我们想象一个接受构造函数中的一次性密码的事件
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class MyAwesomeEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*/
public function __construct(public readonly string $oneTimePassword)
{
//
}
// ...
}
然后我们会有一个队列监听器监听这个事件
namespace App\Listeners;
use App\Events\MyAwesomeEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class QueuedListener implements ShouldQueue
{
/**
* Create the event listener.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*/
public function handle(MyAwesomeEvent $event): void
{
//
}
}
值得注意的是,在这种情况下,直接包含敏感数据的是事件,而不是监听器。
我们可以这样调度事件(再次注意我们传递的OTP 123456
)
use App\Events\MyAwesomeEvent;
use Illuminate\Support\Facades\Event;
Event::dispatch(new MyAwesomeEvent('123456'));
果然,如果我们检查待处理监听器队列存储中的数据,我们会看到以下内容:
{
"uuid": "e395f426-1ae5-463b-bf27-6340528dc845",
"displayName": "App\\Listeners\\QueuedListener",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Events\\CallQueuedListener",
"command": "O:36:\"Illuminate\\Events\\CallQueuedListener\":20:{s:5:\"
class\";s:28:\"App\\Listeners\\QueuedListener\";s:6:\"
method\";s:6:\"handle\";s:4:\"data\";a:1:{i:0;O:25:\"App\\
Events\\MyAwesomeEvent\":1:{s:15:\"oneTimePassword\";s:6:\"
123456\";}}s:5:\"tries\";N;s:13:\"maxExceptions\";N;s:7:\"
backoff\";N;s:10:\"retryUntil\";N;s:7:\"timeout\";N;s:13:\"
failOnTimeout\";b:0;s:17:\"shouldBeEncrypted\";b:0;s:3:\"
job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"
chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"
chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit
\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"
}
}
但是,我们可以更新QueuedListener
类以实现Illuminate\Contracts\Queue\ShouldBeEncrypted
接口
namespace App\Listeners;
use App\Events\MyAwesomeEvent;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class QueuedListener implements ShouldQueue, ShouldBeEncrypted
{
/**
* Create the event listener.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*/
public function handle(MyAwesomeEvent $event): void
{
//
}
}
结果,待处理监听器的数据现在在队列存储中存储时将被加密
{
"uuid": "f6e2d019-95b0-4385-9c8d-9004d998388c",
"displayName": "App\\Listeners\\QueuedListener",
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"maxTries": null,
"maxExceptions": null,
"failOnTimeout": false,
"backoff": null,
"timeout": null,
"retryUntil": null,
"data": {
"commandName": "Illuminate\\Events\\CallQueuedListener",
"command": "eyJpdiI6InJobm5sSTFxdnpueUR3T2k3eHF1NWc9PSIsInZhbHVlIjoiWi9aMGJ
ub0orNmtZbmVtWEVUT1l6T09XU2NvdUxxb3pSZW5PNFlibnFSTWNteHJtU255bN
STBXamlFVVl3UzgrRDBxSkw5UzdHbHF2QmdWenJBL3FPZitaQ3FMRURlcnBVbFB
U4em1tS0NmNWMreUM2R0hTMEwxN0Z2WFEwVnkzQmZjR0NjZ1pOSGt6TzlsRTUOH
MGRIZlFud0h4RzVFSmliUlBnamhrOCtMUWpFRW5JSlVvdTNnUE1OWGRleGhMENq
M4Uk0zdjE3SU8xbVRERFBGOE1meUlrSHZramhYSWZXNkdEanNBVFlDcVUy3NkeE
RGZCcVlDRlFSM09WNlNSdjRZSTJTUHZWdFhUU2thTXpYQUtZa2dPSlQ2SZrS21W
phZEo1S0h2QmFYRlVhR0wzVldEcmxJYzBqbG5HZFdRc25zU2xmNnNNVSIOHIrQ2
UXFJcDZFZ29LSTcxQThsV0l2S0l3S1RqcGtvRTVtWnZ4VUdwcTNvNjgQUpubjRr
lmZ3dCbGdjNkpzQTIyZ3A5ZnJmY2tZdU1JU3hQaUVISlM4aXJnNk1xC9HZk1QRE
Vk1VWGRvL0R0ek1RcURyc1hKZjY2UFZjVExkVm1NSHpSVnFNSGRLchOR1Jyc2Uz
RzSURGL09sUnZ1ekNMYnQ5b2dUL0dMMGdJU0JkN2MraFhPTlJrR2yMEMrRndOVW
RTFKZ0RPTFBidWJ6SlhJMnpheVQyanNvOUFEWnlhWk1QN1g1NHheEVhQmd1amVG
h4SjhhT0FrWnRDNXZIT1dncUdLY1hNMGRydWNyTi9KZjhtdVZEEtxN1BMd2hRMz
dGFvcE5MUElybngzOGtvZzBqSzZNSncrWnNBbDA0U0h1QkMvdBoUm93Wk9VT0Y3
FZM2Eya0xzaWxTK0hmSlJxa0JQa3RxeTAva2UxSWhYM2FyMmqZDJRNUhCbFFNVG
d2xMYXJoSiswU0FNcmVQRy9IIiwibWFjIjoiMTg4NjdhZjUY2MxMGIwZGRmNTgy
lkOTAxNDZjN2EwNWI1MGZjMjIyMmE5ZTNmYzg3NDdlNTg0TVlY2I0MyIsInRhZy
IiJ9"
}
}
我应该加密我的Laravel作业吗?
加密您的队列类可以是一种为您的应用程序添加额外安全层的好方法。它可以帮助保护敏感信息,防止被未授权访问队列存储的人泄露。
最好的部分是,这非常容易实现(如上所述)!您需要做的所有事情就是在您的队列类中实现Illuminate\Contracts\Queue\ShouldBeEncrypted
接口。
然而,值得注意的是,加密和解密数据会给您的应用程序增加一些开销。现在我实际上没有任何基准测试来说明这个开销有多大或多小。它可能会非常小,以至于可以忽略不计。另一方面,它可能会对您的应用程序性能产生明显影响,特别是对于大型应用程序。
如果我能取得任何基准测试,我肯定会更新这篇文章的结果。
但是,至少,我建议加密包含敏感信息的所有队列类。这可能包括诸如密码、API密钥、社会保障号码等事物。
如果您进行了实验并发现开销并不太大,那么您可能希望考虑加密所有队列类,以便保持一致性。但请记住,这需要您进行测试并了解它如何影响您的应用程序。因此,这不是一个一刀切的答案。
延伸阅读
如果您对了解其他保护应用程序中传递的敏感信息的方法感兴趣,您也可能想查看我的"在PHP中编辑敏感参数"文章。
它介绍了如何使用PHP的内置#[\SensitiveParameter]
从日志和堆栈跟踪中编辑敏感信息。
结论
希望这篇文章能够迅速了解如何使用Illuminate\Contracts\Queue\ShouldBeEncrypted
接口加密您的队列Laravel作业、通知、邮件通知和监听器,以提高安全性。
如果您喜欢阅读这篇文章,我很乐意听到您的意见。同样,如果您有任何改进未来的文章的建议,我也很乐意听到。
您可能还对检查我的220多页的电子书"Battle Ready Laravel"感兴趣,它更深入地涵盖了类似主题。
或者,您可能想看看我其他的440多页电子书"在Laravel中消费API",它教授您如何使用Laravel从其他服务消费API。
如果您有兴趣在每次我发布新文章时都收到更新,请随时注册我的时事通讯。
继续构建出色的事物! 🚀
driesvints 赞同了这篇文章