MySQL (нестандартно) позволяет использовать двойные кавычки в качестве разделителей строковых литералов:
SELECT * FROM Accounts WHERE first_name = "Mel"
У вас возникнут проблемы, если вы интерполируете контент в строковый литерал SQL, а ваш контент содержит двойные кавычки:
SELECT * FROM Articles WHERE description = "She said, "Murder"!"
Это может быть простой случайностью, и это, вероятно, просто вызывает синтаксическую ошибку. Но злоумышленники также могут использовать это умно, чтобы заставить ваши запросы делать то, что вы не собирались.
UPDATE Accounts SET PASSWORD = "..." WHERE account_name = "Mel" OR "X"="X"
Это может произойти, если злоумышленник утверждает, что его имя учетной записи Mel" OR "X"="X
и это называется SQL-инъекция.
Но если вы избежите двойных кавычек в содержании, вы можете победить их вред:
UPDATE Accounts SET PASSWORD = "..." WHERE account_name = "Mel\" OR \"X\"=\"X"
Однако проще использовать параметры запроса, поэтому вы гарантируете, что содержимое отделено от кода SQL и никогда не приведет к непреднамеренным выражениям:
UPDATE Accounts SET PASSWORD = ? WHERE account_name = ?
Параметры позволяют вам подготовить запрос с заполнителями, а затем предоставить динамическое содержимое для каждого заполнителя при выполнении. Например, в PHP с PDO:
$sql = "UPDATE Accounts SET PASSWORD = ? WHERE account_name = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute( array("...", "Mel") );
См. Мою презентацию Мифы и ошибки SQL-инъекций для получения дополнительной информации.