仅使用int变量配置mysql存储过程

rekjcdws  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(395)

我已配置此过程:

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”注入工作。
为什么不起作用?如何正确配置我的过程?我读了文档和一些例子,但我不知道怎么做。
更新
我正在使用regex,但它也不起作用:

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

bkkx9g8r1#

解决了的!
我将news\u 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 ;
knsnq2tg

knsnq2tg2#

您可以使用cast:

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

但是,我认为您应该在php中这样做:

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

相关问题