Dela via


Använda Always Encrypted med PHP-drivrutiner för SQL Server

Ladda ned PHP-drivrutin

Gäller för

  • Microsoft Drivers 5.2 för PHP för SQL Server

Introduction

Den här artikeln innehåller information om hur du utvecklar PHP-program med always encrypted (databasmotor) och PHP-drivrutiner för SQL Server.

Always Encrypted gör att klientprogram kan kryptera känsliga data och aldrig avslöja data eller krypteringsnycklar till SQL Server eller Azure SQL Database. En Always Encrypted-aktiverad drivrutin, till exempel ODBC-drivrutinen för SQL Server, krypterar och dekrypterar transparent känsliga data i klientprogrammet. Drivrutinen avgör automatiskt vilka frågeparametrar som motsvarar känsliga databaskolumner (skyddade med Always Encrypted) och krypterar värdena för dessa parametrar innan data skickas till SQL Server eller Azure SQL Database. På samma sätt avkrypterar drivrutinen på ett transparent sätt data som hämtats från krypterade databaskolumner i förfrågningsresultat. Mer information finns i Always Encrypted (Databasmotor). PHP-drivrutinerna för SQL Server använder ODBC-drivrutinen för SQL Server för att kryptera känsliga data.

Förutsättningar

  • Konfigurera Always Encrypted i databasen. Den här konfigurationen omfattar etablering av Always Encrypted-nycklar och konfiguration av kryptering för valda databaskolumner. Om du inte redan har en databas med Always Encrypted konfigurerad följer du anvisningarna i Självstudie: Komma igång med Always Encrypted. I synnerhet bör databasen innehålla metadatadefinitionerna för en kolumnhuvudnyckel (CMK), en kolumnkrypteringsnyckel (CEK) och en tabell som innehåller en eller flera kolumner som krypterats med den CEK:en.
  • Kontrollera att ODBC-drivrutinen för SQL Server version 17 eller senare är installerad på utvecklingsdatorn. Mer information finns i ODBC-drivrutin för SQL Server.

Aktivera Always Encrypted i ett PHP-program

Det enklaste sättet att aktivera kryptering av parametrar som riktar sig till de krypterade kolumnerna och dekrypteringen av frågeresultat är genom att ange värdet för nyckelordet för anslutningssträngen ColumnEncryption till Enabled. Följande är exempel på hur du aktiverar Always Encrypted i SQLSRV- och PDO_SQLSRV drivrutiner:

SQLSRV:

$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled");
$conn = sqlsrv_connect($server, $connectionInfo);

PDO_SQLSRV:

$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);

Det räcker inte att aktivera Always Encrypted för att kryptering eller dekryptering ska lyckas. Du måste också se till att:

  • Programmet har databasbehörigheten VIEW ANY COLUMN MASTER KEY DEFINITION och VIEW ANY COLUMN ENCRYPTION KEY DEFINITION, som krävs för att få åtkomst till metadata om "Always Encrypted-nycklar" i databasen. Mer information finns i Databasbehörighet.
  • Programmet kan komma åt den CMK som skyddar CEK:erna för de efterfrågade krypterade kolumnerna. Det här kravet är beroende av nyckellagringsprovidern som lagrar CMK:en. Mer information finns i Hantera kolumnhuvudnyckellagring.

Hämta och ändra data i krypterade kolumner

När du aktiverar Always Encrypted på en anslutning kan du använda SQLSRV-STANDARD-API:er (se SQLSRV Driver API-referens) eller PDO_SQLSRV API:er (se PDO_SQLSRV API-referens för drivrutinen) för att hämta eller ändra data i krypterade databaskolumner. Förutsatt att ditt program har nödvändiga databasbehörigheter och kan komma åt kolumnhuvudnyckeln krypterar drivrutinen alla frågeparametrar som riktar sig mot krypterade kolumner och dekrypterar data som hämtats från krypterade kolumner och beter sig transparent mot programmet som om kolumnerna inte var krypterade.

Om Always Encrypted inte är aktiverat misslyckas frågor med parametrar som är avsedda för krypterade kolumner. Data kan fortfarande hämtas från krypterade kolumner, så länge frågan inte har några parametrar för krypterade kolumner. Drivrutinen försöker dock inte dekryptera och programmet tar emot binära krypterade data (som bytematriser).

