Your PostgreSQL application doesn't just talk directly to the database — it goes through a stack of drivers, ORMs, and SDKs. Each layer has its own vulnerability surface. In 2026, the risk is not only in your application logic or in the database server itself: it lives in your requirements.txt, your package.json, and in how your ORM translates Python or TypeScript into SQL.

Votre application PostgreSQL ne communique pas directement avec la base de données — elle passe par une pile de drivers, d'ORM et de SDK. Chaque couche a sa propre surface de vulnérabilité. En 2026, le risque ne réside plus seulement dans la logique applicative ou dans le serveur de base de données lui-même : il se cache dans votre requirements.txt, dans votre package.json, et dans la façon dont votre ORM traduit le Python ou le TypeScript en SQL.

This guide covers the four most common database dependency risks for PostgreSQL-backed applications in 2026: psycopg2-binary's bundled OpenSSL supply chain risk, Prisma ORM's injection vulnerabilities, SQLAlchemy's silent raw query traps, and database credentials leaking through developer environments.

Ce guide couvre les quatre risques de dépendances de base de données les plus courants pour les applications PostgreSQL en 2026 : le risque supply chain d'OpenSSL intégré dans psycopg2-binary, les vulnérabilités d'injection dans Prisma ORM, les pièges silencieux des requêtes brutes dans SQLAlchemy, et la fuite de credentials de base de données dans les environnements développeurs.

28.65M
New hardcoded secrets on GitHub in 2025 (+34% YoY)
Nouveaux secrets hardcodés sur GitHub en 2025 (+34% YoY)
Source: GitGuardian State of Secrets Sprawl 2026
64%
Of secrets leaked in 2022 were still valid in January 2026
Des secrets fuités en 2022 étaient encore valides en janvier 2026
Source: GitGuardian State of Secrets Sprawl 2026
32.2%
Of internal repos contain hardcoded secrets — 6× more than public repos
Des repos internes contiennent des secrets hardcodés — 6× plus que les repos publics
Source: GitGuardian State of Secrets Sprawl 2026

psycopg2-binary: The OpenSSL Bundle Problem

psycopg2-binary : Le problème du bundle OpenSSL

psycopg2 is the most widely used PostgreSQL driver for Python — downloaded tens of millions of times each month from PyPI. Most developers install psycopg2-binary (the pre-built wheel variant) instead of compiling from source, because it requires no system dependencies. This convenience comes with a hidden cost.

psycopg2 est le driver PostgreSQL le plus utilisé en Python — téléchargé des dizaines de millions de fois chaque mois sur PyPI. La plupart des développeurs installent psycopg2-binary (la variante wheel pré-compilée) plutôt que de compiler depuis les sources, car elle ne nécessite aucune dépendance système. Cette commodité a un coût caché.

Supply Chain Risk — psycopg2-binary
Risque Supply Chain — psycopg2-binary

psycopg2-binary bundles its own copy of libpq (the PostgreSQL client library) and OpenSSL. These bundled versions are independent of your system's versions, meaning they are invisible to your OS package manager and may not be updated when OpenSSL CVEs are patched. Vulnerability scanners that check only your Python imports will miss CVEs in these bundled native libraries.

psycopg2-binary embarque sa propre copie de libpq (la bibliothèque client PostgreSQL) et d'OpenSSL. Ces versions bundlées sont indépendantes de celles de votre système, ce qui signifie qu'elles sont invisibles pour votre gestionnaire de paquets OS et peuvent ne pas être mises à jour lors du patch des CVE OpenSSL. Les scanners de vulnérabilités qui ne vérifient que vos imports Python passeront à côté des CVE dans ces bibliothèques natives bundlées.

The psycopg2 project itself has acknowledged this in GitHub issue #1043: "Bundling 3rd party dependencies is a security risk." When a critical OpenSSL CVE is released, your system OpenSSL gets patched by your OS package manager, but the OpenSSL copy inside psycopg2-binary only gets updated when the psycopg2 team releases a new binary wheel — which may lag by days or weeks.

Le projet psycopg2 lui-même a reconnu ce problème dans l'issue GitHub #1043 : "Bundler des dépendances tierces est un risque de sécurité." Quand une CVE critique OpenSSL est publiée, votre OpenSSL système est patché par votre gestionnaire de paquets OS, mais la copie OpenSSL dans psycopg2-binary n'est mise à jour que lorsque l'équipe psycopg2 publie un nouveau wheel binaire — ce qui peut prendre des jours ou des semaines.

The fix is straightforward: install psycopg2 (not psycopg2-binary) in production and compile it against your system's libpq. For projects starting in 2026, consider migrating to psycopg3 (psycopg), which uses the system libpq by default and follows modern async patterns.

La correction est simple : installez psycopg2 (pas psycopg2-binary) en production et compilez-le contre le libpq de votre système. Pour les projets démarrant en 2026, envisagez de migrer vers psycopg3 (psycopg), qui utilise le libpq système par défaut et suit des patterns async modernes.

# Production requirements.txt
# Avoid:
psycopg2-binary==2.9.10

# Use instead (requires libpq-dev on the build host):
psycopg2==2.9.10

# Or migrate to psycopg3 (async-native, uses system libpq):
psycopg[binary]==3.2.6    # binary variant for dev only
psycopg==3.2.6            # pure Python + system libpq for prod

asyncpg, the other popular async PostgreSQL driver for Python, does not bundle OpenSSL in the same way — it uses the system libssl directly. However, it is compiled as a native extension (C extension via Cython), which means you still need to monitor it via pip-audit or OSV-based tooling for known CVEs in the published wheel.

asyncpg, l'autre driver PostgreSQL async populaire pour Python, ne bundle pas OpenSSL de la même façon — il utilise le libssl système directement. Cependant, c'est une extension native (extension C via Cython), ce qui signifie que vous devez quand même le surveiller via pip-audit ou des outils basés sur OSV pour les CVE connues dans le wheel publié.

Prisma ORM: Three Injection Attack Vectors

Prisma ORM : Trois vecteurs d'attaque par injection

Prisma is the dominant TypeScript/Node.js ORM for PostgreSQL in 2026. Its type-safe query API gives developers confidence that their queries are safe — but that confidence has limits. There are three distinct injection attack vectors in Prisma that developers need to understand.

Prisma est l'ORM TypeScript/Node.js dominant pour PostgreSQL en 2026. Son API de requêtes type-safe donne aux développeurs la confiance que leurs requêtes sont sûres — mais cette confiance a des limites. Il existe trois vecteurs d'attaque par injection distincts dans Prisma que les développeurs doivent comprendre.

1. $queryRawUnsafe — The Explicit Risk

1. $queryRawUnsafe — Le risque explicite

Prisma exposes both safe and unsafe raw query methods. The unsafe variant bypasses all of Prisma's escaping mechanisms and is vulnerable to classic SQL injection when user input is interpolated directly:

Prisma expose des méthodes de requêtes brutes sûres et non sûres. La variante non sûre contourne tous les mécanismes d'échappement de Prisma et est vulnérable à l'injection SQL classique lorsque l'input utilisateur est interpolé directement :

// VULNERABLE — never do this
const userId = req.query.id;  // could be: "1 OR 1=1"
const user = await prisma.$queryRawUnsafe(
  `SELECT * FROM users WHERE id = ${userId}`
);

// SAFE — always use $queryRaw with tagged template literals
const user = await prisma.$queryRaw`
  SELECT * FROM users WHERE id = ${userId}
`;

// ALSO SAFE — using Prisma.sql for composed queries
const filter = Prisma.sql`id = ${userId}`;
const user = await prisma.$queryRaw`SELECT * FROM users WHERE ${filter}`;

2. plORMbing — Time-Based ORM Leak Attacks

2. plORMbing — Attaques ORM Leak par délai temporel

In 2024, security researchers at elttam published the plORMbing technique: a time-based ORM Leak attack specific to Prisma. Unlike classic SQL injection, this attack exploits the fact that Prisma gives developers unusually fine control over query structure — including the ability to pass arbitrary SQL fragments in certain query patterns. By injecting crafted timing expressions, an attacker can exfiltrate data from your database one bit at a time, even through a properly sanitized application layer.

