Module 2 - 任务列表
单人部分 (Individual Tasks)
第一步:了解 Linux (Learn About Linux)
- 学习 Linux (opens in a new tab) 的基础知识。
- 学习 Bash (opens in a new tab) 的基础知识。
对于 Windows 用户,还需要启用 Windows Subsystem for Linux (WSL) (opens in a new tab) 或安装 Cygwin (opens in a new tab)。
第二步:创建 AWS EC2 实例 (Create an AWS EC2 Instance)
- 创建一个 AWS EC2 实例 (opens in a new tab),为后续配置和开发做好准备。
请一定记得在创建时下载并保存 .pem
密钥文件,这个密钥非常重要!如果你丢失了它,将无法通过 SSH 连接到你的实例。另外,确保在安全组中配置打开 22 端口,并将其设置为 0.0.0.0/0 以允许所有 IP 访问,这样你才能通过 SSH 连接到服务器。
第三步:配置 SSH (Configure SSH)
- 配置 SSH (opens in a new tab) 以安全地连接到你的 AWS EC2 实例。
每次使用 SSH 登录时,不必像老师建议的那样使用完整的命令 ssh <your-instance-username>@<ec2-xx-xx-xx-xx.compute-1.amazonaws.com>
。你可以通过配置 .ssh/config
文件来简化登录过程。以下是详细步骤:
- 步骤:
-
打开你的本机终端并使用
vi
编辑器打开或创建~/.ssh/config
文件:vi ~/.ssh/config
-
在
vi
中,按i
键进入插入模式,然后添加以下内容,替换<ec2-xx-xx-xx-xx.compute-1.amazonaws.com>
为你的 EC2 实例的公共 DNS:Host my-ec2 HostName ec2-xx-xx-xx-xx.compute-1.amazonaws.com
其中,
my-ec2
是你可以自定义的别名,这样你以后只需要使用ssh my-ec2
命令就可以登录到你的 EC2 实例。 -
按
Esc
键退出插入模式,然后输入:wq
并按回车键保存并退出vi
编辑器。 -
现在,你可以通过以下命令连接到你的 EC2 实例,而无需输入完整的命令:
ssh username@my-ec2
- 进一步简化:
如果你希望进一步简化登录过程,还可以在 .ssh/config
文件中添加你的用户名。这样你甚至不需要每次都输入用户名:
Host my-ec2
HostName ec2-xx-xx-xx-xx.compute-1.amazonaws.com
User <your-instance-username>
配置完成后,你只需要输入以下命令即可登录到 EC2 实例:
ssh my-ec2
这个配置不仅简化了命令,还增加了使用 SSH 的便捷性,特别是在频繁连接到多个服务器时非常有用。
完成教程里所有的权限设置后登录自己的账户(不是root账户), 记得使用一次 sudo 命令 证明自己权限设置正确并截图放在自己的 github repo 里
任意sudo 指令都行比如说
sudo -v
或者
sudo ls
用一个自己喜欢的吧~
第四步:安装必要的软件包 (Install Essential Packages)
-
为了避免以后遇到不必要的麻烦,建议你在新建的 AWS EC2 Linux 实例时安装一些基本的包。这些软件包包括 Make 和 C 编译器等开发工具。
-
安装步骤(针对 RHEL 系统):
-
使用以下命令安装开发工具包:
$ sudo yum groupinstall "Development Tools" $ sudo yum install kernel-devel kernel-headers
-
第五步:设置时区 (Set the Timezone)
-
将实例的时区设置为芝加哥时间。你可以通过执行以下命令来实现:
sudo cp /usr/share/zoneinfo/America/Chicago /etc/localtime
设置完成后 使用date指令并且把结果截图放到自己 github repo 里
date
第六步:设置 Apache Web 服务器 (Set Up the Apache Web Server)
- 安装并配置 Apache Web 服务器 (opens in a new tab),以便托管你的 Web 应用程序。
这里当你测试 PHP 是否能直接访问文件时,不用像老师那样用 http://ec2-xxx-xxx-xxx-xx.compute-1.amazonaws.com/~paul/
这么长的域名。你可以直接使用 EC2 的公网地址。
点击链接后,它会自动使用 HTTPS 链接。记得点击链接后将 HTTPS 改为 HTTP,因为目前我们只开放了 80 端口。这样的话,以后我们每次测试都只需要访问 http://xx.xxx.xxx.xx
,而不用记那么长的一串域名。
记得把这个文件的链接放进README.md 中哦 证明自己的 UserDir 设置正确
.md
文件是一个纯文本文件,称为 Markdown 文件。其内容将在你的仓库页面上显示,使评分更加便捷。你可以使用粗体、超链接、图片、块引用和列表来样式化页面。这个在线 Markdown 编辑器 (opens in a new tab)可以帮助你学习这种格式。
第七步:安装 PHP (Install PHP)
-
安装 PHP 8.2 并配置以支持动态 Web 应用程序开发。
-
安装步骤:
-
执行以下命令以安装 PHP 8.2:
sudo yum install php sudo service php-fpm start
-
安装完成后,重启 Apache 使更改生效:
sudo systemctl restart httpd
-
-
PHP 配置:
-
PHP 的配置文件名为
php.ini
,在 RHEL 中,它位于/etc/php.ini
。 -
打开
php.ini
文件,找到并设置display_errors
选项为On
。你可以使用vi
编辑器来执行以下操作:-
使用
vi
打开php.ini
文件:sudo vi /etc/php.ini
-
在
vi
中,按/
键,然后输入display_errors
,按回车进行搜索。 -
找到
display_errors
选项后,按i
进入插入模式将其设置为On
:display_errors = On
-
按下
Esc
键,输入:wq
并按回车保存并退出。
-
-
重启 Apache 使更改生效:
sudo systemctl restart httpd
-
-
注意事项:
- 你可以使用
error_reporting()
和ini_set()
函数来在特定的 PHP 脚本中启用或禁用错误显示。 - 如果你让 PHP 记录错误,它们将存储在 Apache 错误日志文件中,路径为
/var/log/php-fpm/www-error.log
。
- 你可以使用
第八步:学习 PHP 语言 (Learn about the PHP Language)
- 学习 PHP (opens in a new tab) 编程语言的基础知识。
第九步:设置工作空间 (Set Up your Workspace)
- 配置并整理你的开发工作空间 (opens in a new tab),以便进行高效开发。
第十步:实现计算器 (Calculator)
- 好啦!用你刚刚学到的知识使用 PHP 实现一个基本的计算器,能够执行四则运算。
不要忘记把计算器的链接放进README.md 中!
写完记得复制输出后的html代码在 W3C (opens in a new tab) 检查一下哦
第十一步:Git 教程 (Git Tutorial)
- 完成 Git 教程 (opens in a new tab),并将学习成果提交到你的 GitHub 仓库中。
分别给 main 和 remote 的结果截图放进你的 github repo 就好啦
推荐阅读老师发的网络安全第一部分 (opens in a new tab)
个人项目评分标准 (Grading)
云实例和 Web 服务器 (Cloud Instance and Web Server) - 30 分
-
SSH 连接 (15 分)
- 你可以使用自定义的用户名和 SSH 密钥登录到你的实例。将终端 SSH 到实例的截图放入你的仓库中。
-
SUDO 命令 (5 分)
- 你的自定义用户名能够执行 SUDO 命令。将成功执行 SUDO 命令的截图放入你的仓库中。
-
时区设置 (5 分)
- 实例的时区设置正确。将执行
date
命令的结果截图放入你的仓库中。
- 实例的时区设置正确。将执行
-
UserDir Apache 模块 (5 分)
- UserDir Apache 模块工作正常。在
/home/<username>/public_html
中放置一个文件,并在你的 README.md 中链接到该文件。
- UserDir Apache 模块工作正常。在
PHP 计算器 (PHP Calculator) - 15 分
-
功能实现 (每项功能 2 分,总计 8 分)
- 计算器能够执行四则运算,并支持浮点数计算。
-
选择功能 (4 分)
- 每个功能通过单选按钮选择。
-
HTML 验证 (3 分)
- 计算器页面通过 W3C HTML 验证。
-
README 链接
- 在你的个人仓库的 README.md 文件中包含指向你实例上计算器的链接。
Git 教程 (Git Tutorial) - 20 分
- 完成全部main和remote的教程
- 在你的个人作业仓库中放置两张截图,展示你完成了 Main 和 Remote 部分的所有关卡。
请确保在作业截止时间前将代码提交到 GitHub。尽早并频繁提交代码, 不然可能导致评分为0。
多人部分 (Group Tasks)
请注意:在多人部分中,每个小组成员都需要积极参与。请务必在个人部分完成后再开始小组任务,因为这将使你的开发过程更加顺畅。
第一步:项目介绍 (Project Overview)
- 与另一位同学合作,完成一个简单的文件共享网站。该网站应支持文件的上传、查看和删除功能。
第二步:设置用户文件 (Set Up User Files)
-
在服务器的安全位置创建一个名为
users.txt
的文件。该文件应包含至少三个用户名,每行一个用户名。 -
注意事项:
- 不需要为用户设置密码,密码加密将在模块 3 中介绍。
- 用户可以通过输入用户名登录系统。
将 users.txt
文件放在服务器的安全位置,确保其无法通过网站直接访问。避免将其放在 public_html
目录中。
第三步:实现登录和注销功能 (Implement Login and Logout Functionality)
-
任务描述:实现用户登录和注销功能。用户登录后应能够看到与其用户名关联的所有文件列表,并且能够安全地注销。
-
实现方式:
- 登录功能:用户可以通过输入用户名登录系统,成功登录后,系统应显示与该用户名关联的所有文件。
- 注销功能:用户可以选择注销,注销后sessions应被销毁,用户信息从sessions中清除,并重定向到登录页面。
建议使用 sessions 在页面之间传递用户信息,因为在模块 3 中将要求使用 sessions。如果可能的话,现在就开始使用 sessions,以便后续开发更加顺畅。
确保在用户注销时销毁sessions以确保安全,并防止未授权的访问。
第四步:文件操作功能 (File Operations)
- 实现以下文件操作功能:
- 查看文件:用户可以查看与其用户名关联的文件。
- 上传文件:用户可以上传文件,并将其与自己的用户名关联。
- 删除文件:用户可以删除与其用户名关联的文件。
确保 URI 不泄露网站的内部文件结构。例如:
- 错误示例:
http://www.example.com/download.php?file=/home/paul/file.txt
- 正确示例:
http://www.example.com/view.php?user=music&name=file.txt
在查看文件功能中,确保不仅能够查看纯文本文件 (txt),还要能够直接打开并浏览各种格式的文件,例如 PDF、PNG 文件等。功能的实现应当尽可能全面,以便用户可以方便地查看不同类型的文件。
第五步:权限设置 (Permission Settings)
-
配置文件权限,以便
apache
用户和 PHP 脚本能够读取和写入必要的文件。 -
详细步骤:
-
创建上传文件夹:
-
首先,在服务器上创建一个用于存储用户上传文件的文件夹。为了安全起见,这个文件夹应当位于
public_html
文件夹之外。例如,可以创建一个名为uploadedfiles
的文件夹:mkdir /path/to/uploadedfiles
-
这里的
/path/to/uploadedfiles
是文件夹的完整路径,请根据你的实际需求替换为具体路径。
-
-
更改文件夹权限:
-
默认情况下,
apache
用户没有权限访问public_html
目录之外的文件夹。因此,我们需要使用chown
命令将uploadedfiles
文件夹的所有权更改为apache
用户,使其具有读取和写入权限:sudo chown apache:apache /path/to/uploadedfiles
-
该命令将文件夹的所有者更改为
apache
用户,同时将所属组更改为apache
组。
-
-
设置文件夹权限:
-
为了确保
apache
用户可以在该文件夹中执行读取和写入操作,还需要调整文件夹的权限。使用chmod
命令为文件夹赋予适当的权限:sudo chmod 755 /path/to/uploadedfiles
-
755
权限意味着文件夹的所有者(即apache
用户)拥有读取、写入和执行权限,而组用户和其他用户仅具有读取和执行权限。这种权限设置可以确保apache
用户能够管理文件,同时防止其他用户对文件进行写入操作。
-
-
测试权限:
- 完成上述步骤后,你可以通过模拟文件上传来测试权限设置。确保 PHP 脚本能够成功地将文件上传到
uploadedfiles
文件夹,并且apache
用户可以读取和写入这些文件。
- 完成上述步骤后,你可以通过模拟文件上传来测试权限设置。确保 PHP 脚本能够成功地将文件上传到
-
通过这种方式,你可以确保用户上传的文件安全存储在服务器上,同时保护网站的内部文件结构和敏感数据不被暴露。
第六步:创意功能 (Creative Feature)
- 根据你的兴趣,为文件共享网站添加一两个额外的功能。例如:
- 文件搜索功能
- 按日期排序文件
- 文件预览功能
老师推荐这个链接 (opens in a new tab)可能有所帮助,当然你也可以自己查阅更多
请确保你设计的功能具有足够的难度,因为这一部分的分数占比很高。如果功能设计过于简单,将无法获得高分。如果不确定你设计的功能是否足够复杂,请提前与助教 (TA) 确认,以确保你的创意功能能够达到预期的评分标准。
第七步:Web 安全性和验证 (Web Security and Validation)
- 确保你的项目遵循 FIEO(过滤输入和转义输出)原则 (opens in a new tab)。你需要过滤的内容包括文件名、用户名等。
你的项目PHP输出后的html代码必须通过 W3C HTML 验证器的验证,并且没有错误或警告。请参考 HTML 和 CSS 指南 (opens in a new tab) 了解更多信息。
推荐阅读本周的Web 应用安全指南 (opens in a new tab)。
第八步:提交 (Submission)
- 在 GitHub 仓库中提交所有代码和截图。
请确保在你的组仓库中有一个 README.md 文件,内容包括:
- 你们文件共享网站的链接。
- 你为创意部分所做工作的简要描述。
- 任何 TA 需要的额外登录信息。
多人项目评分标准 (Grading)
文件共享网站 (File Sharing Site) - 40 分
文件管理 (File Management) - 25 分
- 用户登录前无法查看文件:用户在输入用户名并登录前不应看到任何文件(4 分)。
users.txt
文件应存储在文件系统的安全位置,确保无法通过在浏览器中输入任何 URL 直接查看该文件的原始内容。
-
文件列表:用户可以查看他们上传的所有文件列表(4 分)。
-
文件查看:用户可以打开他们之前上传的文件(5 分)。
用户应能够打开不仅是纯文本文件,还应包括其他格式的文件,如图片、电子表格等。
- 文件上传:用户可以上传文件,并将其与自己的用户名关联(4 分)。
与 users.txt
一样,上传的文件应存储在文件系统的安全位置,避免将上传目录放在 Apache 服务的目录下。
-
文件删除:用户可以删除文件。如果文件被"删除",它应当从文件系统中实际移除(4 分)。
-
隐藏目录结构:用户不应通过操纵 URL 访问或查看文件(2 分)。
-
用户注销:用户可以注销(2 分)。
如果使用sessions变量,必须通过销毁sessions实际注销用户;即不仅仅是重定向到登录页面。
最佳实践 (Best Practices) - 10 分
-
代码格式良好且易于阅读:代码格式良好,易于阅读,并有适当的注释(4 分)。
-
遵循 FIEO 原则:网站遵循 FIEO(过滤输入和转义输出)原则(3 分)。
-
所有页面通过 W3C 验证:所有页面都通过 W3C 验证器验证,没有错误或警告(3 分)。
可用性 (Usability) - 5 分
-
网站易于使用和导航:网站直观易用,导航方便(4 分)。
-
网站视觉吸引力:网站具有视觉吸引力(1 分)。
创意部分 (Creative Portion) - 15 分
-
任务描述:根据你的兴趣,为文件共享网站添加一两个额外的功能。你可以在 README.md 文件中简要描述你为创意部分所做的工作。
⚠️请确保你设计的功能具有足够的难度,因为这一部分的分数占比很高。如果功能设计过于简单,将无法获得高分。如果不确定你设计的功能是否足够复杂,请提前与助教 (TA) 确认,以确保你的创意功能能够达到预期的评分标准。
请确保在作业截止时间前将代码提交到 GitHub。尽早并频繁提交代码, 不然可能导致评分为0。