我正在维护一个在数据库中存储信用卡号的低流量商店网站。这是不对的(我认为甚至是合法的),所以我正在改变数字的存储方式。
该站点的结构方式是,信用卡信息页面向其自身发布、验证数据、将数据存储在数据库中,然后将用户重定向到 cc 验证页面,在该页面上验证 cc 并下订单。之后,他们将再次重定向到订单完成页面。无论如何,为了从抄送信息页面获取抄送号码到验证页面,我正在考虑使用 session ,但我担心漏洞并试图调查它们(我正在阅读 this ref. 和 this one ).我可以在 session 中存储抄送号码,在下一页检索它,使用它,然后 unset()
它,它会在几秒钟内消失(另请注意,这些页面使用 SSL)。像这样的东西:
抄送信息页:
session_start();
$_SESSION['card_number'] = $_POST['cardnumber']; //please tell me if there are vulnerabilities here setting directly from $_POST
...
header(sprintf("Location: %s", $insertGoTo));
抄送验证页:
session_start();
//retrieve $_SESSION['card_number']
unset($_SESSION['card_number']);
只有 card# 被存储在 session 中,其余的 cc 信息在数据库中。虽然我不认为有人可以仅使用 cc# 做很多事情,但仍应尽可能确保它的安全。
鉴于我使用 session.use_trans_sid = 0
和 session.use_only_cookies = 1
(其中 session 标识符仅通过 cookie 而不是 URL 处理(不知道为什么我需要两者) )),并且考虑到我对这个特定 session 变量的使用,这段代码是否容易受到 session 固定的影响?在这种情况下,我在 session
中设置 cc# 重新生成 session ID(之后或之前?)是否有益?我猜是的,因为此时协议(protocol)是 SSL,我也猜测一旦 session
重新生成,我就会受到 SSL 的保护?
所以,我的主要问题是,在我的网站上遵循这些指南,熟练的攻击者是否会相当困难地固定/劫持 session 以获取用户的 cc# 存在的时间量(大约 3-15 秒) ?如果不能,如果可能的话,我怎样才能做到这一点?
最佳答案
即使 session 被劫持,如果您的脚本允许用户查看抄送号码,或者您的网站上有 session 转储,此人也只能获得抄送号码。
另请记住,将 CC 号码以明文形式存储在数据库中可能是非法的。如果您担心数据被盗,请务必对所有敏感数据进行编码或加密。
祝你好运!
关于PHP 防止 session 固定/劫持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027391/