对于PHP中非常简单的用户控件,最安全的解决方案是什么?

时间:2011-02-07 11:29:03

标签: php security user-controls

我想知道以下用户控制逻辑的最简单但最安全的方法是什么:

  • 1个用户/站点(不涉及数据库)
  • 用户从登录页面登录但未重定向到管理面板,但登录后用户直接在前端获取一些高级权限(删除/编辑/等链接)

问题:

  • 在配置文件中存储用户名和(明文)密码的安全性如何?我知道它可能不是最好的方法,但是密码应该是明文形式,以便于基于配置文件进行编辑(phpMyAdmin在config.inc.php文件中也是如此,所以我认为它更多或者不太好)。
  • 在网站上关注登录用户的最佳/最安全的方法是什么?我当前的解决方案在每个页面加载上检查用户的状态和IP(logged_in会话为TRUE,IP会话是用户的IP,两者都是在初始登录时生成的)?那没关系吗?
  • 我还应该注意什么?

提前感谢您的回答!

5 个答案:

答案 0 :(得分:2)

以纯文本形式存储密码几乎是禁忌。你应该使用安全散列(例如md5是不安全的)散列它,并且“盐”它(也就是说,在对其进行散列之前,在密码之前添加或附加'秘密'字符串 - 否则,从散列中查找密码是还是比较容易的,特别是当密码是常见的时候)。如果您不想创建一个完整的更改密码页面,您可以创建一个小帮助脚本来散列密码,而不是将其存储在Web服务器上;当您需要新密码时,运行它并将其输出粘贴到配置文件中。

需要注意的其他事项(常见攻击):

  • SQL注入(插入查询的POST或GET值;恶意输入可能以有趣的方式破坏您的查询)。使用PDO并参数化所有数据库输入,你应该很好。
  • 路径遍历。如果您从$_POST$_GET或任何其他用户输入中读取文件名或部分文件名,则插入恶意值可以将文件发送到客户端,而这些文件并非公开。
  • 脚本注入。与路径遍历类似:任何采用动态输入的includerequireeval语句都是潜在的钩子,攻击者可以使用它将自己的PHP代码注入应用程序(例如,如果有的话) include $_GET['page'];,然后有人可以使用它来包含来自其他地方的脚本)
  • 跨站点脚本。如果您的网页上有动态HTML,请确保没有人可以滥用此功能将脚本或iframe放在网页上;否则,有人可以使用它来读取会话cookie并接管其他用户的会话。
  • 中间人:通过普通HTTP发送登录凭据意味着在同一LAN上拥有网络嗅探器的任何人,以及任何可以访问客户端和服务器之间的任何路由器的人都可以轻松地跟踪HTTP会话并提取凭据。即使凭据是安全的,会话cookie也是如此,因此一旦用户登录,最好通过HTTPS提供所有凭据。

答案 1 :(得分:0)

将密码存储为哈希值总是更好。你永远不知道谁可以访问ftp。或者如果PHP服务器关闭,所有PHP文件都将以纯文本显示。储存它并不是一种努力,但它可以为你节省很多潜在的麻烦。

跟随用户的方法对我来说似乎很好。

答案 2 :(得分:0)

我希望您也确保您的配置文件在任何情况下都不会被公共用户访问。使用配置文件夹中的.htaccess文件完全拒绝对该文件的Web访问是个好主意。

另外,我建议存储哈希而不是明文密码。

答案 3 :(得分:0)

数据库存储的唯一替代方法是文件存储。将内容存储到文件中的最优雅方式是使用XML格式,可以使用XPath查询进行解析。请在此处查看示例http://www.w3schools.com/php/func_simplexml_xpath.asp

我从来没有使用PHP上的XPath,也从未使用过raw(使用了实现它的方法和对象)。

可悲的是,我不能给你更多细节,因为我也在研究这个问题。我真的认为可能存在速度和整体安全问题(当XML文件或任何文件没有时,您的数据库受用户和密码保护)。

一行可以看起来像这样

<user username="username" password="edf53kqwolebng653fgism33grhloi76">
      <name>John doe</name>
      <rights>
           <module name="one">0010</module>
           <module name="two">1111</module>
      </rights>
</user>

这些数字表示创建读取更新删除权限(1有,0没有),因此如果用户只有读取权限,则访问密钥将为0100(考虑CRUD顺序)。

主要是您所要做的就是在登录后将该信息加载到会话中。

希望它有所帮助。

希望这有帮助。

答案 4 :(得分:0)

将密码文件放在网络根目录之外(例如,在/etc中)以防止意外提供密码文件。

如果您使用哈希use bcrypt。但请记住,具有完全访问权限的攻击者可以登录登录页面以在您下次登录时获取密码。

使用SSL保护登录页面以防止中间人。