我正在维护一个低流量的商店网站,该网站将信用卡号存储在数据库中。这不是正确的做法(我甚至认为这是非法的),因此我正在改变存储方式。
网站的结构是这样的,信用卡信息页面会提交到自己,验证数据,将数据存储在数据库中,然后将用户重定向到cc验证页面,在那里进行cc验证并下单。之后,他们再次被重定向到订单完成页面。无论如何,为了将cc号码从cc信息页面传递到验证页面,我考虑使用session,但我担心存在漏洞,并正在研究它们(我正在阅读这个参考资料和这个)。我可以将cc号码存储在session中,在下一页上检索它,使用它,然后
cc信息页面:
只有信用卡号被存储在session中,其余的信用卡信息存储在数据库中。虽然我认为仅凭信用卡号可能无法做太多事情,但应该尽可能保护其安全性。
假设我使用了“session.use_trans_sid = 0”和“session.use_only_cookies = 1”(其中会话标识符仅通过cookie处理而不是URL(不确定为什么需要两者)),并且考虑到我正在使用此特定的会话变量,在这种情况下,这段代码是否容易受到会话固定攻击?如果在设置cc#之前或之后重新生成会话ID是否有益?我猜想是的,并且由于此时协议为SSL,一旦会话已被重新生成,我也会得到SSL保护?
因此,我的主要问题是,遵循这些指南,对于一个熟练的攻击者来说,是否很难固定/劫持会话以获取用户的信用卡号码,至少存在3-15秒的时间?如果不行,如有可能,我该如何达到这个目标?
网站的结构是这样的,信用卡信息页面会提交到自己,验证数据,将数据存储在数据库中,然后将用户重定向到cc验证页面,在那里进行cc验证并下单。之后,他们再次被重定向到订单完成页面。无论如何,为了将cc号码从cc信息页面传递到验证页面,我考虑使用session,但我担心存在漏洞,并正在研究它们(我正在阅读这个参考资料和这个)。我可以将cc号码存储在session中,在下一页上检索它,使用它,然后
unset()
它,几秒钟后它就消失了(还要注意,这些页面使用SSL)。例如:cc信息页面:
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']);
只有信用卡号被存储在session中,其余的信用卡信息存储在数据库中。虽然我认为仅凭信用卡号可能无法做太多事情,但应该尽可能保护其安全性。
假设我使用了“session.use_trans_sid = 0”和“session.use_only_cookies = 1”(其中会话标识符仅通过cookie处理而不是URL(不确定为什么需要两者)),并且考虑到我正在使用此特定的会话变量,在这种情况下,这段代码是否容易受到会话固定攻击?如果在设置cc#之前或之后重新生成会话ID是否有益?我猜想是的,并且由于此时协议为SSL,一旦会话已被重新生成,我也会得到SSL保护?
因此,我的主要问题是,遵循这些指南,对于一个熟练的攻击者来说,是否很难固定/劫持会话以获取用户的信用卡号码,至少存在3-15秒的时间?如果不行,如有可能,我该如何达到这个目标?
session.use_trans_sid
让 PHP 自动修改输出的 HTML,将会话 ID 添加到特定的 URL 中。session.use_only_cookies
只让 PHP 接受来自 cookie 标头的会话 ID。如果没有这个设置,PHP 会按照 cookie、post 或 get 的顺序寻找和接受它。 - goatsession.use_only_cookies = 1
,它会将会话 ID 添加到 URL 中。这似乎是矛盾的。 - Nick Rolandosession_start($session_id_from_wherever_you_want);
手动告诉php sess id,也许您从url中获取了它,但需要在使用该url id恢复会话之前实现自己的自定义验证逻辑和环境。 - goat