En 2024, des chercheurs en sécurité chez elttam ont publié la technique plORMbing : une attaque ORM Leak par délai temporel spécifique à Prisma. Contrairement à l'injection SQL classique, cette attaque exploite le fait que Prisma donne aux développeurs un contrôle inhabituellement fin sur la structure des requêtes — y compris la possibilité de passer des fragments SQL arbitraires dans certains patterns de requête. En injectant des expressions de timing craftées, un attaquant peut exfiltrer des données de votre base de données bit par bit, même à travers une couche applicative correctement nettoyée.

elttam released plormber — a proof-of-concept tool that automates plORMbing attacks against Prisma. If your application exposes any Prisma query method to user-controlled input (even indirectly), review your code against the elttam attack patterns. The technique was rated among PortSwigger's top web hacking techniques of 2025.

elttam a publié plormber — un outil de preuve de concept qui automatise les attaques plORMbing contre Prisma. Si votre application expose une méthode de requête Prisma à des inputs contrôlés par l'utilisateur (même indirectement), passez votre code en revue par rapport aux patterns d'attaque d'elttam. La technique a été classée parmi les meilleures techniques de web hacking 2025 par PortSwigger.

3. Operator Injection — The Surprising Risk in Relational Databases

3. Injection d'opérateurs — Le risque surprenant dans les bases relationnelles

Aikido Security researchers discovered that Prisma ORM is vulnerable to a NoSQL-style operator injection attack — even when used with PostgreSQL, a fully relational database. Prisma's query operators (not, in, contains, startsWith, etc.) are valid inputs in findFirst, findMany, updateMany, and deleteMany. These operators are not filtered at runtime because they are part of the expected API.

Les chercheurs d'Aikido Security ont découvert que Prisma ORM est vulnérable à une attaque par injection d'opérateurs de style NoSQL — même lorsqu'il est utilisé avec PostgreSQL, une base de données entièrement relationnelle. Les opérateurs de requête Prisma (not, in, contains, startsWith, etc.) sont des inputs valides dans findFirst, findMany, updateMany et deleteMany. Ces opérateurs ne sont pas filtrés à l'exécution car ils font partie de l'API attendue.

// Vulnerable endpoint: takes a JSON body and passes to Prisma directly
app.post('/login', async (req, res) => {
  const { email, password } = req.body;  // ← user-controlled

  const user = await prisma.user.findFirst({
    where: { email, password }  // ← dangerous: no input validation
  });
  if (user) return res.json({ token: sign(user.id) });
  return res.status(401).json({ error: 'Invalid credentials' });
});

// Attacker sends: { "email": "victim@example.com", "password": { "not": "" } }
// Prisma generates: WHERE email = 'victim@...' AND password != ''
// Result: authenticated as the victim without knowing their password

The fix: always validate input shape before passing it to Prisma. Use a schema validation library like Zod or Joi to enforce that password is a string, never an object.

La correction : validez toujours la forme des inputs avant de les passer à Prisma. Utilisez une bibliothèque de validation de schémas comme Zod ou Joi pour imposer que password est une chaîne, jamais un objet.

import { z } from 'zod';

const LoginSchema = z.object({
  email: z.string().email(),
  password: z.string().min(8).max(128),  // enforces string type — blocks { "not": "" }
});

app.post('/login', async (req, res) => {
  const { email, password } = LoginSchema.parse(req.body);  // throws if invalid
  const user = await prisma.user.findFirst({ where: { email, password } });
  // ...
});

SQLAlchemy: The Raw Query Trap

SQLAlchemy : Le piège des requêtes brutes

SQLAlchemy is the dominant Python ORM for PostgreSQL — used in FastAPI, Flask, and Django projects alike. Its ORM layer provides complete protection against SQL injection through parameterized queries. The problem is a common pattern that silently bypasses this protection: using Python f-strings or string formatting to build queries.

SQLAlchemy est l'ORM Python dominant pour PostgreSQL — utilisé dans les projets FastAPI, Flask et Django. Sa couche ORM offre une protection complète contre l'injection SQL via des requêtes paramétrées. Le problème est un pattern courant qui contourne silencieusement cette protection : l'utilisation des f-strings Python ou du formatage de chaînes pour construire des requêtes.

from sqlalchemy import text

