'In Clause in mysql with sql injection
I have written an mysql update query in PHP with preventing sql injections as:
UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)
where id field with integer data type.
I am getting problem in executing this problem as implode generate a comma separated string and ids are not assigned with IN clause as it becomes:
array(implode(',' $ids) == array(1,2,3, 1)
first three are id's and fourth value in array is active field value but statement consider first two values from array (i.e. 1,2) to replace '?' in query
Note: there is no problem in the query as if same query without using preventing sql injection as
UPDATE table1 SET status = 1 WHERE id IN ( 1,2,3 ) and active = 1
is working fine. Only issue with the PHP implode function.
Solution 1:[1]
You can prevent the sql injection when specifically cast all values in the array to int. Then it will be safe.
$intCastedIds = array_map('intval', $ids);
In case you have injecting code in your $ids array the intval will cast all values to int. So it's not possible to inject in this particular case.
So instead of:
UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)
do something like:
'UPDATE table1 status = 1 WHERE id IN (' . implode(',', $intCastedIds) . ') and active = ?', 1)
Solution 2:[2]
Use Prepared Statements!
Check out this article that details how you can still use prepared statements with a dynamic amount of variables..
http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Dan |