我有以下网址:
/Reports?reportId={value}
问题在于并非每个用户都能看到每个报告,但通过这种网址,他实际上可以输入他想要的任何ID并访问该报告。
所以我的问题是我应该添加一个服务器端验证来检查当前登录的用户是否有权访问此报告,如果没有返回一些Anauthorized响应,或者通过POST发送它,这样他就看不到网址并更改它(如果这种方法足够安全。)
通常我想知道在网址中发送ID是不是一个坏主意?也许最好使用Guids for ID-s而不是整数?
答案 0 :(得分:1)
所以我的问题是我应该添加一个服务器端验证来检查当前登录的用户是否有权访问此报告,如果没有返回一些Anauthorized响应
是的,一千倍。
或通过POST发送,这样他就看不到网址并进行更改(如果这种方法足够安全)。
没有。从来没有。这是通过默默无闻的安全。 POST数据不会以任何方式隐藏。
如果在网址中发送ID是个坏主意吗?也许最好使用Guids for ID-s而不是整数?
不,这根本不重要。这也是通过默默无闻的安全。 GUID仍然以纯文本显示,因此任何能够访问浏览器历史记录,防火墙或网络的人都可以检查和重放包含GUID的流量。
另见Why not expose a primary key - Programmers Stack Exchange。
答案 1 :(得分:1)
除了CodeCaster的回答:
URL中的ID可间接揭示某些与业务相关的信息。例如,根据合同ID = 963,您的竞争对手可能会了解到您自上个月以来已经完成了40份新合同(ID为923)并获得了ck 50k。有时这不是所希望的。
虽然掩盖ID很常见,例如通过转换为蒙版字符串。我通常分别使用openssl_encrypt
和openssl_decrypt
。
以下是将ID转换为屏蔽字符串的示例:
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,交换字符位置,字符映射,前置/附加不相关的字符等。