I följande tabell sammanfattas beteendet för frågor, beroende på om Always Encrypted är aktiverat eller inte:

Frågeegenskaper Always Encrypted är aktiverat och programmet kan komma åt nycklar och nyckelmetadata Always Encrypted är aktiverat och programmet kan inte komma åt nycklar eller nyckelmetadata Always Encrypted är inaktiverat
Parametrar som riktar sig till krypterade kolumner. Parametervärden krypteras transparent. Error Error
Hämtar data från krypterade kolumner utan parametrar som riktar sig mot krypterade kolumner. Resultat från krypterade kolumner dekrypteras transparent. Programmet tar emot kolumnvärden i klartext. Error Resultat från krypterade kolumner dekrypteras inte. Programmet tar emot krypterade värden som bytematriser.

I följande exempel visas hur du hämtar och ändrar data i krypterade kolumner. Exemplen förutsätter en tabell med följande schema. Kolumnerna SSN och BirthDate krypteras.

CREATE TABLE [dbo].[Patients](
 [PatientId] [int] IDENTITY(1,1),
 [SSN] [char](11) COLLATE Latin1_General_BIN2
 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC,
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
 [FirstName] [nvarchar](50) NULL,
 [LastName] [nvarchar](50) NULL,
 [BirthDate] [date]
 ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED,
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL
 PRIMARY KEY CLUSTERED ([PatientId] ASC) ON [PRIMARY])
 GO

Exempel på datainfogning

Följande exempel visar hur du använder SQLSRV- och PDO_SQLSRV drivrutiner för att infoga en rad i tabellen Patient. Observera följande punkter:

  • Det finns inget specifikt för kryptering i exempelkoden. Drivrutinen identifierar och krypterar automatiskt värdena för parametrarna SSN och BirthDate, som är avsedda för krypterade kolumner. Den här mekanismen gör kryptering transparent för programmet.
  • Värdena som infogas i databaskolumner, inklusive de krypterade kolumnerna, skickas som bundna parametrar. Även om det är valfritt att använda parametrar när du skickar värden till icke-krypterade kolumner (även om det rekommenderas starkt eftersom det hjälper till att förhindra SQL-inmatning), krävs det för värden som riktar sig till krypterade kolumner. Om värdena som infogats i SSN- eller BirthDate-kolumnerna skickades som literaler inbäddade i frågeuttryck skulle frågan misslyckas eftersom drivrutinen inte försöker kryptera eller på annat sätt bearbeta literaler i frågor. Därför skulle servern avvisa dem som inkompatibla med de krypterade kolumnerna.
  • När du infogar värden med hjälp av bindningsparametrar måste en SQL-typ som är identisk med datatypen för målkolumnen eller vars konvertering till målkolumnens datatyp stöds skickas till databasen. Det här kravet beror på att Always Encrypted stöder få typkonverteringar (mer information finns i Always Encrypted (Database Engine)). De två PHP-drivrutinerna, SQLSRV och PDO_SQLSRV, har var och en mekanism för att hjälpa användaren att fastställa SQL-typen av värdet. Därför behöver användaren inte uttryckligen ange SQL-typen.
    • För SQLSRV-drivrutinen har användaren två alternativ:
      • Förlita dig på PHP-drivrutinen för att fastställa och ange rätt SQL-typ. I det här fallet måste användaren använda sqlsrv_prepare och sqlsrv_execute köra en parametriserad fråga.
      • Ange SQL-typen uttryckligen.
    • För den PDO_SQLSRV drivrutinen kan användaren inte uttryckligen ange SQL-typen för en parameter. Drivrutinen PDO_SQLSRV hjälper automatiskt användaren att fastställa SQL-typen vid bindning av en parameter.
  • För drivrutinerna för att fastställa SQL-typen gäller vissa begränsningar:
    • SQLSRV-drivrutin:
      • Om användaren vill att drivrutinen ska fastställa SQL-typerna för de krypterade kolumnerna måste användaren använda sqlsrv_prepare och sqlsrv_execute.
      • Om sqlsrv_query så önskas ansvarar användaren för att ange SQL-typerna för alla parametrar. Den angivna SQL-typen måste innehålla stränglängden för strängtyper och skalning och precision för decimaltyper.
    • PDO_SQLSRV drivrutin:
      • Instruktionsattributet PDO::SQLSRV_ATTR_DIRECT_QUERY stöds inte i en parametriserad fråga.
      • Instruktionsattributet PDO::ATTR_EMULATE_PREPARES stöds inte i en parametriserad fråga.

