Browse Source

Merge pull request #14389 from cakephp/issue-14381

Encode binary data in query logs.
othercorey 6 years ago
parent
commit
8de055e0ca
2 changed files with 22 additions and 0 deletions
  1. 5 0
      src/Database/Log/LoggedQuery.php
  2. 17 0
      tests/TestCase/Database/Log/LoggedQueryTest.php

+ 5 - 0
src/Database/Log/LoggedQuery.php

@@ -78,6 +78,11 @@ class LoggedQuery implements JsonSerializable
             }
 
             if (is_string($p)) {
+                // Likely binary data.
+                if (!ctype_print($p)) {
+                    $p = bin2hex($p);
+                }
+
                 $replacements = [
                     '$' => '\\$',
                     '\\' => '\\\\\\\\',

+ 17 - 0
tests/TestCase/Database/Log/LoggedQueryTest.php

@@ -18,6 +18,7 @@ namespace Cake\Test\TestCase\Database\Log;
 
 use Cake\Database\Log\LoggedQuery;
 use Cake\TestSuite\TestCase;
+use Cake\Utility\Text;
 
 /**
  * Tests LoggedQuery class
@@ -111,6 +112,22 @@ class LoggedQueryTest extends TestCase
         $this->assertEquals($expected, (string)$query);
     }
 
+    /**
+     * Tests that query placeholders are replaced when logged
+     *
+     * @return void
+     */
+    public function testBinaryInterpolation()
+    {
+        $query = new LoggedQuery();
+        $query->query = 'SELECT a FROM b where a = :p1';
+        $uuid = str_replace('-', '', Text::uuid());
+        $query->params = ['p1' => hex2bin($uuid)];
+
+        $expected = "duration=0 rows=0 SELECT a FROM b where a = '{$uuid}'";
+        $this->assertEquals($expected, (string)$query);
+    }
+
     public function testJsonSerialize()
     {
         $query = new LoggedQuery();