upstash-qstash
Facilitates reliable serverless messaging and task scheduling with Upstash QStash, ensuring efficient HTTP-based task delivery.
Install this skill
Security score
The upstash-qstash skill was audited on May 12, 2026 and we found 68 security issues across 4 threat categories, including 2 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
Template literal with variable interpolation in command context
| 454 | deduplicationId: `charge-${orderId}`, // Same ID = same message |
Template literal with variable interpolation in command context
| 675 | await alerting.notify(`Email failed: ${data.sourceMessageId}`); |
Template literal with variable interpolation in command context
| 753 | console.log(`Group: ${group.name}`); |
Template literal with variable interpolation in command context
| 758 | console.log(` OK: ${endpoint.url}`); |
Template literal with variable interpolation in command context
| 760 | console.log(` DEAD: ${endpoint.url}`); |
Fetch to external URL
| 509 | await fetch('http://localhost:3000/api/process', { |
Webhook reference - potential data exfiltration
| 19 | - Verify signatures always - never trust unverified webhooks |
Webhook reference - potential data exfiltration
| 31 | - webhook-delivery |
Webhook reference - potential data exfiltration
| 63 | - webhook-fanout |
Webhook reference - potential data exfiltration
| 144 | // app/api/webhook/route.ts (Next.js App Router) |
Webhook reference - potential data exfiltration
| 276 | ### Not verifying QStash webhook signatures |
Webhook reference - potential data exfiltration
| 284 | - No Receiver import in webhook handler |
Webhook reference - potential data exfiltration
| 331 | Situation: Webhook handler does heavy processing. Takes 30+ seconds. QStash times out. |
Webhook reference - potential data exfiltration
| 335 | - Webhook timeouts in QStash dashboard |
Webhook reference - potential data exfiltration
| 368 | // Webhook receives trigger |
Webhook reference - potential data exfiltration
| 525 | Situation: Critical payment webhook uses defaults. 3 retries over minutes. Payment |
Webhook reference - potential data exfiltration
| 545 | url: 'https://myapp.com/api/payment-webhook', |
Webhook reference - potential data exfiltration
| 780 | ### Webhook signature verification |
Webhook reference - potential data exfiltration
| 784 | Message: QStash webhook handlers must verify signatures using Receiver |
Webhook reference - potential data exfiltration
| 883 | ### Reliable Webhooks |
Webhook reference - potential data exfiltration
| 890 | 1. Receive webhooks from Stripe (stripe-integration) |
Ngrok tunnel reference
| 499 | # Option 1: ngrok/localtunnel |
Ngrok tunnel reference
| 501 | ngrok http 3000 |
Ngrok tunnel reference
| 502 | # Use the ngrok URL for QStash testing |
Ngrok tunnel reference
| 818 | Fix action: Use a public URL (e.g., your deployed domain or ngrok for testing) |
Access to .env file
| 82 | token: process.env.QSTASH_TOKEN!, |
Access to .env file
| 117 | token: process.env.QSTASH_TOKEN!, |
Access to .env file
| 149 | currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY!, |
Access to .env file
| 150 | nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY!, |
Access to .env file
| 187 | token: process.env.QSTASH_TOKEN!, |
Access to .env file
| 226 | token: process.env.QSTASH_TOKEN!, |
Access to .env file
| 257 | token: process.env.QSTASH_TOKEN!, |
Access to .env file
| 300 | currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY!, |
Access to .env file
| 301 | nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY!, |
Access to .env file
| 508 | if (process.env.NODE_ENV === 'development') { |
Access to .env file
| 794 | Fix action: Configure both keys: new Receiver({ currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY, nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY }) |
Access to .env file
| 802 | Fix action: Use process.env.QSTASH_TOKEN |
Access to .env file
| 810 | Fix action: Use process.env.QSTASH_CURRENT_SIGNING_KEY and process.env.QSTASH_NEXT_SIGNING_KEY |
External URL reference
| 87 | url: 'https://myapp.com/api/process', |
External URL reference
| 96 | url: 'https://myapp.com/api/reminder', |
External URL reference
| 103 | url: 'https://myapp.com/api/scheduled', |
External URL reference
| 122 | destination: 'https://myapp.com/api/cron/daily-report', |
External URL reference
| 192 | url: 'https://myapp.com/api/critical-task', |
External URL reference
| 194 | callback: 'https://myapp.com/api/qstash-callback', |
External URL reference
| 195 | failureCallback: 'https://myapp.com/api/qstash-failed', |
External URL reference
| 233 | { url: 'https://inventory.myapp.com/api/process' }, |
External URL reference
| 234 | { url: 'https://shipping.myapp.com/api/process' }, |
External URL reference
| 235 | { url: 'https://analytics.myapp.com/api/track' }, |
External URL reference
| 262 | url: 'https://myapp.com/api/charge', |
External URL reference
| 269 | url: 'https://myapp.com/api/notify', |
External URL reference
| 370 | url: 'https://myapp.com/api/heavy-process', |
External URL reference
| 420 | url: 'https://myapp.com/api/process', |
External URL reference
| 452 | url: 'https://myapp.com/api/charge', |
External URL reference
| 459 | url: 'https://myapp.com/api/notify', |
External URL reference
| 509 | await fetch('http://localhost:3000/api/process', { |
External URL reference
| 545 | url: 'https://myapp.com/api/payment-webhook', |
External URL reference
| 553 | url: 'https://myapp.com/api/analytics', |
External URL reference
| 567 | url: 'https://myapp.com/api/critical', |
External URL reference
| 569 | failureCallback: 'https://myapp.com/api/dead-letter', |
External URL reference
| 596 | url: 'https://myapp.com/api/process', |
External URL reference
| 602 | url: 'https://myapp.com/api/process', |
External URL reference
| 643 | url: 'https://myapp.com/api/send-email', |
External URL reference
| 645 | callback: 'https://myapp.com/api/email-callback', |
External URL reference
| 646 | failureCallback: 'https://myapp.com/api/email-failed', |
External URL reference
| 706 | destination: 'https://myapp.com/api/daily-report', |
External URL reference
| 718 | destination: 'https://myapp.com/api/daily-report', |
External URL reference
| 771 | endpoints: [{ url: 'https://old-service.myapp.com/api/process' }], |
External URL reference
| 858 | Fix action: Add destination: 'https://your-app.com/api/endpoint' to schedule options |