SQLSRV-drivrutin och sqlsrv_prepare:

// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Abel;
$birthDate = "1996-10-19";
$params = array($ssn, $firstName, $lastName, $birthDate);
// during sqlsrv_prepare, the driver determines the SQL types for each parameter and pass them to SQL Server
$stmt = sqlsrv_prepare($conn, $query, $params);
sqlsrv_execute($stmt);

SQLSRV-drivrutin och sqlsrv_query:

// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Abel";
$birthDate = "1996-10-19";
// need to provide the SQL types for ALL parameters
// note the SQL types (including the string length) have to be the same at the column definition
$params = array(array(&$ssn, null, null, SQLSRV_SQLTYPE_CHAR(11)),
                array(&$firstName, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
                array(&$lastName, null, null, SQLSRV_SQLTYPE_NVARCHAR(50)),
                array(&$birthDate, null, null, SQLSRV_SQLTYPE_DATE));
sqlsrv_query($conn, $query, $params);

PDO_SQLSRV drivrutin och PDO::prepare:

// insertion into encrypted columns must use a parameterized query
$query = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?)";
$ssn = "795-73-9838";
$firstName = "Catherine";
$lastName = "Able";
$birthDate = "1996-10-19";
// during PDO::prepare, the driver determines the SQL types for each parameter and pass them to SQL Server
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $ssn);
$stmt->bindParam(2, $firstName);
$stmt->bindParam(3, $lastName);
$stmt->bindParam(4, $birthDate);
$stmt->execute();

Exempel på datahämtning i klartext

I följande exempel visas filtrering av data baserat på krypterade värden och hämtning av klartextdata från krypterade kolumner med hjälp av SQLSRV- och PDO_SQLSRV-drivrutiner. Observera följande punkter:

  • Värdet som används i WHERE-satsen för att filtrera på SSN-kolumnen måste skickas med hjälp av en bindningsparameter, så att drivrutinen kan kryptera den transparent innan den skickas till servern.
  • När du kör en fråga med bundna parametrar avgör PHP-drivrutinerna automatiskt SQL-typen för användaren såvida inte användaren uttryckligen anger SQL-typen när du använder SQLSRV-drivrutinen.
  • Alla värden som skrivs ut av programmet är i klartext, eftersom drivrutinen transparent dekrypterar data som hämtats från kolumnerna SSN och BirthDate.

Anmärkning

Frågor kan endast utföra likhetsjämförelser på krypterade kolumner om krypteringen är deterministisk.

SQLSRV:

// since SSN is an encrypted column, need to pass the value in the WHERE clause through bind parameter
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = ?";
$ssn = "795-73-9838";
$stmt = sqlsrv_prepare($conn, $query, array(&$ssn));
// during sqlsrv_execute, the driver encrypts the ssn value and passes it to the database
sqlsrv_execute($stmt);
// fetch like usual
$row = sqlsrv_fetch_array($stmt);

PDO_SQLSRV:

// since SSN is an encrypted column, need to pass the value in the WHERE clause through bind parameter
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = ?";
$ssn = "795-73-9838";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $ssn);
// during PDOStatement::execute, the driver encrypts the ssn value and passes it to the database
$stmt->execute();
// fetch like usual
$row = $stmt->fetch();

Exempel på hämtning av chiffertextdata

Om Always Encrypted inte är aktiverat kan en fråga fortfarande hämta data från krypterade kolumner, så länge frågan inte har några parametrar för krypterade kolumner.

I följande exempel visas hur du hämtar binärkrypterade data från krypterade kolumner med hjälp av SQLSRV- och PDO_SQLSRV-drivrutinerna. Observera följande punkter:

  • Eftersom Always Encrypted inte är aktiverat i anslutningssträngen returnerar frågan krypterade värden för SSN och BirthDate som bytematriser (programmet konverterar värdena till strängar).
  • En fråga som hämtar data från krypterade kolumner med Always Encrypted inaktiverad kan ha parametrar, så länge ingen av parametrarna riktar sig mot en krypterad kolumn. Följande fråga filtreras efter LastName, som inte är krypterad i databasen. Om frågan filtreras efter SSN eller BirthDate misslyckas frågan.

