【问题标题】:PHP Beginner Security FearPHP初学者安全恐惧
【发布时间】:2012-09-04 21:56:48
【问题描述】:

我是一名技术作家,写过很多 HTML/CSS,但被扔进了压力锅,用 PHP 重写了一个 Web 应用程序,并且做得相当好,但我有点担心安全性。

具体来说,主页是用户登录的 INDEX.PHP。一旦他们登录,页面会重写部分自身并显示未登录用户无法使用的菜单选项。大约 50%用户将永远不需要登录,因为他们将查看不需要安全性的公共文档。其他 50% 的用户将对某些文档/页面的查看权限受到限制,并且能够写入数据库。

我的所有这些工作都很好,但我担心我正在做的两件事以及它们是否正确:

  1. 登录的用户可能会被重定向到另一个页面,例如 PAGE1.PHP。我不希望他们能够保存 PAGE1.PHP 的 URL,然后直接去那里,绕过安全性,所以在 PAGE1.PHP 上,我检查了我在 INDEX.PHP 上创建的登录 cookie。如果 cookie 存在,他们可以访问该页面,如果不存在,则不能。这是做这类事情的正确方法吗?

  2. 如何阻止恶意用户将重定向插入到我的各种表单上的众多文本框中之一?我需要允许 HTML,例如强、字体、背景等。我一直在通过一个检查可能的恶意内容的函数运行所有文本框值,一次一个,例如“元 http”或“锚点” " 或 "java script" 但我不确定这是最好的解决方案。

感谢您的帮助!

【问题讨论】:

  • 你可以从阅读PHP documentation's on security开始。
  • 有大量examples 的简单登录系统,通常在每个安全页面上都包含身份验证方法。
  • 您还应该确保自己是storing passwords securely
  • @Scott - 我知道你是新来的——请记住。如果其中一个答案对您有用,请不要忘记接受它。

标签: php security


【解决方案1】:

$_SESSION 将成为您的朋友。在正常的共享主机环境中,$_SESSION 的持续时间可能不会超过当前会话,因此请相应地进行计划。 (IE,除了登录之外,不要依赖它。)

您需要阅读session_start 和朋友。

此外,请查看此讨论:PHP HTML sanitizer 用于清理 HTML 输入。 (仅供参考,bbcodemarkdown 如此受欢迎是有原因的。)

【讨论】:

  • 哇,感谢您的快速响应。今晚将在 $_SESSION 上进行大量阅读,并且消毒剂似乎比我迄今为止所做的手动方式更好。为什么要重新发明轮子?
  • 您的意思是session_start,而不是start_session,您还可以使用session_set_cookie_params()使会话持续时间比当前会话长
  • @Mike -- 谢谢,修复了我的答案中的函数名称。至于session_set_cookie_params(),这并不是影响会话持续时间的唯一因素。 PHP 有会话清理代码来删除过期的会话。虽然所有 都可以控制,但对于新手来说却是很多。
【解决方案2】:
  1. 不 - 每个客户端都可以操纵他的 cookie 并发送他们想要的一切 - 甚至是无效的“登录”cookie。您必须将这些信息服务器端存储在会话中

  2. 您可以使用strip_tags 只允许某些特殊标签或使用 html 清理程序

【讨论】:

    【解决方案3】:

    1 .成功登录后,存储一个新的$_SESSION 变量,比如用户 ID(因为这似乎经常需要)

    例子:

        if(login is successful)
        { 
           $_SESSION['userId'] = $userId;
        }
    

    创建一个 php 身份验证页面,检查以确保填充了会话变量。如果没有,请重定向到拒绝访问或登录页面。

    例子:

    if(! isset($_SESSION['userId']) || $_SESSION['userId'] == '')
    {
        header("Location: accessDenied.php?msg=Not logged in");
    }
    

    在每个安全页面上,require('auth.php');

    2 。您可以在文本框上使用strip_tags,在最终进入数据库的用户输入上使用mysqli_real_escape_string。 (或者使用准备好的语句,见Best way to prevent SQL Injection in PHP

    【讨论】:

    • 对不起。我误读了mysql_real_escape_string。我会删除我的评论。
    • 已编辑以指示链接问题可替代真正的转义字符串。
    • 还要确保在每个请求的会话中验证用户ID(在数据库中查找),否则登录用户在被删除或停用后可能具有不正确的访问权限,或权限改变。
    猜你喜欢
    • 2011-03-15
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2012-03-05
    • 1970-01-01
    相关资源
    最近更新 更多