2013-08-15 5 views
0

Я не знаю, как программировать веб-страницы очень хорошо, поэтому у меня есть следующий вопрос. У меня есть база данных MySQL, которую пользователь может управлять. У меня есть две таблицы: люди, видео.Безопасная передача первичных ключей

Я хочу, чтобы у меня была страница для пользователя, чтобы выбрать человека из таблицы лиц (например, по имени), а затем связать этого человека с видео ссылкой. Выбор абонента из базы данных легко,

SELECT personID, name 
FROM persons 
WHERE name LIKE '%John%' 

Так что теперь пользователь должен вставить ссылку на видео в таблицу видео, которое имеет внешнюю клавишу PersonId.

Я мог бы сохранить первичный ключ человека после «select» в скрытой форме ввода html, но я предполагаю, что это не очень безопасно, поскольку они могут его редактировать?

Мой вопрос: Где вы храните такое ключевое значение между вызовом select и insert? Безопаснее хранить все эти данные в сеансе?

+0

Что делать, если у вас есть два Джона в вашей базе данных, что совершенно возможно? – Jimbo

+0

Он получает раскрывающееся поле, включая имя и фамилию, чтобы выбрать правильный. Но хорошая точка :) – Stefan

+0

Может ли пользователь редактировать видео каждого имени? – tobspr

ответ

2

Такое бывает довольно много, и это совершенно нормально, если вы не против, чтобы люди видели ваши первичные ключи (если они номера, то не о чем беспокоиться).

Предположим, вы извлекаете список строк из таблицы и отображаете их в формате HTML. Если вы хотите, чтобы каждая строка таблицы имела кнопку «удалить» для удаления этой строки, как из DOM, так и из базы данных, скажем, через XMLHttpRequest, типично для каждой строки иметь атрибут «id», при этом идентификатор является значение первичного ключа строки, которую вы хотите удалить.

Как правило, ваш первичный ключ будет:

  • id поле в таблице
  • Поле с AUTO_INCREMENT установлен

Короче, дайте каждый выпадающий атрибут data-id, который вам доступ в вашем JavaScript через селектор .data. Это достаточно хорошо. Просто убедитесь, что вы также защищаете себя от SQL Injection и используете PDO и подготовленные операторы, и все будет в порядке.

Для дополнительной защиты, и чтобы убедиться, что никто не изменил data-id атрибут на стороне клиента, прежде чем представить, убедитесь, что id соответствует name поля в базе данных, и вы золотой.

+0

Ну да, я думаю, я мог бы просто проверить, совпадает ли имя с идентификатором. С другой стороны, зачем вообще хранить идентификатор. Также возможно просто «выбрать» снова полное имя человека, когда он сделает видео «вставить» и получить идентификатор из БД. Я думал, что это приведет к удвоению SQL-запросов (так как я выбираю человека дважды) и может возникнуть, возможно, проблемы с производительностью. – Stefan

+0

Это вопрос архитектуры, но MySQL предназначен для обработки тысяч запросов - у вас не будет заметного замедления, делающего проверку в одном запросе перед выполнением другого. Правило № 1 - преждевременно не оптимизируйте оптимизацию :) – Jimbo

+0

@Stefan Кроме того, вы сохраняете идентификатор и имя, а когда они отправляются через POSTed, вы проверяете оба этих параметра на остальную часть строки таблицы, чтобы убедиться, что они связаны, и если да, то они не были подделаны. Возможно, вам даже не нужно делать двойной запрос, кстати. Если вы обновляете, вы просто «ОБНОВЛЯЕТЕ WHERE id =? S AND name =? S» и т. Д. – Jimbo

0

Я думаю, что хранение этого типа данных в сеансе безопасно и хороший выбор. В конце концов, это сеанс, поэтому нет причин выводить его. Было бы безопаснее хранить его в сеансе и, конечно же, легче получить доступ и управлять.