Настройте хранимую процедуру MySQL только с переменной INT - PullRequest
0 голосов
/ 03 декабря 2018

Я настроил эту процедуру:

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

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать CAST для этого:

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

Однако, я думаю, вы должны сделать это в php:

if(isset($news_id) && is_numeric($news_id)){
     ...
}
0 голосов
/ 04 декабря 2018

решено!

Я настраиваю 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...