PHP保护免受会话固定/劫持

时间:2012-01-27 00:13:14

标签: php security session session-hijacking

我正在维护一个低流量的商店网站,该网站将信用卡号存储在数据库中。这是不对的(甚至是我认为合法的),所以我正在改变数字的存储方式。

网站的结构方式,信用卡信息页面发布到自身,验证数据,将数据存储在数据库中,然后将用户重定向到cc验证页面,在该页面验证cc并下订单。之后,它们将再次重定向到订单完成页面。无论如何,要从cc信息页面获取cc号码到验证页面,我正在考虑使用会话,但我担心漏洞并且我正在尝试查看它们(我正在阅读this ref.和{ {3}})。我可以在会话中存储cc号码,在下一页上检索它,使用它,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));

cc验证页面:

session_start();
//retrieve $_SESSION['card_number']
unset($_SESSION['card_number']);

只有卡#存储在会话中,其余的cc信息都在数据库中。虽然我不认为有人可以用cc#做很多事情,但它应该尽可能保证安全。

鉴于我使用session.use_trans_sid = 0session.use_only_cookies = 1(其中会话标识符仅通过cookie而不是URL处理(不确定为什么我需要两者)),并且考虑到我对此特定会话变量的使用,这段代码易受会话固定的影响?重新生成会话ID(之前或之后?)是否有益?在这种情况下,我在session中设置了cc#?我猜是的,而且由于此时协议是SSL,我也猜测一旦session被重新生成,我就会受到保护,只要SSL能得到我的话?

所以,我的主要问题是,遵循这些指南与我的网站,熟练的攻击者会有一个相当困难的时间固定/劫持会话,以获得用户的cc#存在的时间(大约3-15秒) ?如果没有,如果可能的话,我怎么能达到这一点呢?

2 个答案:

答案 0 :(得分:2)

即使会话被劫持,如果您的脚本允许用户查看CC编号,或者您的网站上有会话转储,则该人只能获取CC编号。

另请注意,以明文形式将CC编号存储在数据库中可能是非法的。如果您担心数据被盗,请务必对所有敏感数据进行编码或加密。

祝你好运!

答案 1 :(得分:0)

根本不应存储卡号。默认情况下,PHP将会话存储在计算机上的文件中。如果您的计算机遭到入侵,则有人可能会从会话文件中窃取信用卡号。

您应该做的是获取所有信息并将其直接传递给信用卡处理器(如Authorize.Net)或使用允许用户在服务托管的域上付款的服务,然后将其返回给您一个身份验证代码,所以你知道他们付了钱(PayPal有这样的服务,我知道他们不是最好的,但还有其他的)

根据信息捕获信息要求您至少具有一定程度的PCI合规性。存储卡信息需要更高的级别。

有很多关于PCI的东西。这是维基上的:http://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard