仅使用 INT 变量配置 MySQL 存储过程

Configure MySQL Stored Procedure with only INT variable

我已经配置了这个程序:

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 //

已解决!

我将 news_id 配置为 varchar(20)。显然,在我看来这些值是 int 类型,但它们来自 PHP 形式,所以它们是字符串。顺便说一句,如果它对某人有帮助,这就是我最终得到的:

DELIMITER //
DROP PROCEDURE IF EXISTS get_news //
CREATE PROCEDURE get_news
(IN news_id VARCHAR(20))
BEGIN
  IF news_id IS NOT NULL AND news_id REGEXP '^[1-9]+$' THEN
    SELECT id, title, body, datetime FROM News
    WHERE id = news_id;
  END IF;

END //
DELIMITER ;

您可以为此使用 CAST:

IF CAST(news_id AS UNSIGNED) > 0 THEN
   ...
END IF;

但是,我认为您应该在 php 中执行此操作:

if(isset($news_id) && is_numeric($news_id)){
     ...
}