安全问题

时间:2010-05-09 07:49:47

标签: php security flawed-concept

在我的cms中我有index.php,其中客户端必须输入用户名和密码。如果他们是正确的,他会转到admin.php,那里的cms是。

但现在黑客可以进入cms / admin.php,所以我的安全性现在很糟糕。


我知道,我可以使用$_SESSION变量。

index.php - 我可以给$ _SESSION ['成功']一些价值:

$_SESSION['success'] = TRUE,在admin.php中只需验证

admin.php

if($_SESSION['success'] == TRUE)
{
     my script here...
}
else header("Location: index.php");

但我想在没有SESSION的情况下丰富这种效果。 你能给我一个想法,我该怎么做?

感谢

5 个答案:

答案 0 :(得分:5)

Web应用程序安全性非常深入。首先,您需要使用会话或会话的等效实现。

用户登录,您需要会话ID及其用户名存储在cookie和数据库中。在数据库中,您还需要存储一些有关它们的信息,例如用户代理,以便您可以判断其会话是否被劫持。有些人存储IP地址。如果用户正在使用移动设备上的应用程序,则无法正常工作,因为他们的IP地址可能会频繁刷新。

每次用户加载管理页面时,请验证他们是否拥有有效且具有使用该页面权限的会话和用户cookie。然后使用您存储的有关该用户的信息验证请求是否来自它所启动的同一台计算机。

对于您在管理页面中放置的每个可能导致管理操作的表单或链接,请添加具有唯一标识符的隐藏字段或值。页面上每个项目的一个标识符可能导致管理操作。生成这些标识符时,请将它们与它们识别的操作一起存储在数据库中。这称为nonce,它将随每个管理员请求一起提交(例如更新记录或删除用户或从您的银行帐户转移资金)。当服务请求时,服务器应检查nonce是否与数据库中存储的内容匹配,然后将其删除。如果不匹配,可能是通过跨站点请求伪造攻击提出请求。

这些只是与经过身份验证的用户交互时要记住的一些事项,当然还有许多其他需要注意的事项,例如XSS。

安全性非常困难,虽然您的Web应用程序可能无法保证防弹安全策略,但您应该向用户保护其密码和个人信息。有关(更多)更多信息,请参阅OWASP

答案 1 :(得分:3)

不,你不想在没有会话的情况下这样做。其他方式,cookie和推荐人,与锁定屏幕门一样安全。

答案 2 :(得分:1)

您发布的代码既错误又无意义。 (应该是== true,为什么你允许他在错误上查看你的脚本,而不是成功?)

更重要的是,你为什么不想使用会话?您需要以某种方式对用户进行身份验证,这需要存储某种状态,这样您就不必在每次更改页面时强制用户登录。

答案 3 :(得分:1)

您有两种选择:

  1. 对每个请求进行身份验证(使用HTTP身份验证,浏览器在后台无形地执行此操作)
  2. 进行身份验证,然后在用户计算机上存储某种密钥,并在服务器上维护对它的引用
  3. 第一个工作,但它不太安全,用户友好性较差。第二个是会议的内容;如果你试图自己重新实现它,你很可能会遇到几个安全漏洞。你有什么理由不想使用会话吗?

答案 4 :(得分:1)

为了能够实现您自己的安全系统,您需要能够跨请求跟踪用户,换句话说,能够拥有用户状态。会话是在PHP中执行此操作的方法。您可以使用内置会话,也可以自己实现自定义会话。这两个选项中较晚的选项在必要时更加困难,在您的情况下可能没有用处。

要记住PHP中的会话,关键是要始终为每个请求启动它们。你应该在某个地方有一个全局包含文件,也许某种配置文件。我建议您将session_start();放在该文件的顶部附近,以确保它为每个请求正确执行。请记住,会话必须在发送任何标头之前启动,换句话说,在发送任何输出之前

使用PHP来保护对网站的一部分的访问的一个缺点是,只有在请求是PHP文件时它才有效。例如,如果您有想要保护的图像,文档或其他媒体,除非您通过某种PHP网关/过滤器提供服务,否则这些文件很可能无需身份验证即可访问。

所有这一切,我建议你研究一下Apache提供的basic or digest authentication为了满足您的需求,它可能提供足够的安全性并且非常容易实现 - 无需编码需要。更重要的是,大多数Web主机都有一个管理工具来管理这种类型的身份验证,通常称为“密码保护文件夹”,“锁定文件夹”等。您只需选择文件夹并设置用户名和密码,你已经完成了。