# VULNERABLE — f-string injects user input directly into SQL
user_input = request.args.get('search')
result = db.execute(f"SELECT * FROM products WHERE name LIKE '%{user_input}%'")

# ALSO VULNERABLE — text() with string formatting does NOT protect you
result = db.execute(text(f"SELECT * FROM users WHERE id = {user_id}"))

# SAFE — text() with bound parameters
result = db.execute(
    text("SELECT * FROM users WHERE id = :user_id"),
    {"user_id": user_id}
)

# SAFEST — ORM query (parameterized automatically)
result = db.query(User).filter(User.id == user_id).first()

# SQLAlchemy 2.0 style (recommended)
stmt = select(User).where(User.id == user_id)
result = db.execute(stmt).scalar_one_or_none()

A particularly dangerous pattern is dynamic table or column names, which cannot be parameterized. If you must build queries with dynamic identifiers, use an explicit allowlist approach:

Un pattern particulièrement dangereux est celui des noms de tables ou de colonnes dynamiques, qui ne peuvent pas être paramétrés. Si vous devez construire des requêtes avec des identifiants dynamiques, utilisez une approche par liste d'autorisation explicite :

from sqlalchemy import text, inspect

# VULNERABLE — never use user input directly as a table/column name
table = request.args.get('table')  # could be: "users; DROP TABLE users --"
result = db.execute(text(f"SELECT * FROM {table}"))

# SAFE — allowlist of permitted table names
ALLOWED_TABLES = {'products', 'categories', 'reviews'}
table = request.args.get('table')
if table not in ALLOWED_TABLES:
    raise ValueError(f"Unknown table: {table}")

# For column names, use inspect() to verify they exist on the model
from sqlalchemy import Column
inspector = inspect(db.bind)
valid_columns = {c['name'] for c in inspector.get_columns('products')}
if sort_col not in valid_columns:
    sort_col = 'id'  # safe default

Database Credentials in Developer Environments

Credentials de base de données dans les environnements développeurs

The most common database security failure in 2026 is not a CVE in a driver — it is a production DATABASE_URL hardcoded in a .env file that got committed to Git, or a docker-compose.yml with plaintext database passwords stored in a public or internal repository.

La défaillance de sécurité de base de données la plus courante en 2026 n'est pas une CVE dans un driver — c'est un DATABASE_URL de production hardcodé dans un fichier .env qui a été commité dans Git, ou un docker-compose.yml avec des mots de passe de base de données en clair stockés dans un dépôt public ou interne.

3.2%
Of AI-assisted commits leak secrets — 2× the baseline rate
Des commits assistés par IA fuient des secrets — 2× le taux de base
Source: GitGuardian State of Secrets Sprawl 2026
28%
Of credential exposures originate outside repositories (Slack, Jira, Confluence)
Des expositions de credentials proviennent hors dépôts (Slack, Jira, Confluence)
Source: GitGuardian State of Secrets Sprawl 2026

Several database credential patterns are targeted by supply chain attacks in 2026. When malicious packages run postinstall scripts, they specifically look for these files:

Plusieurs patterns de credentials de base de données sont ciblés par les attaques supply chain en 2026. Quand des packages malveillants exécutent des scripts postinstall, ils recherchent spécifiquement ces fichiers :

# Files targeted by malware in 2026 supply chain attacks:
~/.pgpass                    # PostgreSQL password file
.env                         # DATABASE_URL, POSTGRES_PASSWORD
.env.local / .env.production
docker-compose.yml           # POSTGRES_PASSWORD env vars
prisma/.env                  # Prisma DATABASE_URL
alembic.ini                  # SQLAlchemy database URL
config/database.yml          # Rails-style DB config

