Я настроил эту процедуру:
DELIMITER //
CREATE PROCEDURE get_news
(IN news_id INT)
BEGIN
SELECT title, body, datetime FROM News
WHERE id = news_id;
END //
DELIMITER ;
И у меня есть этот код PHP:
$news_id = $_GET["id"];
$dbConnection = new mysqli("localhost","root","","identidad_digital_db");
$sql = "CALL get_news($news_id)";
$result = $dbConnection->query($sql);
$count = $result->num_rows;
if($count==0){
header( 'Location: id_not_found.html' );
}
$m = $result->fetch_assoc()
Я думал, что моя процедура исправит SQL-инъекцию.Тем не менее, уязвимость все еще работает.«id» должен быть только целым числом.Таким образом, базовая инъекция «7» и «1» = «2» работает.
Почему это не работает?Как я могу правильно настроить мою процедуру?Я прочитал документацию и некоторые примеры, но я не знаю, как это сделать.
ОБНОВЛЕНИЕ
Я использую регулярное выражение, но оно также не работает:
BEGIN
IF news_id IS NOT NULL AND news_id RLIKE '^[0-9]+$'
THEN
SELECT title, body, datetime FROM News
WHERE id = news_id;
END IF;
END //