要记住的最重要的事情:
不要相信客户返回的任何东西
永远不要假设您获得的信息(在表单字段(甚至是隐藏的字段)、会话变量等中)是有效的 - 使用服务器端逻辑来执行这些检查。
1.) 确保您的会话已加密。如果您使用的是 PHP 的内置会话,则相关的熵(随机性)相对较高,所以应该没问题。
2.) 仅将会话 ID 存储在 cookie 中。任何其他信息都应该使用该 ID 在服务器上简单地关联。我见过很多情况,如果会话中的令牌'is_admin' = true,系统工程师会确定某人是否是管理员。您显然可以看到这个问题。
有些人会抱怨这是一项昂贵的操作,但我建议为活动会话创建一个(我的)SQL 表。然后,当页面加载时,从表中提取相关数据并像处理任何其他数据一样处理它。一些框架(如 CodeIgnitor)通过更改一个配置项为您完成此操作。
3.) 验证 IP - 在您的表中,添加当前 IP 地址。如果当前 IP 与会话中的 IP 不匹配,则可能有人试图劫持。强制注销并终止。
4.) 限制登录尝试。添加 1 秒 sleep(); 每次登录的服务器端对用户来说几乎是不明显的,但对于自动化系统,它几乎不可能暴力登录。
5.) 注意“太健谈”。在登录时,您可能认为提供描述性错误(例如“用户名不存在”或“密码不正确”)会有所帮助。这样的信息告诉黑客他们已经获得了一个有效的用户名——这使得黑客攻击更快。
6.) 少关注 PHP 和 SSL 的安全性,多关注你自己的逻辑。仅仅因为网站使用 SSL 并不能使其安全。SSL 与有效逻辑相结合提供了安全性。
7.) 如果你非常担心,你会想要转移到专用服务器。您服务器上托管的其他网站可能会访问您的代码/数据库信息。他们可能没有采取必要的措施来确保与您一样安全。
8.) 不允许同时进行会话。这可以防止 MITM(中间人)攻击。数据库会话方法的另一个优点是,如果两个客户端同时尝试从不同的 IP 登录,您可以强制注销。DB 方法的另一个优点是它使您的系统具有可扩展性(因为会话存储依赖于文件系统)。
9.) 使用 mysql_real_escape_string 而不是 add_slashes
如果您需要有关 PHP 安全性的更多信息,这是我的专长。随时联系我。