Best practice for database connection strings: never store them in files that could be committed. Use environment variables injected at runtime from a secrets manager (HashiCorp Vault, AWS Secrets Manager, or your CI/CD platform's native secrets store). For Prisma, the DATABASE_URL in prisma/.env must be in your .gitignore — it is not automatically excluded.

Bonne pratique pour les chaînes de connexion : ne les stockez jamais dans des fichiers qui pourraient être commités. Utilisez des variables d'environnement injectées à l'exécution depuis un gestionnaire de secrets (HashiCorp Vault, AWS Secrets Manager, ou le store de secrets natif de votre plateforme CI/CD). Pour Prisma, le DATABASE_URL dans prisma/.env doit être dans votre .gitignore — il n'est pas exclu automatiquement.

# prisma/.gitignore — create this file if it doesn't exist
.env

# Or in root .gitignore — add all .env variants
.env
.env.*
!.env.example    # only commit the example template

Database Dependency Security Checklist for 2026

Checklist de sécurité des dépendances de base de données pour 2026

  • Use psycopg2 (not psycopg2-binary) in production — the binary variant bundles OpenSSL and libpq, making them invisible to OS-level patching. Build from source against system libpq-dev. Utiliser psycopg2 (pas psycopg2-binary) en production — la variante binary bundle OpenSSL et libpq, les rendant invisibles au patching au niveau OS. Compiler depuis les sources contre le libpq-dev système.
  • Validate input shape before passing to Prisma — use Zod or Joi to enforce that all query fields are the expected primitive types. Prevent operator injection by ensuring fields like password or email are always strings. Valider la forme des inputs avant de les passer à Prisma — utiliser Zod ou Joi pour imposer que tous les champs de requête sont des types primitifs attendus. Prévenir l'injection d'opérateurs en s'assurant que les champs comme password ou email sont toujours des chaînes.
  • Audit all $queryRawUnsafe usages — search your codebase for queryRawUnsafe and $executeRawUnsafe. Every occurrence should be reviewed; most can be replaced with safe tagged template literals. Auditer toutes les utilisations de $queryRawUnsafe — rechercher dans votre codebase queryRawUnsafe et $executeRawUnsafe. Chaque occurrence doit être passée en revue ; la plupart peuvent être remplacées par des template literals sûrs.
  • Replace f-strings in SQLAlchemy queries — search for f"SELECT, f"INSERT, f"UPDATE, f"DELETE, and .format( patterns in your Python code. Convert to bound parameters with text("... WHERE id = :id", {"id": val}). Remplacer les f-strings dans les requêtes SQLAlchemy — rechercher f"SELECT, f"INSERT, f"UPDATE, f"DELETE et les patterns .format( dans votre code Python. Convertir en paramètres liés avec text("... WHERE id = :id", {"id": val}).
  • Add prisma/.env to .gitignore — Prisma creates this file during prisma init and it is not automatically excluded from Git. It contains your DATABASE_URL. Ajouter prisma/.env au .gitignore — Prisma crée ce fichier lors de prisma init et il n'est pas automatiquement exclu de Git. Il contient votre DATABASE_URL.
  • Run pip-audit and npm audit on every PR — for psycopg2, asyncpg, SQLAlchemy, Prisma, and all database-related packages. CVEs in drivers are rare but real; automation catches them before they reach production. Exécuter pip-audit et npm audit sur chaque PR — pour psycopg2, asyncpg, SQLAlchemy, Prisma, et tous les packages liés à la base de données. Les CVE dans les drivers sont rares mais réelles ; l'automatisation les détecte avant qu'elles n'atteignent la production.
  • Rotate database credentials regularly — given that 64% of leaked secrets from 2022 are still valid today, implement automated rotation. AWS RDS, Cloud SQL, and Supabase all support managed credential rotation. For self-hosted PostgreSQL, consider using Vault's database secrets engine. Faire tourner les credentials de base de données régulièrement — étant donné que 64% des secrets fuités en 2022 sont encore valides aujourd'hui, implémenter la rotation automatique. AWS RDS, Cloud SQL et Supabase supportent tous la rotation gérée des credentials. Pour PostgreSQL auto-hébergé, considérer l'utilisation du moteur de secrets de base de données de Vault.
  • Pin your driver versions in lockfilespoetry.lock, requirements.txt with pinned hashes (--hash), or package-lock.json. Floating versions (psycopg2>=2.9) allow a supply chain attack to inject a malicious version. Épingler les versions de vos drivers dans les lockfilespoetry.lock, requirements.txt avec des hashes épinglés (--hash), ou package-lock.json. Les versions flottantes (psycopg2>=2.9) permettent à une attaque supply chain d'injecter une version malveillante.

supabase-js and node-postgres (pg): What to Know

supabase-js et node-postgres (pg) : Ce qu'il faut savoir

supabase-js (@supabase/supabase-js) is an npm package with millions of weekly downloads. Unlike psycopg2-binary, it does not bundle native libraries — it communicates with Supabase via the PostgREST API over HTTPS, so your local OpenSSL is never directly involved. Snyk's database currently shows no direct vulnerabilities for the published package. The primary risk with supabase-js is the supply chain risk common to all npm packages: monitor it via npm audit and lock your version in package-lock.json.

supabase-js (@supabase/supabase-js) est un package npm avec des millions de téléchargements par semaine. Contrairement à psycopg2-binary, il ne bundle pas de bibliothèques natives — il communique avec Supabase via l'API PostgREST sur HTTPS, donc votre OpenSSL local n'est jamais directement impliqué. La base de données Snyk ne montre actuellement aucune vulnérabilité directe pour le package publié. Le risque principal avec supabase-js est le risque supply chain commun à tous les packages npm : surveillez-le via npm audit et verrouillez votre version dans package-lock.json.

node-postgres (pg), the underlying PostgreSQL driver for Node.js, uses parameterized queries by default. The key risk is the same pattern as SQLAlchemy: string concatenation in raw query strings. Always use the parameterized form:

node-postgres (pg), le driver PostgreSQL sous-jacent pour Node.js, utilise des requêtes paramétrées par défaut. Le risque principal est le même pattern que SQLAlchemy : la concaténation de chaînes dans les chaînes de requêtes brutes. Utilisez toujours la forme paramétrée :

const { Pool } = require('pg');
const pool = new Pool();

// VULNERABLE — string concatenation
const result = await pool.query(
  `SELECT * FROM users WHERE email = '${email}'`
);

// SAFE — parameterized query
const result = await pool.query(
  'SELECT * FROM users WHERE email = $1',
  [email]
);

// ALSO SAFE — positional parameters in pg
const result = await pool.query(
  'SELECT * FROM orders WHERE user_id = $1 AND status = $2',
  [userId, status]
);

Frequently Asked Questions

Questions fréquentes

Is psycopg2-binary safe to use in development?

psycopg2-binary est-il sûr à utiliser en développement ?

For local development, psycopg2-binary is convenient and acceptable — you can install it without system-level PostgreSQL development headers. The security risk is in production deployments where the bundled OpenSSL may not receive timely updates. The psycopg2 documentation itself recommends against using the binary package in production for this reason.

Pour le développement local, psycopg2-binary est pratique et acceptable — vous pouvez l'installer sans les headers de développement PostgreSQL au niveau système. Le risque de sécurité concerne les déploiements en production où l'OpenSSL bundlé peut ne pas recevoir de mises à jour en temps opportun. La documentation psycopg2 elle-même déconseille l'utilisation du package binary en production pour cette raison.

Does using Prisma's typed ORM API protect me from all injection attacks?

L'utilisation de l'API ORM typée de Prisma me protège-t-elle de toutes les attaques par injection ?

Prisma's type-safe ORM methods (findFirst, create, update, etc.) protect you from classic SQL injection because they use parameterized queries internally. However, they do not protect you from operator injection if you pass unsanitized JSON objects as field values — this requires explicit input validation with a library like Zod. The plORMbing technique is an additional, more advanced vector that exploits Prisma's query composition features.

Les méthodes ORM type-safe de Prisma (findFirst, create, update, etc.) vous protègent de l'injection SQL classique car elles utilisent des requêtes paramétrées en interne. Cependant, elles ne vous protègent pas de l'injection d'opérateurs si vous passez des objets JSON non assainis comme valeurs de champs — cela nécessite une validation explicite des inputs avec une bibliothèque comme Zod. La technique plORMbing est un vecteur supplémentaire, plus avancé, qui exploite les fonctionnalités de composition de requêtes de Prisma.

How do I scan psycopg2-binary for the bundled OpenSSL version?

Comment scanner psycopg2-binary pour la version d'OpenSSL bundlée ?

Standard Python scanners like pip-audit and safety will detect CVEs for psycopg2 itself, but may not detect CVEs in the bundled native libraries like OpenSSL. To check the bundled OpenSSL version, use cve-bin-tool against the installed wheel directory, or use container-scanning tools like Trivy or Grype that scan at the binary level. The most reliable approach is to avoid psycopg2-binary in production entirely.

Les scanners Python standard comme pip-audit et safety détecteront les CVE pour psycopg2 lui-même, mais peuvent ne pas détecter les CVE dans les bibliothèques natives bundlées comme OpenSSL. Pour vérifier la version d'OpenSSL bundlée, utilisez cve-bin-tool contre le répertoire du wheel installé, ou utilisez des outils de scan de conteneurs comme Trivy ou Grype qui scannent au niveau binaire. L'approche la plus fiable est d'éviter complètement psycopg2-binary en production.

Should I migrate from psycopg2 to psycopg3?

Dois-je migrer de psycopg2 vers psycopg3 ?

For new projects in 2026, yes — psycopg (psycopg3) is the recommended choice. It was designed with async-first architecture, uses the system libpq by default (no bundled OpenSSL), and has an API that aligns better with modern Python async patterns. For existing psycopg2 projects, the migration requires code changes (the API is similar but not identical), so weigh the migration effort against your risk exposure.

Pour les nouveaux projets en 2026, oui — psycopg (psycopg3) est le choix recommandé. Il a été conçu avec une architecture async-first, utilise le libpq système par défaut (pas d'OpenSSL bundlé), et a une API qui s'aligne mieux avec les patterns async Python modernes. Pour les projets psycopg2 existants, la migration nécessite des modifications de code (l'API est similaire mais pas identique), donc évaluez l'effort de migration par rapport à votre exposition aux risques.

Are there CVEs in asyncpg in 2026?

Y a-t-il des CVE dans asyncpg en 2026 ?

No significant CVEs have been published for asyncpg itself in 2025-2026. asyncpg is a pure Python + Cython implementation that communicates with PostgreSQL via the binary protocol without bundling native TLS libraries. It inherits the TLS security of Python's stdlib ssl module, which is updated with your Python version. Monitor it with pip-audit and keep it up to date.

Aucune CVE significative n'a été publiée pour asyncpg lui-même en 2025-2026. asyncpg est une implémentation pure Python + Cython qui communique avec PostgreSQL via le protocole binaire sans bundler de bibliothèques TLS natives. Il hérite de la sécurité TLS du module ssl stdlib de Python, qui est mis à jour avec votre version Python. Surveillez-le avec pip-audit et maintenez-le à jour.

How does CVE OptiBot help with database dependency security?

Comment CVE OptiBot aide-t-il avec la sécurité des dépendances de base de données ?

CVE OptiBot scans your requirements.txt, poetry.lock, and package-lock.json for CVEs in all database-related packages — psycopg2, asyncpg, SQLAlchemy, Prisma, pg, and their transitive dependencies. When a new CVE is published that affects your pinned versions, you receive an immediate alert with CVSS score, affected versions, and the patched version to upgrade to. No code access required — just upload your lockfile.

CVE OptiBot scanne vos requirements.txt, poetry.lock et package-lock.json pour détecter les CVE dans tous les packages liés à la base de données — psycopg2, asyncpg, SQLAlchemy, Prisma, pg et leurs dépendances transitives. Quand une nouvelle CVE est publiée qui affecte vos versions épinglées, vous recevez une alerte immédiate avec le score CVSS, les versions affectées et la version patchée vers laquelle mettre à jour. Aucun accès au code requis — uploadez simplement votre lockfile.

Monitor Your Database Dependencies Automatically

Surveillez vos dépendances de base de données automatiquement

CVE OptiBot scans your lockfiles daily — requirements.txt, poetry.lock, package-lock.json — and alerts you the moment a CVE is published for psycopg2, SQLAlchemy, Prisma, asyncpg, or any other database driver in your stack. No agent, no code access, no noise.

CVE OptiBot scanne vos lockfiles chaque jour — requirements.txt, poetry.lock, package-lock.json — et vous alerte dès qu'une CVE est publiée pour psycopg2, SQLAlchemy, Prisma, asyncpg, ou tout autre driver de base de données dans votre stack. Pas d'agent, pas d'accès au code, pas de bruit.

Start free monitoring Démarrer le monitoring gratuit