验证表单工作流程

时间:2011-11-13 16:55:44

标签: php security session

我有一个表格,有一些敏感信息(CC号码)。我的工作流程是:

  • 获取所有表单项的一页
  • 提交后,将验证值。如果一切正常,则所有数据都存储在会话变量中,页面将重新加载并显示会话变量中的此信息。
  • 如果审核页面上的所有内容都正常,则用户点击提交,会话变量将被发送到另一个表单进行处理(发送付款)。
  • 成功后会话被销毁。失败时(例如,错误的CC编号) - 用户被发送回表单,所有字段都像以前一样填写,以便他们可以检查错误并再次尝试(会话不会被销毁)。

从安全性或最佳实践角度来看,有没有人发现这有什么问题?

更新 我想我可以摆脱一个步骤 - 将信息存储在会话中。只需一页结账,没有评论页面......有意义。

4 个答案:

答案 0 :(得分:1)

我认为CC号码必须加密。您可能希望搜索PCI合规性。 StackOverflow上有一些主题涉及安全方面。

例如Storing Credit Card Numbers in SESSION - ways around it?

答案 1 :(得分:0)

一些小点

  1. 在提交表单之前,您可以在JS中执行一些验证例程 - 检查信用卡号码的长度,检查日期是否在将来,对号码本身做一些vlidation(Luhn算法)

  2. 如果有错误,请不要填写所有表单条目。保留信用卡和安全号码。

  3. 信用卡号输入框应该有一个随机的HTML名称,因此有权访问该计算机的人不能简单地重新加载该页面并让浏览器自动填充信用卡字段

答案 2 :(得分:0)

使用IP地址和客户端浏览器向表单添加一些哈希(签名),并且只有在签名正确时才显示来自$ _POST的CC代码。

失败表格(伪代码):

$sig = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $_POST['cc_code']);

<input type="hidden" name="sig" value="'.$sig.'" />
CC: <input type="text" name="cc_code" value="'.($sig==$_POST['sig'] ? $_POST['sig'] : '').'" />

但IMO最好的选择是将CC代码留空。

答案 3 :(得分:0)

作为经历了多次PCI合规的人,我可以诚实地告诉你,这是一个疯狂的BS负载。

最佳做法是将信用卡数据的存储卸载到已经处理了PCI合规性的大型服务提供商上,并且诚实地说,它在市场上拥有更多的资源,经验和信誉。

我说的是像http://www.braintreepayments.com/

这样的人

信用卡数据是一个热门的土豆。您希望尽快从服务器上获取这些内容,但仍然可以使用它来重复计费。

希望有帮助...