Я определенно согласился бы с вышеупомянутыми сообщениями, но у меня есть одна мелочь для добавления в ответ на ответ Cheekysoft, конкретно:
Когда дело доходит до запросов базы данных, всегда пытайтесь использовать подготовленные параметризированные запросы. mysqli и библиотеки PDO поддерживают это. Это бесконечно более безопасно, чем использование функций выхода, таких как mysql_real_escape_string.
Да, mysql_real_escape_string является эффективно просто строковой функцией выхода. Это не чудодейственное средство. Все, что это сделает, выйти из опасных символов, чтобы их могло быть безопасно использовать в строке единого запроса. Однако, если Вы не санируете свои исходные данные заранее, тогда Вы будете уязвимы для определенных векторов атаки.
Воображают следующий SQL:
$result = "ВЫБИРАЮТ полевую таблицу FROM ГДЕ идентификатор =" .mysql_real_escape_string ($ _POST ['идентификатор']);
необходимо быть в состоянии видеть, что это уязвимо для использования. Предположите, что идентификационный параметр содержал общий вектор атаки:
1 ИЛИ 1=1
нет никаких опасных символов там для кодирования, таким образом, это передаст прямо через фильтр выхода. Отъезд нас:
таблица FROM полей SELECT, ГДЕ идентификатор = 1 ИЛИ 1=1
я кодировал быструю небольшую функцию, что я вставил свой класс базы данных, который разделит что-либо, что не является числом. Это использует preg_replace, таким образом, существует prob более оптимизированная функция, но это работает в повышении...
function Numbers($input) {
$input = preg_replace("/[^0-9]/","", $input);
if($input == '') $input = 0;
return $input;
}
Так вместо того, чтобы использовать
$result = "ВЫБИРАЮТ полевую таблицу FROM ГДЕ идентификатор =" .mysqlrealescapestring ("1 ИЛИ 1=1");
я использовал бы
$result = "ИЗБРАННАЯ полевая таблица FROM ГДЕ идентификатор =".Numbers ("1 ИЛИ 1=1");
и это безопасно выполнило бы запрос
таблица FROM полей SELECT, ГДЕ идентификатор = 111
Несомненно, который просто мешал ему отобразить корректную строку, но я не думаю, что это - большая проблема для того, кто бы ни пытается ввести sql в Ваш сайт;)
Во-первых, есть зарегистрированная заявка, которая имеет consumer_key
и consumer_secret
.
Когда пользователи аутентифицируют и "разрешают" вашу зарегистрированную заявку, вы возвращаетесь:
access_token
, который считается "паролем" пользователя и позволяет ВАШЕМУ приложению действовать от имени пользователя.
Таким образом, получение простого access_token
пользователя из вашей базы данных не сильно поможет, если у него также нет consumer_key
и consumer_secret
для полного доступа.
Поставщик услуг сравнивает все 4 параметра по запросу. Было бы разумно зашифровать эти 4 параметра перед хранением и расшифровать их перед ответом.
Это как раз тот случай, когда от имени пользователя необходимо обновить или внести изменения в владельца ресурса пользователя. Для того, чтобы пользователь вошел на ваш сайт, используйте сеансы
.Токен OAuth и секрет, очевидно, должны быть в безопасности в вашей базе данных, но вы не можете хранить их с использованием одностороннего шифрования так же, как для пароля. Причина в том, что вам нужны токен и секрет, чтобы иметь возможность подписать запрос.
Это также будет иметь место, если вы используете сервер OAuth, вам по-прежнему нужен исходный токен / секрет для проверки запроса.
При желании вы все равно можете зашифровать их с помощью алгоритма двустороннего шифрования, такого как AES, чтобы обеспечить безопасность в случае взлома базы данных или резервных копий базы данных.
Здесь есть две точки зрения.
Первый аргумент: вы должны относиться к токенам OAuth как к паролям. Если бы кто-нибудь получил доступ к вашей базе данных, получил все пары OpenID / OAuth и запустил атаку «злоумышленник в середине», он мог бы выдать себя за любого пользователя на вашем сайте.
Второй аргумент таков: к тому времени, когда кто-то получит доступ к вашей базе данных и достаточный доступ к вашей сети для запуска атаки типа «злоумышленник в середине», вы все равно заблокированы.
Я лично ошибаюсь из соображений осторожности и просто зашифрую их; это стандартная практика для паролей, так что вы можете дать себе немного дополнительного спокойствия.
Между тем, у Google есть такой совет:
«С токенами следует обращаться так же безопасно, как и с любой другой конфиденциальной информацией, хранящейся на сервер "
источник: http:
разрешения, убедитесь, что они
зашифрованы и хорошо скрывают пароль
архивное сообщение ( исходный URL сообщения, теперь мертвая ссылка )
URL-адрес OpenID не должен быть зашифрован, потому что это ваш "открытый id "буквально каждый должен знать значение. Кроме того, URL-адрес должен быть индексом в базе данных, а зашифровать индекс в базе данных всегда проблематично.
Токен / секрет OAuth должен быть секретным, и шифрование может повысить безопасность, если вам нужно хранить токен в течение длительного времени. В нашем потребительском приложении OAuth токен / секрет хранится в сеансе только на короткое время, и мы предпочитаем не шифровать их. Думаю, это достаточно безопасно. Если кто-то может заглянуть в наше хранилище сеансов, вероятно, у него также есть наш ключ шифрования.