2015-10-15 3 views
0

У меня есть следующий URL:Ввод ID в Получить запросе

/Reports?reportId={value} 

Проблема заключается в том, что не каждый пользователь может видеть каждый отчет, но с этим видом URL он фактически может войти любой ID, он хочет и доступа, отчет.

Итак, мой вопрос заключается в том, следует ли просто добавить проверку на стороне сервера, чтобы проверить, имеет ли доступ к этому отчету текущий зарегистрированный пользователь, и если он не возвращает какой-либо Anauthorized ответ или отправляет его через POST, поэтому он не может видеть URL-адрес и изменять его (если такой подход достаточно безопасен).

И вообще я хочу знать, если это плохая идея отправить ID в url? Может быть, лучше использовать Guids для ID-ов, а вместо целых?

ответ

1

Так что мой вопрос я должен просто добавить проверку на стороне сервера, чтобы проверить, вошедшего пользователь имеет доступ к этому отчету, и если не вернуть некоторые Anauthorized ответ

Да, в тысячу раз это.

или отправить это через POST, чтобы он не мог видеть URL-адрес и изменить его (если этот подход достаточно безопасен).

Нет. Никогда. Это безопасность через неясность. Данные POST никоим образом не скрываются.

Если это плохая идея отправить ID в URL-адресе? Может быть, лучше использовать Guids для ID-ов, а вместо целых?

Нет, это не имеет значения. Это также безопасность через неясность. GUID все еще отображаются в открытом виде, поэтому любой, кто имеет доступ к истории браузера, брандмауэрам или сети в целом, может проверять и воспроизводить трафик, содержащий GUID.

См. Также Why not expose a primary key - Programmers Stack Exchange.

1

В дополнение к ответу CodeCaster в:

идентификаторы в URL, можно косвенно выявить некоторые связанные с деловой информацией. Например, из контракта ID = 963 ваш конкурент может узнать, что вы сделали с прошлого месяца 40 новых контрактов (ID был, например, 923), и заработали около 50 тысяч. Иногда это нежелательно.

Это довольно распространенный способ маскировать идентификатор, например. путем преобразования в замаскированную строку. Обычно я использую openssl_encrypt и openssl_decrypt соответственно.

Вот пример для преобразования идентификатора/из замаскированного строки:

public static function encryptOpenssl($textToEncrypt, $encryptionMethod = 'AES-256-CFB', $secretHash = "12#rk!", $raw = false, $password = ''){ 
    $length = openssl_cipher_iv_length($encryptionMethod); 
    $iv = substr(md5($password), 0, $length); 
    return openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash, $raw, $iv); 
} 

public static function decryptOpenssl($textToDecrypt, $encryptionMethod = 'AES-256-CFB', $secretHash = "12#rk!", $raw = false, $password = ''){ 
    $length = openssl_cipher_iv_length($encryptionMethod); 
    $iv = substr(md5($password), 0, $length); 
    return openssl_decrypt($textToDecrypt, $encryptionMethod, $secretHash, $raw, $iv); 
} 

Конечно, Вы можете использовать любые другие запутывания алго, например, rot13, обмен положениями символов, картирование символов, добавление/добавление нерелевантных символов и т. д.

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