SQLSRV:

$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName] = ?";
$lastName = "Abel";
$stmt = sqlsrv_prepare($conn, $query, array(&$lastName));
sqlsrv_execute($stmt);
$row = sqlsrv_fetch_array($stmt);

PDO_SQLSRV:

$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName] = ?";
$lastName = "Abel";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $lastName);
$stmt->execute();
$row = $stmt->fetch();

Undvik vanliga problem vid frågor om krypterade kolumner

I det här avsnittet beskrivs vanliga felkategorier när du kör frågor mot krypterade kolumner från PHP-program och några riktlinjer för hur du undviker dem.

Konverteringsfel av datatyp som inte stöds

Always Encrypted stöder få konverteringar för krypterade datatyper. Se Always Encrypted (Databasmotor) för den detaljerade listan över typkonverteringar som stöds. Gör följande för att undvika datatypkonverteringsfel:

  • När du använder SQLSRV-drivrutinen med sqlsrv_prepare och sqlsrv_execute SQL-typen, tillsammans med kolumnstorleken och antalet decimaltal för parametern bestäms automatiskt.
  • När du använder PDO_SQLSRV drivrutinen för att köra en fråga bestäms även SQL-typen med kolumnstorleken och antalet decimalsiffror för parametern automatiskt
  • När du använder SQLSRV-drivrutinen med sqlsrv_query för att köra en fråga:
    • SQL-typen för parametern är antingen exakt samma som typen av målkolumn, eller så stöds konverteringen från SQL-typen till kolumnens typ.
    • Precisionen och skalan för parametrarna som riktar sig mot kolumnerna för datatyperna decimal och numeric SQL Server är samma som precisionen och skalningskonfigurationen för målkolumnen.
    • Precisionen för parametrar som riktar sig till kolumner i datetime2, datetimeoffseteller time SQL Server-datatyper är inte större än precisionen för målkolumnen i frågor som ändrar målkolumnen.
  • Använd inte PDO_SQLSRV-instruktionsattribut PDO::SQLSRV_ATTR_DIRECT_QUERY eller PDO::ATTR_EMULATE_PREPARES i en parameteriserad fråga

Fel som beror på att klartext skickas i stället för krypterade värden

Alla värden som är inriktade på en krypterad kolumn måste krypteras innan de skickas till servern. Ett försök att infoga, ändra eller filtrera efter ett klartextvärde i en krypterad kolumn resulterar i ett fel. Om du vill förhindra sådana fel kontrollerar du att:

  • Always Encrypted är aktiverat (i anslutningssträngen anger du nyckelordet ColumnEncryption till Enabled).
  • Du använder bindningsparametern för att skicka data som riktar sig mot krypterade kolumner. I följande exempel visas en fråga som felaktigt filtreras av en literal/konstant i en krypterad kolumn (SSN):
$query = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";

Kontrollera prestandapåverkan för Always Encrypted

Eftersom Always Encrypted är en krypteringsteknik på klientsidan observeras de flesta prestandakostnaderna på klientsidan, inte i databasen. Förutom kostnaden för krypterings- och dekrypteringsåtgärder är de andra källorna till prestandakostnader på klientsidan:

  • Extra rundturer till databasen för att hämta metadata för frågeparametrar.
  • Anropar ett huvudnyckelarkiv för kolumner för att få åtkomst till en kolumnhuvudnyckel.

Rundturer för att hämta metadata för frågeparametrar

Om Always Encrypted är aktiverat för en anslutning anropar ODBC-drivrutinen som standard sys.sp_describe_parameter_encryption för varje parametriserad fråga och skickar frågeuttryck (utan parametervärden) till SQL Server. Den här lagrade proceduren analyserar frågeinstrukturen för att ta reda på om några parametrar behöver krypteras och returnerar i så fall krypteringsrelaterad information för varje parameter så att drivrutinen kan kryptera dem.

