Как уже упоминали другие люди, вам нужно обрабатывать буквенные кавычки в ваших строках, иначе вы подвержены атакам SQL инъекция .
См. Мою презентацию Мифы и ошибки SQL-инъекций для получения дополнительных примеров и решений.
Использование параметров запроса - эффективная защита, и на самом деле ее проще писать и внешний вид вашего кодалучше.Я рекомендую использовать PDO, потому что он позволяет использовать именованные параметры.
Также рассмотрите возможность использования синтаксиса heredoc PHP , чтобы упростить написание кода SQL, не беспокоясь обо всех двойных кавычках и конкатенационных строках.
$sql = <<<END_SQL
INSERT INTO `tims`.`pending_profile`
(`id`, `nickname`, `location`, `role`, `yog`, `interests`, `favMoment`,
`gainThisYr`, `futurePlans`, `bio`)
VALUES (:id, :nickname, :town, :role:, :yog, :interests, :fav_moment,
:gain, :future, :bio)
ON DUPLICATE KEY UPDATE
nickname = :nickname,
location = :town,
role = :role,
yog = :yog,
interests = :interests,
favMoment = :fav_moment,
gainThisYr = :gain,
futurePlans = :future,
bio = :bio
END_SQL;
$stmt = $pdo->prepare($sql);
$success = $stmt->execute(array(
':id' => (int) $_SESSION['id'],
':nickname' => $_POST['nickname'],
':town' => $_POST['town'],
':role' => $_POST['role'],
':yog' => $_POST['yog'],
':interests' => $_POST['interests'],
':fav_moment' => $_POST['fav_moment'],
':gain' => $_POST['gain'],
':future' => $_POST['future'],
':bio' => $_POST['bio'],
));
примечание: Я изменил $ _REQUEST на $ _POST, потому что вы никогда не должны использовать GET-запрос, который изменяет ваши данные.Поисковые системы переходят по ссылкам, поэтому вы можете обнаружить, что Google сканирует ваш сайт и непреднамеренно изменяет вашу базу данных.Всегда используйте POST-запросы, когда действие собирается сохранить или изменить что-либо.
Для простых случаев вам даже не нужно использовать параметры, если вы можете привести свою переменную в нечто безопасное для использования, напримеробычное целое число:
$id = (int) $_SESSION['id'];
$sql = "SELECT * FROM `pending_profile` WHERE id = {$id}";
$stmt = $pdo->query($sql);
$row = $stmt->fetch();
Помимо риска внедрения SQL, ваш код также полон другого типа риска безопасности, называемого Межсайтовый скриптинг или XSS.Это происходит, когда вы выводите пользовательский контент в вывод HTML, без экранирования символов, которые являются особыми для HTML, например <
или &
.Злоумышленники могут причинить вред, введя свое имя, включая код JavaScript.
Исправление для XSS в основном заключается в использовании htmlentities()
для всего, что вы выводите, если оно могло быть получено из пользовательского ввода или любого другого ненадежного источника (например, чтение из базы данных, файла или веб-службы).).
<td><input type="text" name="nickname" value="<?php echo htmlentities($row['nickname']); ?>"/><td>
Вам действительно нужно изучить эти недостатки безопасности, если вы пишете код для Интернета.Они являются источником многих проблем в Интернете.См. OWASP или SANS Top 25 самых опасных программных ошибок .