Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于PHP中非常简单的用户控件,什么是最安全的解决方案?_Php_Security_User Controls - Fatal编程技术网

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

对于PHP中非常简单的用户控件,什么是最安全的解决方案?,php,security,user-controls,Php,Security,User Controls,我想知道对于以下用户控制逻辑,最简单但安全的方法是什么: 1个用户/站点(不涉及数据库) 用户从登录页面登录,但未重定向到管理面板,但登录后用户直接在前端获得一些高级权限(删除/编辑/etc链接) 问题: 在配置文件中存储用户名和(明文)密码有多安全?我知道这可能不是最好的方式,但密码最好是明文形式,以便基于配置文件进行方便的编辑(phpMyAdmin在其config.inc.php文件中也做了同样的操作,所以我认为这或多或少是可以的) 跟踪站点上已登录用户的最佳/最安全的方式是什么?我当

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

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

  • 在配置文件中存储用户名和(明文)密码有多安全?我知道这可能不是最好的方式,但密码最好是明文形式,以便基于配置文件进行方便的编辑(phpMyAdmin在其config.inc.php文件中也做了同样的操作,所以我认为这或多或少是可以的)
  • 跟踪站点上已登录用户的最佳/最安全的方式是什么?我当前的解决方案在每次页面加载时检查用户的状态和IP(登录会话为TRUE,IP会话为用户的IP,两者都是在初始登录时生成的)?可以吗
  • 我还应该注意什么

感谢您提前回复

最好将密码存储为散列。你永远不知道谁可以访问ftp。或者,如果PHP服务器关闭,所有PHP文件都将显示为纯文本。将其散列存储几乎不费吹灰之力,但它可以为您节省很多潜在的麻烦


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

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


此外,我建议存储散列而不是明文密码。

以明文形式存储密码几乎是不允许的。您应该使用安全散列(例如md5不安全)对其进行散列,并对其进行“加密”(也就是说,在对密码进行哈希运算之前,在密码前面加上或附加一个“secret”字符串-否则,从哈希中查找密码仍然相对容易,尤其是当密码是普通密码时)。如果您不想完全更改密码页面,可以快速编写一个小的帮助程序脚本来散列密码,而不是将其存储在web服务器上;当您需要新密码时,可以运行它并将其输出粘贴到配置文件中

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

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

数据库存储的唯一替代方法是文件存储。将内容存储到文件中最优雅的方式是使用XML格式,可以使用XPath查询解析。请参见此处的示例

我从未在PHP上使用过XPath,也从未使用过它(使用实现它的方法和对象)

遗憾的是,我无法向您提供更多详细信息,因为我也在研究这个问题。我真的认为可能存在速度和总体安全问题(您的数据库受到用户和密码的保护,而XML文件或任何文件都不受保护)

线条可以是这样的

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

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

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

希望能有帮助


希望这有帮助。

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

如果您使用散列,。但请记住,具有完全访问权限的攻击者可以在您下次登录时对登录页面进行特洛伊木马攻击以获取密码

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