仅使用 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)){
...
}
我已经配置了这个程序:
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)){
...
}