From 4c04ce01c23e9769203099dbf0af463c8a7488ed Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 17 Feb 2018 09:39:29 +0100 Subject: [PATCH] Fix/test more sql injections --- DataStorage/Database/Query/Builder.php | 16 ++++++++-- .../Database/Query/BuilderTest.php | 30 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/DataStorage/Database/Query/Builder.php b/DataStorage/Database/Query/Builder.php index 68c282b4e..4eb2fda55 100644 --- a/DataStorage/Database/Query/Builder.php +++ b/DataStorage/Database/Query/Builder.php @@ -728,7 +728,7 @@ class Builder extends BuilderAbstract * * @since 1.0.0 */ - public function offset($offset) : Builder + public function offset(int $offset) : Builder { $this->offset = $offset; @@ -744,7 +744,7 @@ class Builder extends BuilderAbstract * * @since 1.0.0 */ - public function limit($limit) : Builder + public function limit(int $limit) : Builder { $this->limit = $limit; @@ -933,6 +933,18 @@ class Builder extends BuilderAbstract return $this; } + /** + * Get insert values + * + * @return array + * + * @since 1.0.0 + */ + public function getValues() : array + { + return $this->values; + } + /** * Values to insert. * diff --git a/tests/DataStorage/Database/Query/BuilderTest.php b/tests/DataStorage/Database/Query/BuilderTest.php index 3b652e5cf..6fe34032d 100644 --- a/tests/DataStorage/Database/Query/BuilderTest.php +++ b/tests/DataStorage/Database/Query/BuilderTest.php @@ -62,6 +62,16 @@ class BuilderTest extends \PHPUnit\Framework\TestCase ->orderBy(['a.test', 'b.test', ], ['ASC', 'DESC', ]) ->toSql() ); + + $query = new Builder($this->con); + $sql = 'SELECT `a`.`test`, `b`.`test` FROM `a`, `b` WHERE `a`.`test` = :abcValue ORDER BY `a`.`test` ASC, `b`.`test` DESC;'; + self::assertEquals($sql, + $query->select('a.test', 'b.test') + ->from('a', 'b') + ->where('a.test', '=', ':abcValue') + ->orderBy(['a.test', 'b.test', ], ['ASC', 'DESC', ]) + ->toSql() + ); } public function testMysqlOrder() @@ -114,6 +124,10 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', 1)->groupBy('a', 'b')->toSql()); + + $query = new Builder($this->con); + $sql = 'SELECT `a`.`test` FROM `a` WHERE `a`.`test` = :test GROUP BY `a`, `b`;'; + self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', ':test')->groupBy('a', 'b')->toSql()); } public function testMysqlWheres() @@ -169,6 +183,10 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'SELECT `a`.`test` FROM `a` WHERE `a`.`test` = 1 OR `a`.`test2` IN (\'a\', \'b\', \'c\');'; self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', 1)->whereIn('a.test2', ['a', 'b', 'c'], 'or')->toSql()); + + $query = new Builder($this->con); + $sql = 'SELECT `a`.`test` FROM `a` WHERE `a`.`test` = :testWhere OR `a`.`test2` IN (\'a\', :bValue, \'c\');'; + self::assertEquals($sql, $query->select('a.test')->from('a')->where('a.test', '=', ':testWhere')->whereIn('a.test2', ['a', ':bValue', 'c'], 'or')->toSql()); } public function testMysqlInsert() @@ -180,6 +198,10 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'INSERT INTO `a` (`test`, `test2`) VALUES (1, \'test\');'; self::assertEquals($sql, $query->insert('test', 'test2')->into('a')->values(1, 'test')->toSql()); + + $query = new Builder($this->con); + $sql = 'INSERT INTO `a` (`test`, `test2`) VALUES (:test, :test2);'; + self::assertEquals($sql, $query->insert('test', 'test2')->into('a')->values(':test', ':test2')->toSql()); } public function testMysqlDelete() @@ -187,6 +209,10 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'DELETE FROM `a` WHERE `a`.`test` = 1;'; self::assertEquals($sql, $query->delete()->from('a')->where('a.test', '=', 1)->toSql()); + + $query = new Builder($this->con); + $sql = 'DELETE FROM `a` WHERE `a`.`test` = :testVal;'; + self::assertEquals($sql, $query->delete()->from('a')->where('a.test', '=', ':testVal')->toSql()); } public function testMysqlUpdate() @@ -194,6 +220,10 @@ class BuilderTest extends \PHPUnit\Framework\TestCase $query = new Builder($this->con); $sql = 'UPDATE `a` SET `a`.`test` = 1, `a`.`test2` = 2 WHERE `a`.`test` = 1;'; self::assertEquals($sql, $query->update('a')->set(['a.test' => 1])->set(['a.test2' => 2])->where('a.test', '=', 1)->toSql()); + + $query = new Builder($this->con); + $sql = 'UPDATE `a` SET `a`.`test` = 1, `a`.`test2` = :test2 WHERE `a`.`test` = :test3;'; + self::assertEquals($sql, $query->update('a')->set(['a.test' => 1])->set(['a.test2' => ':test2'])->where('a.test', '=', ':test3')->toSql()); } public function testRaw()