mysqli_real_escape_string и подготовленный оператор не очищает ввод - PullRequest
0 голосов
/ 31 октября 2019

У меня есть сайт, который позволяет пользователям называть свои карты. Чтобы предотвратить инъекцию SQL, я пытаюсь санировать ввод данных пользователем, но любой используемый мной метод, похоже, не работает.

Я сделал случайную карту с именем event.key == " " для всего этого.

В базе данных есть карточка с таким именем. Ручной запрос, изменяющий внешние кавычки, SELECT id FROM cards WHERE name='event.key !== " "' LIMIT 1; работает нормально

Использование mysqli_real_escape_string:

echo $name;

$name = mysqli_real_escape_string($mysqli, $name);
echo $name;

// A check to see if the card exists before we add it. Slimmed down version of the query.
$sql = "SELECT id FROM cards WHERE name=\"{$name}\" LIMIT 1;";
echo $sql;

// Regular mysqli query...

Это выводит

event.key !== " "
event.key !== " "
SELECT id FROM cards WHERE name="event.key !== " "" LIMIT 1;

Не выдает ошибку, но не возвращает данные и, очевидно, не является безопасным.

Использование prepared statements:

$stmt = $mysqli->prepare("SELECT id FROM cards WHERE name=? LIMIT 1;");
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
echo $result;

Глядя на журналы MySQL, этовывод запроса, который ничего не находит. SELECT id FROM cards WHERE name=' event.key !== " "' LIMIT 1 $result также ложно.

Что я делаю не так?

РЕДАКТИРОВАТЬ, показывая всю цепочку имен


// .htaccess
# Match url, user_url and details
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(cards)/([\w.]+?)/([^/]+?)/?$ index.php?url=$1&user_url=$2&details=$3 [QSA]

// index.php
$details_url = $_GET['details']  ?? null;

// page.php
$card_name = $details_url;
$card_id = get_id_from_card_name($card_name);

// functions.php
function get_id_from_card_name($name)
{
    include 'open.php';

    // We are back to where the original question is...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...