2015-04-01 5 views
0

Я разрабатываю мобильное приложение, где я хочу реализовать простую аутентификацию пользователя, и поскольку я новичок в гибридных мобильных разработках с его внешними ограничениями, я очень напуган идеей проведения любых внутренних связанных с данными в виде localStorage/sessionStorage/ngCookies (как я видел некоторые люди).Ионные + ngCookies + аутентификация PHP, насколько это безопасно?

Так что мой вопрос: Насколько защищены эти методы могут быть таких данных? Пользователи приложений имеют возможность доступа и изменения, скажем ... sessionStorage, из самого приложения? Потому что он уверен в Интернете.

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

+0

Если вы используете файлы cookie для хранения данных, связанных с пользователем, которые необходимы для вашего сервера, эти файлы cookie могут быть зашифрованы на стороне сервера перед отправкой клиенту. Вы можете получить доступ к таким файлам cookie с помощью ngCookies, но единственный вред, который может быть сделан, заключается в том, что некоторые введенные коды могут их аннулировать. Если какая-то ваша схема шифрования будет обнаружена, и они станут читаемыми для злоумышленника, вы можете сделать недействительными изменения к ним, добавив подпись (созданную с помощью алгоритма безопасного хэша) в каждом магазине и проверив вашу подпись при каждом извлечении. – diegoperini

+0

Спасибо за ответ! Но как насчет простой логической строки, которая проверяет, вошел ли пользователь в систему или нет? Вы использовали бы выделенный токен для истины или ложных? – Shay

+0

Как только вы используете файлы cookie для аутентификации, вы в конечном итоге сталкиваетесь с такими проблемами, как «Кто входит в систему?», «Как долго он/она остается в системе?», «Используется ли компьютер с использованием общедоступного Интернета?» и т. д. В конце концов, простой способ представления состояния, принадлежащего определенному пользователю (отсюда и файла cookie), заключается в том, чтобы выровнять некоторый объект, который может быть обратным строковым (разобранным) снова, который в конце будет представлять одно и то же состояние. Если сохраненная строка неуязвима для модификаций и/или нечитабельно для невооруженного глаза компьютера, ее можно хранить в виде файла cookie. – diegoperini

ответ

2

TLDR; Предполагается, что файлы cookie и хранилища сохраняются в виде обычного текста и доступны по сценарию на стороне клиента, который поступает из того же домена. Предположите худшее; все может пойти не так с вашим скриптом из-за ошибок или атак XSS. Если данные будут использоваться как клиентом, так и сервером снова, наиболее определенно подпишите его. Если данные относятся только к серверному коду, подпишите и зашифруйте его. Если данные предназначены только для печати материала на экране или оценки DOM, оставьте его открытым текстом.


Давайте будем говорить о том, какие файлы cookie, хранилища сеансов и локальные хранилища перед началом реализации примера.

Cookies - это данные , созданные сервером или клиентом, хранящиеся в открытом виде браузерами, которые отправляются на каждый HTTP-запрос на сервер, если путь соответствует. Они хороши для хранения токенов аутентификации, метаданных, относящихся к отслеживанию, аналитике, предпочтениям веб-интерфейса, тележкам и многим другим.

Склады - как указано по их названию - место хранения, назначенное вашему домену, и только скриптов из вашего домена и атак XSS может изменить его. Это означает, что если вы используете их для перечисленных выше целей, вам необходимо вручную добавить данные, хранящиеся в них, в ваши HTTP-запросы. Если ваш сайт зависит от многих асинхронных HTTP-вызовов, не следует использовать хранилища, такие как файлы cookie. В противном случае они полезны для кэширования таких вещей, как данные шаблонов и ресурсы сайта.


Если вы используете куки для хранения данных, связанных с пользователем, который необходим для вашего сервера, эти виды печенья могут быть зашифрованы на стороне сервера перед отправкой клиенту. Вы можете получить доступ к таким файлам cookie с помощью ngCookies, но единственный вред, который может быть сделан, - это то, что некоторые введенные коды могут привести к их недействительности. Если каким-то образом ваша схема шифрования будет обнаружена, и они станут читаемыми для злоумышленника, вы можете сделать недействительными изменения для них, добавив подпись (созданную с помощью алгоритма безопасного хэша) в каждый магазин и проверив вашу подпись при каждом извлечении. Давайте проиллюстрируем этот процесс.

$userState = json_encode($yourStateObjectOrAnAssociativeArray); 
$sign = my_hash($userState); 
$encryptedState = encrypt($userState); 
setcookie("user" , $encryptedState); 
setcookie("sign" , $sign); 

Здесь мы закодировали наше состояние как JSON, а затем сгенерировали хэш. Вы можете использовать некоторые SHA1, SHA256 и такие с сохраненным ключом, который вы выбрали, чтобы создать функцию my_hash(). Ниже приведен пример, который является правильным, но вы не должны его использовать, так как даже я не должен знать ваш алгоритм.

// hash() is reserved so use something else 
function my_hash($object) { 
    return sha1(md5($object) . "some giberish key that is stored as config data or in a db" . sha1($object)) 
} 

Обратите внимание, что my_hash() не очень надежна, так как он использует статическую строку в качестве ключа и структуры генерации, которая не является сложным.В конце концов, это sha1() некоторой случайной структуры. Этого достаточно для обозначения печенья.

Вы можете написать свою собственную партию encrypt()/decrypt(), используя шифрование AES или какой-либо одинаково безопасный алгоритм по вашему выбору. Here is an example from this site.

Теперь наш файл cookie хранится и готов к отправке по следующему запросу. Ниже описано, как вы расшифровываете и проверяете свой файл cookie из приведенного выше примера.

$sign = $_COOKIE["sign"]; 
$encryptedState = $_COOKIE["user"]; 

$userState = decrypt($encryptedState); //If this fails, it indicates someone tried to replace your cookie by hand, it is a failed attack 

$assoc = true; //If true, json_decode returns array, otherwise it returns an object 
$yourStateObjectOrAnAssociativeArray = json_decode($userState, $assoc); //If this fails, it indicates someone tried to replace your cookie by hand, it is a failed attack 

if($sign == my_hash($yourStateObjectOrAnAssociativeArray)) { 
    //Noone modified your cookie, you are safe 
    //Do something with it 
} 
else { 
    // Someone tried to replace your sign cookie to imitate your server but he failed 
    // or 
    // Someone managed to decrypt your cookie and modified it but failed to generate a valid sign (very unlikely) 
    // You are still safe 
    // Log this line and check every once in a while to detect unsuccessful hackers 
} 

Значительная часть использования объекта состояния является то, что он может быть использован для реализации многих видов ограничений и механизмов отслеживания. Например, сохранение системного времени во время создания вашего файла cookie дает вам возможность закончить его позже. Встраивание клиентского IP-адреса - это способ ограничить совместное использование файлов cookie через сети.

+0

Вау, спасибо за ОЧЕНЬ подробный ответ! Поддержки для этого. :) Вы определенно расширили мои взгляды на безопасность на заднем плане! У вас есть блог или где-то вы пишете? Мне определенно будет интересно следовать более похожим концепциям. :) – Shay

+0

Я рад, что смогу помочь. Вы можете перейти в мой блог, ссылка в моем профиле. Я планирую писать такие должности в будущем. По умолчанию вы можете начать работу с базовым уровнем безопасности. Спасибо :) – diegoperini

+0

Мне это нравится. :) В эти дни я много играю с cmd, поэтому для меня это очень естественно и интересно. Ждем еще несколько сообщений, я буду смотреть! :) – Shay

Смежные вопросы