![](/img/trans.png)
[英]How to escape mysql database name to prevent sql injection in cakephp3?
[英]How to manually escape a boolean value for a mySQL Database insert in CakePHP?
我有以下代碼:
/** @var DboSource $db */
$db = $this->getDataSource();
var_dump($db->value($open, 'boolean'));
die;
$this->query(
'INSERT INTO foo(`client_id`, `open`, `modified`, `created`) VALUES(:clientId, :open, NOW(), NOW()) ON DUPLICATE KEY UPDATE modified = now();',
[
':clientId' => $db->value($clientId, 'integer'),
':open' => $db->value($open, 'boolean')
]
);
$open
是一個布爾值, 'open'
-column定義為tinyint(1)
。 當用$db->value($open, 'boolean')
包裝$ open時,結果為'1'
, '0'
(請參見單引號)。
不幸的是,此輸出導致open = false
的新記錄(因為未正確將true
插入'1'
)
如果我使用$db->boolean($open)
作為選項,則一切正常。
但是我認為$db->value()
應該做同樣的工作嗎?
查看何時以及如何在內部使用DboSource::value()
,這是預期的行為。 如果它不做它所做的事情,那么就不會為Model::save()
操作正確准備值。
DboSource::value()
內部將“ booleanized”值( DboSource::boolean($value, true)
已將引號引起來)傳遞給PDO::quote()
,無論如何該值都將被引用,即0
, 1
, '0'
, '1'
, true
或false
,這將始終返回引述的值,即'0'
, '1'
或甚至''
(為false
,這是等於0
)。
您的代碼的問題是,傳遞給Model::query()
的第二個參數的值最終將傳遞給PDOStatement::execute()
( ... / DboSource.php#L458 ),它將所有值視為字符串並相應地對其進行轉義,因此最終在您的查詢中, '1'
將以'\\'1\\''
結尾,因此出現了問題。
TL; DR
這似乎是預期的行為,但文獻記錄很少。 因此,當使用Model::query()
的第二個參數時,如有必要,對值進行清理(即,轉換為整數,布爾值,字符串等),但不要對其進行轉義,僅當您在實際查詢中手動插入它們時才對它們進行轉義字符串( 但是應盡可能避免使用 )!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.