У меня есть сайт, который позволяет пользователям называть свои карты. Чтобы предотвратить инъекцию 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...