网页模型(构建动态Web的方法) - 安全性和实用性(清晰度)视图


Web page models (approaches to build dynamic web) - security and practical (clarity) view

这种根据URL查看页面的特定方法的优点和缺点是什么?
据我所知,构建网页有两种基本方法:

  1. www.whatever.com/index.php?page=userProfil.php
  2. www.whatever.com/userProfil.php
    好吧,我将点称为 1 和 2 模型,并假设我想使用 php + mysql + apache + 客户端 javascript(用于用户检查) - 仅用于背景信息。如果我使用 sererlets、jsp 和 Tomcat,模型的基本思想几乎是相同的,但我认为会有一些小的差异。所以结束它由我的平台是 php +mysql ...
    另一件事是,出于安全和未来证明的目的(将平台从 php 更改为另一个)显示".php"或".html"或任何文件类型都不是好主意(听说)。
    所以可以选择使用它(对于漂亮的网址):
  3. www.whatever.com/userProfile/

如果我用谷歌搜索得很好,它被称为mod_rewrite,我使用一些规则将我的模型(参见添加 1 和 2)转换为添加 3。
让我们感到荣幸,我现在实际上不太了解添加 3。

所以:

  • 我认为模型 1 和 2 我可以称之为"文件结构模型"。我的意思是add1我有一个页面(一个文件)并包含一些模块。所以在添加 1 中,我每次调用一个文件。添加 2 我每个页面都有新文件。因此,对于添加 2,我调用多个文件 - 对于不同的页面不同的文件。
  • 对于添加 3,第 1 点和第 2 点对用户来说是隐藏的 - 我认为这很好,因为他不知道我的文件结构(它的 + 为了安全起见),它看起来更好,用户可读性更好。

结论和问题:

  • 加 1 和 2 的优缺点 - 文件结构

  • 加3的优缺点

  • 基本概述 abouve add 1 和 2 结合 add 3(1,2 文件结构 + add 3 是什么样子的)

  • 我知道如何使用加 1 和 2,所以我可能使用其中一个,后来我想添加加 3(当我把它放到时) - 可能吗?

好的,所以你的问题是有道理的,但是使用你的编号和描述来构建PHP网站的最佳和最实用的方法是通过选项1和选项3添加,以获得通常所谓的SEO友好(又名:人类可读,漂亮,简单等)网址。

从实际的角度来看,构建一个系统以便所有调用都通过一个通用的index.php文件,作为编码人员,一开始就要承担一些繁重的工作。 但你猜怎么着?你是一个程序员,正在创建一个工具,它应该具有尽可能多的长期稳定性和安全性。 因此,尽可能多地向选项 1 编码符合您的最佳利益,也是您网站的最佳利益。

从安全的角度来看,很容易解释为什么选项 1 一直获胜。通过index.php解析内容请求,您可以轻松地针对一个区域中可能遇到的任何安全问题进行编程,而不是将自己分散在大量文件和功能中。 因此,假设您发现了一个安全漏洞并知道如何修复它。 通过让所有内容都经过index.php及其所依赖的文件,您可以在站点核心代码中添加补丁,以便无论您有 1、10、100 甚至 1,000 个页面或更多,都可以修补漏洞。

此外,在 2013 年,您不应该将文件名用于 URL 调用。 创建"漂亮"URL 的选项 3 解决了这个问题。 它会将您的实际文件系统 URL 与世界联系起来。它隐藏了你确实在使用PHP的事实。 请注意,任何安全计划的一部分,如果你确保你的网站不会通过标题向世界宣布你正在使用PHP,但这个概念不在这个问题的范围之内。

此外,拥有遮盖代码的漂亮URL的好处是:假设你厌倦了PHP,想转向Python或Ruby进行编码。 好吧,现在由于底层编程语言被掩盖了,您现在可以用另一种语言重新编程您的网站,只要您确保脚本对生病的网站 URL 做出预期反应,您就可以开始了。

第一种方法有一个明显的安全问题:恶意用户很清楚您正在根据用户输入包含文件,因此您应该正确清理page变量并确保包含密码等敏感数据的文件不可用于包含(即仅省略page中的字母数字字符 [无.../,空字节,Unicode特殊字符等],只允许包含".php"文件扩展名,将敏感数据与调用脚本不在同一目录中,甚至放在www-root之外等等)。

第二种方法是更好的IMO,没有明确的文件包含。但它表明你正在使用的PHP不一定是坏的,但理论上可以缩小攻击者对可能漏洞的搜索范围(想象一下,有人在PHP中发现了一个关键漏洞,然后世界各地的网站都被核武器,因为脚本小子通过谷歌搜索受害者inurl:index.php)。

这两种方式都有其SEO问题(第一种方式比第二种有更多的陷阱)。就像您希望迁移到另一个平台一样,正如您所写的那样,您要么需要模拟".php"扩展,要么由于URL更改而丢失一些流量(即使设置了重定向)。

我个人更喜欢第三种方法。在 Apache 服务器上设置并不难,基本上需要几行.htaccess(当然,您可以自定义所有内容):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php

引入这些行后,您将获得对不存在文件的所有请求,这些请求被馈送到您的索引.php。然后,您需要解析和清理应用程序中$_SERVER['REQUEST_URI']变量,并从数据库、文件或其他任何地方检索页面。通过这种方式,您将获得非常友好的 URL,并向攻击者披露更少的信息(至少对没有经验的人来说,除了查看文件扩展名之外,还有很多其他方法可以知道您的网站在哪个平台上运行)。