As I saw in many posts, dynamic SQL in a stored procedure is vulnerable to SQL injection. But if we use a previously prepared PDO with a prepared expression, is it still unsafe?
Example:
CREATE PROCEDURE my_sp(
IN in_var VARCHAR(32)
)
BEGIN
DECLARE query VARCHAR(255);
SET @query = CONCAT("SELECT * FROM my_table WHERE my_column = '",in_var,"' LIMIT 1;";
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
$dbh = new PDO( $connection_params );
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,"SET NAMES utf8mb4");
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "CALL my_sp( :in_var )";
$stmt = $dbh->prepare( $sql );
$stmt->execute( array( ':in_var' => $_POST['in_var'] ) );
Edition:
Sorry for resolving this issue again, but it’s not yet clear.
Example:
$in_var = " ' OR '1' = '1'; -- ";
$sql = "SELECT * FROM my_table WHERE my_column = '$in_var' ";
$sql = "SELECT * FROM my_table WHERE my_column = :in_var ";
$sql = "CALL my_sp( :in_var )";
$sql = "CALL my_sp( '$in_var' )";
I'm a newbie, and I know that my logic may not be very good, but it seems that when using a prepared statement in PDO, injection does not occur, although the procedure does not use a re-prepared statement.
source
share