Eftersom PHP-drivrutinerna tillåter att användaren binder en parameter i en förberedd instruktion utan att ange SQL-typen, anropar PHP-drivrutinerna SQLDescribeParam på parametern för att hämta SQL-typ, kolumnstorlek och decimalsiffror när de binder en parameter i en Always Encrypted-aktiverad anslutning. Metadata används sedan för att anropa SQLBindParameter. Dessa extra SQLDescribeParam anrop kräver inte extra turer till databasen eftersom ODBC-drivrutinen redan har lagrat informationen på klientsidan när sys.sp_describe_parameter_encryption den anropades.

Ovanstående beteenden säkerställer en hög transparensnivå för klientprogrammet (och programutvecklaren) behöver inte vara medveten om vilka frågor som har åtkomst till krypterade kolumner, så länge värdena som riktar sig mot krypterade kolumner skickas till drivrutinen i parametrar.

Till skillnad från ODBC-drivrutinen för SQL Server stöds inte aktivering av Always Encrypted på instruktions-/frågenivå ännu i PHP-drivrutinerna.

Cachelagring av kolumnkrypteringsnyckel

För att minska antalet anrop till ett kolumnhuvudnyckelarkiv för att dekryptera kolumnkrypteringsnycklar (CEK) cachelagrar drivrutinen klartext-CEK:erna i minnet. Efter att ha tagit emot den krypterade CEK (ECEK) från databasmetadata försöker ODBC-drivrutinen först hitta den CEK i klartext som motsvarar det krypterade nyckelvärdet i cacheminnet. Drivrutinen anropar nyckelarkivet som innehåller CMK endast om den inte kan hitta motsvarande CEK i klartext i cacheminnet.

Obs! I ODBC-drivrutinen för SQL Server avlägsnas posterna i cacheminnet efter en timeout på två timmar. Det här beteendet innebär att drivrutinen endast kontaktar nyckelarkivet en gång under programmets livslängd eller varannan timme, beroende på vilket som är mindre.

Arbeta med lagring av kolumnhuvudnycklar

För att kryptera eller dekryptera data måste drivrutinen hämta en CEK som har konfigurerats för målkolumnen. CEK:er lagras i krypterad form (ECEK:er) i databasmetadata. Varje CEK har en motsvarande CMK som användes för att kryptera den. Databasmetadata lagrar inte själva CMK:t. den innehåller bara namnet på nyckelarkivet och information som nyckelarkivet kan använda för att hitta CMK:en.

För att hämta klartextvärdet för en ECEK hämtar drivrutinen först metadata om både CEK och dess motsvarande CMK, och sedan använder den den här informationen för att kontakta nyckelarkivet som innehåller CMK och begär att den dekrypterar ECEK. Drivrutinen kommunicerar med ett nyckelarkiv med hjälp av en nyckellagringsprovider.

För Microsoft Driver 5.3.0 för PHP för SQL Server stöds endast Windows Certificate Store-providern och Azure Key Vault. Den andra Keystore-providern som stöds av ODBC-drivrutinen (anpassad nyckellagringsprovider) stöds inte ännu.

Använda Windows Certificate Store-providern

ODBC-drivrutinen för SQL Server i Windows innehåller en inbyggd kolumnhuvudnyckellagringsprovider för Windows Certificate Store med namnet MSSQL_CERTIFICATE_STORE. (Den här providern är inte tillgänglig i macOS eller Linux.) Med den här providern lagras CMK:n lokalt på klientdatorn och det krävs ingen annan konfiguration av programmet för att använda den med drivrutinen. Programmet måste dock ha åtkomst till certifikatet och dess privata nyckel i arkivet. Mer information finns i Skapa och lagra kolumnhuvudnycklar (Always Encrypted).

Använda Azure Key Vault

