PHP初学者的安全恐惧


PHP Beginner Security Fear

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

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

我做得很好,但我担心我正在做的两件事以及它们是否合适:

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

  2. 如何阻止恶意用户在我的各种表单上的众多文本框中插入重定向?我需要允许HTML,如strong、font、background等。我一直在通过一个函数运行所有文本框值,该函数一次检查可能的恶意内容,如"meta http"、"anchors"或"java script",但我不确定这是最好的解决方案。

谢谢你的帮助!

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

你需要阅读session_start和朋友们的文章。

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

  1. 不,每个客户都可以操作他的Cookie并发送他们想要的一切,甚至是无效的"登录"Cookie。您必须将这些信息服务器端存储在会话中

  2. 你可以使用strip_tags只允许一些特殊标签,或者使用html消毒剂

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

示例:

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

创建一个php-auth页面,进行检查以确保已填充会话var。如果没有,则重定向到拒绝访问或登录页面。

示例:

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

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

2。您可以在文本框上使用strip_tags,在最终进入数据库的用户输入中使用mysqli_real_escape_string。(或者使用准备好的语句,请参阅防止PHP中SQL注入的最佳方法)