有一个典型的网站,在网址中传递了id值。恩。 account.php?ID = 755
在account.php页面中的我检查了值
$id = 0;
if(isset($_GET['id'])){
$id = intval($_GET['id']);
}
if($id == 0){
echo 'this account does not exists!';
exit();
}
但是,我试图在显示之前找到加密值755然后在检查值之前对其进行解码。所以我没有显示实际的id而是掩码。
我的问题是: 1)加密和解密ID是一个好主意吗?所以将传递一个掩码,而不是实际的id。 2)是否有一种简单的方法来加密id,方法是使用PHP返回一个只混合了数字和字母的字符串?
答案 0 :(得分:8)
但是,我试图找出以前加密值755 显示它然后在检查值之前解码它。所以我不是 显示实际的id但是掩码。
这似乎是一个非常麻烦的想法。但是,如果它对你和安全有意义,那么你需要设计一个适合你的编码/解码方案。在最简单的级别上,您可以base64_encode
ID,然后使用base64_decode
对其进行解码。以下示例仅是说明性的。请根据您的需要进行清洁和调整。
$encrypted_id = base64_encode($id);
现在要取回它,只需运行base64_decode
:
$decrypted_id = base64_decode($encrypted_id);
但这很容易入侵。
更好的方法可能是创建一些秘密的“盐”来添加到只有您的系统知道或理解的ID。
$salt="MY_SECRET_STUFF";
$encrypted_id = base64_encode($id . $salt);
这样,如果base64_decode
解码不考虑盐,那么简单地使用$id
就没有意义了:
$decrypted_id = base64_decode($encrypted_id);
只有在解析过程中将盐解析后才会有效解码:
$decrypted_id_raw = base64_decode($encrypted_id);
$decrypted_id = preg_replace(sprintf('/%s/', $salt), '', $decrypted_id_raw);
逻辑是原始解密ID仍然混合了盐,而preg_replace
会将其除去。既然只有你知道'盐'猜什么?你很安全!但是当然如果你出于某种原因放松盐,你的整个系统都没用,因为谁知道你的ids。
但是,除非保护用户ID是您应用的目标并且对安全性至关重要,否则这似乎过分了。如果有人猜到身份证可能会发生什么?你如何针对那种“最糟糕”的情景进行编程。
答案 1 :(得分:1)
你可以做的一件事是掩盖实际的id是散列它。例如:
生成链接:
<a href='script.php?id='<?php echo hash('sha256',$id); ?>'>click me</a>
然后在script.php引用hash('sha256',$_GET['id'])
上。
如果您需要更直接访问实际值,也可以使用mcrypt_encrypt和mycrypt_decrypt。
答案 2 :(得分:1)
除了混淆你正在传递的身份之外,真的没有什么意义。这实际上不是任何安全措施。即使编码,攻击者仍然可以猜测id。
根据经验,您应该将所有这些信息视为公开信息。如果您试图阻止访问,则应该考虑设置会话。
答案 3 :(得分:0)
1-(回复评论)GET允许URL引用,POST与GET一样安全。您可以随时轻松使用Firefox扩展来修改该值。要求它避免使用就像要求某人添加JS验证来保护页面。它会保护你免受常客的攻击,而不是聪明的人。
2-我觉得这看起来像是一个家庭作业,你的选择可能有限/会这样做,但你不应该依靠&#34;一步一步&#34;验证。并不是说他们不能工作,但如果你忘记添加某些东西,他们在攻击时往往很脆弱。在添加一堆新元素后,它们还会给你一个非常混乱的代码。
不要试图隐藏客户端访问的网页,而是检查ID的所有者以及尝试访问该网址的用户(使用服务器端登录)
3-如果你只想要一些简单而又酷的东西,请查看base64_encode(),它实际上并不安全,但这是完成工作的简单方法。
答案 4 :(得分:0)
由于网址是account.php?id = 755,我认为您希望阻止用户“窥探”任何其他帐户,而不是他们自己的帐户。在这种情况下混淆id是没有意义的。
将id存储在用户会话中,并使account.php从那里检索它,这样用户只能看到它自己的帐户页面。
答案 5 :(得分:0)
您不应该这样做的原因:
为什么要这样做(可以否决上述内容):
解决方案: