== How to fix it in Core PHP

=== Code examples

The following code is vulnerable to deserialization attacks because it
deserializes HTTP data without validating it first.

==== Noncompliant code example

[source,php,diff-id=1,diff-type=noncompliant]
----
$cookie = $_COOKIE['session'];
$session = unserialize($session); // Noncompliant

echo $session->auth ? "OK" : "KO";
----

==== Compliant solution

[source,php,diff-id=1,diff-type=compliant]
----
$cookie = $_COOKIE['session'];
list($session, $mac) = explode('|', $cookie, 2);
$hash = hash_hmac("sha256", $session, $KEY);

if (hash_equals($hash, $mac)) {
    $session = unserialize($session);
} else {
    die;
}

echo $session->auth ? "OK" : "KO";
----

=== How does this work?

include::../../common/fix/introduction.adoc[]

include::../../common/fix/safer-serialization.adoc[]

include::../../common/fix/integrity-check.adoc[]

Here, the compliant code example uses the `hash_hmac` function to compute the
integrity tag of the untrusted data. The underlying hash algorithm is set to
`sha256`, which is considered strong for this use case.

include::../../common/fix/pre-approved-list.adoc[]

=== Pitfalls

include::../../common/pitfalls/constant-time.adoc[]

The compliant code example uses the `hash_equals` function to compare
authentication tags. This one benefits from constant-time implementation.