Azure Key Vault erbjuder ett sätt att lagra krypteringsnycklar, lösenord och andra hemligheter med Hjälp av Azure och kan användas för att lagra nycklar för Always Encrypted. ODBC-drivrutinen för SQL Server (version 17 och senare) innehåller en inbyggd huvudnyckellagringsprovider för Azure Key Vault. Följande anslutningsalternativ hanterar Azure Key Vault-konfigurationen: KeyStoreAuthentication, KeyStorePrincipalIdoch KeyStoreSecret.

  • KeyStoreAuthentication kan ta ett av två möjliga strängvärden: KeyVaultPassword och KeyVaultClientSecret. Dessa värden styr vilken typ av autentiseringsuppgifter som används med de andra två nyckelorden.
  • KeyStorePrincipalId tar en sträng som representerar en identifierare för kontot som försöker komma åt Azure Key Vault.
    • Om KeyStoreAuthentication är inställt på KeyVaultPasswordmåste vara KeyStorePrincipalId namnet på en Microsoft Entra-användare.
    • Om KeyStoreAuthentication är inställt på KeyVaultClientSecretmåste det KeyStorePrincipalId vara ett programklient-ID.
  • KeyStoreSecret tar en sträng som representerar en autentiseringsnyckel.
    • Om KeyStoreAuthentication är inställt på KeyVaultPasswordmåste vara KeyStoreSecret användarens lösenord.
    • Om KeyStoreAuthentication är inställt på KeyVaultClientSecretmåste vara KeyStoreSecret programhemligheten som är associerad med programklient-ID:t.

Alla tre alternativen måste finnas i anslutningssträngen för att kunna använda Azure Key Vault. ColumnEncryption Måste också anges till Enabled. Om ColumnEncryption är inställt på Disabled men alternativen för Azure Key Vault finns fortsätter skriptet utan fel, men ingen kryptering utförs.

I följande exempel visas hur du ansluter till SQL Server med hjälp av Azure Key Vault.

SQLSRV:

Använda ett Microsoft Entra-konto:

$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultPassword", "KeyStorePrincipalId"=>$MSEntraUsername, "KeyStoreSecret"=>$MSEntraPassword);
$conn = sqlsrv_connect($server, $connectionInfo);

Använda ett Azure-programklient-ID och en hemlighet:

$connectionInfo = array("Database"=>$databaseName, "UID"=>$uid, "PWD"=>$pwd, "ColumnEncryption"=>"Enabled", "KeyStoreAuthentication"=>"KeyVaultClientSecret", "KeyStorePrincipalId"=>$applicationClientID, "KeyStoreSecret"=>$applicationClientSecret);
$conn = sqlsrv_connect($server, $connectionInfo);

PDO_SQLSRV: Använda ett Microsoft Entra-konto:

$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultPassword; KeyStorePrincipalId = $AADUsername; KeyStoreSecret = $AADPassword;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);

Använda ett Azure-programklient-ID och en hemlighet:

$connectionInfo = "Database = $databaseName; ColumnEncryption = Enabled; KeyStoreAuthentication = KeyVaultClientSecret; KeyStorePrincipalId = $applicationClientID; KeyStoreSecret = $applicationClientSecret;";
$conn = new PDO("sqlsrv:server = $server; $connectionInfo", $uid, $pwd);

Begränsningar för PHP-drivrutiner när du använder Always Encrypted

SQLSRV och PDO_SQLSRV:

  • Linux/macOS stöder inte Windows Certificate Store-provider
  • Tvinga parameterkryptering
  • Aktivera Always Encrypted på instruktionsnivå
  • När du använder funktionen Always Encrypted och andra språk än UTF8 i Linux och macOS (till exempel "en_US.ISO-8859-1"), kan det hända att det inte fungerar att infoga nullvärde eller en tom sträng i en krypterad teckenkolumn av typen char(n) om inte teckenuppsättning 1252 har installerats på ditt system.

SQLSRV endast:

  • Använda sqlsrv_query för bindningsparameter utan att ange SQL-typ
  • Använda sqlsrv_prepare för bindningsparametrar i en batch med SQL-instruktioner

endast PDO_SQLSRV:

  • PDO::SQLSRV_ATTR_DIRECT_QUERY instruktionsattribut som anges i en parametriserad fråga
  • PDO::ATTR_EMULATE_PREPARE instruktionsattribut som anges i en parametriserad fråga
  • bindningsparametrar i en batch med SQL-instruktioner

PHP-drivrutinerna ärver också de begränsningar som har införts av ODBC-drivrutinen för SQL Server och databasen. Se Begränsningar för ODBC-drivrutinen när du använder Always Encrypted - och Always Encrypted-begränsningar.

Se även

Programmeringsguide för PHP SQL-drivrutin
API-referens för SQLSRV-drivrutin
API-referens för PDO_SQLSRV-drivrutin