20155312 张竞予 Exp 8 Web基础

Exp 8 Web基础

目录


基础问题回答

(1)什么是表单

  • 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:
    • 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
    • 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
    • 表单按钮:包括提交按钮、复位按钮和通常按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还能够用表单按钮来控制其余定义了处理脚本的处理工做。

(2)浏览器能够解析运行什么语言。

浏览器只看得懂html、css、js、xml等语言,像其余的服务器端动态脚本,如php、jsp等的解析工做是在服务器完成的。javascript

(3)WebServer支持哪些动态语言

目前,最经常使用的三种动态网页语言有ASP(ActiveServerPages),JSP(JavaServerPages),PHP(HypertextPreprocessor)。php

  • ASP全名ActiveServerPages,是一个WEB服务器端的开发环境,利用它能够产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Javascript)做为本身的开发语言。
  • PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法,并耦合PHP本身的特性,使WEB开发者可以快速地写出动态产生页面。它支持目前绝大多数数据库。还有一点,PHP是彻底免费的,不用花钱,你能够从PHP官方站点(http://www.php.net)自由下载。并且你能够不受限制地得到源码,甚至能够从中加进你本身须要的特点。
  • JSP是Sun公司推出的新一代网站开发语言,Sun公司借助本身在Java上的不凡造诣,将Java从Java应用程序和JavaApplet以外,又有新的硕果,就是JSP,JavaServerPage。JSP能够在Serverlet和JavaBean的支持下,完成功能强大的站点程序。

三者都提供在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成Servlet并由Java虚拟机解释执行,这种编译操做仅在对JSP页面的第一次请求时发生。在ASP、PHP、JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP、PHP、JSP页面须要附加的语言引擎分析和执行程序代码。程序代码的执行结果被从新嵌入到HTML代码中,而后一块儿发送给浏览器。ASP、PHP、JSP三者都是面向Web服务器的技术,客户端浏览器不须要任何附加的软件支持。css

返回目录html


实践过程记录

1.安装阿帕奇时出现没法得到锁错误“E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)”
前端

  • 解决:找到而且杀掉全部的apt-get 和apt进程
  • ps -A | grep apt查看有哪些进程与“apt”有关
  • 个人显示结果是没有任何进程,因此试着再运行一次安装语句sudo apt-get install apache2,第二次运行就能够了。

2.运行service apache2 start开启阿帕奇时再次出错:
java

  • 解决:按照提示,输入journalctl -xe查看具体的错误缘由以下:

  • 由上图所示,这里有个错误“ Unable to open logs”,在网上搜索相关缘由,发现若是Apache默认的80端口被占用才会报这个错。
  • 因此用netstat -tupln | grep 80查看Local Address中Listening 80的应用的PID, 去任务管理器中找到对应的进程,而后用kill processID(进程ID)关闭此进程便可,再次开启Apache再也不有错误提示,以下图所示:

【注】:这里也能够经过修改配置文件的方法,把Apache的默认端口从80改成其余的未被占用的端口。mysql

3.运行netstat -aptn后,发现了正在使用端口80的Apache2,说明开启成功:web

4.下面进行两个测试,看看Apache工做是否正常:sql

  • 测试1:在浏览器中输入127.0.0.1:80
  • 出现问题:竟然显示的是qq邮箱,通过咨询老师,找到了缘由,我用的是老师的虚拟机,老师在不少年前,把默认的欢迎界面设置成了qq邮箱的登陆界面,因此当不指定任何html文件时,会默认访问该欢迎界面。
  • 测试2:测试apache是否可读取工做目录下的文件,在浏览器中输入127.0.0.1:80/20155312/login.html
  • 解释:这里我指定的路径“/20155312/login.html”是我在/var/www/html路径下新建了一个以本身学号命名的文件夹“20155312”,其中有一个我写的前端html登陆文件“login.html”,具体怎么写html文件,能够参考老师提供的w3school网页,而我主要采用了上学期网络安全编程基础这么课中最后本身设计的登陆界面并对其稍做修改(具体的Eclipse与Apache中编程的区别后面会详细介绍),访问结果以下所示:


8.接下来进行前端编程,我只把Eclipse中的登陆界面代码修改了两个地方:数据库

  • 一是各类图片的路径名,确定不能还用Windows中哪一个盘下的哪一个文件夹中的哪张图片这种方式,我将相关图片拷贝到工做目录“/var/www/html/20155312/”中后,直接用“./图片名”的方式,指定了图片的位置
  • 二是按照老师的教程,由于咱们要使用PHP进行后台编程,因此要将原来的action改为一个php文件的名字,例如:<form action="login.php" method="post" >,具体php文件怎么写,咱们面再详细介绍。
  • 三要注意添加javascript的相关代码,个人代码实现了利用javascript检查用户名或密码是否为空,若为空则弹出提示框并从新跳转回登陆界面:

  • 注:若要按登陆按钮先调用本身编写的函数,必定要将登陆按钮的type设置为button而非submmit,如type = "button"不然,会出现出现警告框点肯定后,没法跳转到指定界面的错误。

个人前端代码以下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆页面</title>
<script language="javascript">
var movingID=null;
var scrolling=false;
function startMove()
{
    
    var left=eval(bear.style.left.replace("px",""));
    if(left <document.body.scrollWidth-400)
        bear.style.left=left+1;
    else
        bear.style.left=1;
    movingID=setTimeout("startMove()",0.1); 
    
}
function mysubmit()
{ 
    if(document.form1.password.value==""   || document.form1.username.value=="")
    {
        alert("用户名、密码不能为空!");
        window.location.href="login.html"
    
    }   
    else
       form1.submit();
}
</script>
<style type="text/css">
a:link{color:#41506D;font-size:125%;text-decoration:none}
a:visited{color:#41506D;font-size:125%;text-decoration:none}
a:hover{color:#FFF200;font-size:125%;text-decoration:none}
</style>
</head>
<body  onload="startMove()" style="background-image: url(./login.png);background-repeat:no-repeat;topmargin:60;leftmargin:12 ;overflow-x:hidden;overflow-y:scroll;" >
<br><br><br>
    <p align="right">
    <a  target=_parent href="index.jsp" >登 录</a>    &nbsp;&nbsp;     <a target=_parent href="addone.jsp" >注 册</a>
    </p>
<form action="login.php" method="post" name="form1">
<table style="background: url(./登陆.png);background-repeat:no-repeat;position:relative;left:300px;top:0px;border-collapse:collapse;">
<tr><th style="border:5px solid white;height:50px;width:230px;padding:0px;text-align:center;vertical-align:center;color:#41506D;font-size:150%;font-family:Microsoft YaHei UI;">
帐 号 密 码 登 录
</th></tr>
<tr>
<td style="border:5px solid white;height:180px;width:230px;padding:0px;text-align:center;vertical-align:center;color:#41506D;">

<p style="position:absolute;left:27px;top:50px;font-size:130%;color:white;font-family:Microsoft YaHei UI;">用户名 </p>
 <input align="center" type="text" name = "username"  style="position:absolute;left:100px;top:70px;height:35px;width:100px;font-size:130%;"/> <br><br>
<p style="position:absolute;left:27px;top:100px;font-size:130%;color:white;font-family:Microsoft YaHei UI;">密&nbsp;&nbsp;&nbsp;码 </p>
&nbsp; <input align="center" type="password" name = "password"  style="position:absolute;left:100px;top:120px;height:35px;width:100px;font-size:130%;"> <br>
<input type = "button" value = "提交" onClick="mysubmit()" style="position:absolute;left:50px;top:190px;height:35px;width:150px;font-size:120%;">

</td>
</tr>
</table></form>

<div id="bear" style="visibility:visible;position:absolute;left:1px;top:330px;z-index:1;width:400px;height:170px;overflow-x:hidden;overflow-y:hidden;">
<img src="./北极熊2.png">
<img src="./北极熊3.png">

</div>

</body>
</html>

9.下载安装php并进行测试

  • php安装使用命令sudo apt-get install php
  • 安装完成后测试php是否可正常工做
    • 首先,编辑/var/www/html/test.php 内容为<?php include($_GET["a"]); ?>
    • 接着在浏览器中输入127.0.0.1:80/test.php?a=/etc/passwd可看到/etc/passwd文件的内容,以下图所示。

  • 注:若是想这里测试成功,首先须要保证apache成功开启(service apache2 start

10.后台php编程,因为后台编程涉及到数据库名称和具体的字段名称,因此先进行后续的数据库操做,再回头编写后台。

11.安装MySQL,执行指令apt-get install mysql-server mysql-client mysql-workbench后,安装失败,提示“Package mysql-client is not available, but is referred to by another package”,以下图所示:

  • 解决:下载半天不行,用了各类方法,好比更新ubuntu的/etc/apt/source.list中的源sudo apt-get -y update、运行apt-get updateapt-get upgrade都没有解决问题。猜想老师的虚拟机已经下载好了mysql。
  • 运行老师提供的指令直接运行service start/stop/restart mysql也不行,最终运行`/etc/init.d/mysql start开启MySQL服务就能够了……

12.开启mysql后,先登陆root用户,密码是p@ssw0rd直接复制粘贴就好,不要尝试本身输入了,我试了p@ssw0rd,p@sswOrd都不行,不知道咋回事

13.用show databases;查看数据库基本信息,注意这里每一个sql语句要以分号为结尾,否则就会像我这样:

14.输入use mysql;选择使用mysql这个数据库

15.输入select user, password, host from user;查看当前用户信息

16.输入update user set password=PASSWORD("新密码") where user='root';更改密码

17.输入flush privileges;更改权限

18.输入exit退出,而后使用新密码从新登陆mysql -u root -p

19.输入create database 数据库名称;建立数据库,注意这里数据库名字不能够是学号这些数字,不然会出现我这样的错误,用英文吧~

20.输入show databases;查看存在的数据库;输入use zjy使用刚建立的数据库zjy。

21.输入create table user (username VARCHAR(20),password VARCHAR(20));建立一个名为user的数据表,表中包含VARCHAR类型的两个字段:username和password

  • 这里使用的是varchar类型而非char类型,他们的差异以下:
    • char类型指定大小后会预分配固定大小,不论是否使用空间都被占用
    • varchar类型用多少占多少,只是不能超过括号中指定的上限

22.输入show tables;查看全部的表,能够发现刚刚新建的user

23.输入insert into user values('20155312','1234');向表中username password两个字段插入数据,即用户名为20155312,密码为1234

24.输入grant select,insert,update,delete on zjy.* to zjy@localhost identified by "20155312";将对某数据库的全部表的select,insert,update,delete权限授予当前主机localhost登陆的用户zjy,2015312是登陆密码,注意加引号。

25.输入输入exit退出,而后使用新密码从新登陆zjy用户mysql -u zjy -p

登陆成功,说明用户建立成功。

26.如今开始后台编程,编写login.php,注意要与前端action指定的php名称对应,具体代码以下:

<?php
$uname=$_POST["username"];
$pwd=$_POST["password"];
echo $uname;
$query_str="SELECT * FROM user where username='$uname' and password='$pwd';";
$mysqli = new mysqli("127.0.0.1", "zjy", "20155312", "zjy");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
echo "connection ok!";
/* Select queries return a resultset */
if ($result = $mysqli->query($query_str)) {
    if ($result->num_rows > 0 ){
            echo "<br> Welcome login Mr/Mrs:{$uname} <br> ";
    } 
    else {
        echo "<br> login failed!!!! <br> " ; }
    /* free result set */
    $result->close();
}
$mysqli->close();
?>

登陆成功以下图所示:

输入一个数据库中根本没有的用户名和密码,显示链接数据库成功,但登陆失败

27.接下来进行SQL注入攻击,在用户名输入框中输入' or 1=1#,密码随便输入,是能够登录成功的。

  • 解释:输入的用户名' or 1=1#提交到后台后,被做为SQL语句中的第一个参数填入,使SQL语句变成select * from users where username='' or 1=1#' and password='',#至关于注释符,会把后面的内容都注释掉,而1=1是永真式,因此这个条件永远成立,因此可以成功登录。所以,要想避免SQL注入,应当限制用户在用户名中输入'#等特殊符号。

28.尝试经过SQL注入新建用户名和密码并保存在数据库中,这样下次用本身偷偷新建的用户名密码登陆便可。

  • 将代码中if ($result = $mysqli->query($query_str))改成if ($result = $mysqli->multi_query($query_str))使其容许一次执行多个SQL语句

29.用户名除输入';insert into users values('20155333','111');#为个人室友偷偷建一个用户,用户名20155333,密码111

  • 这是由于在填入SQL语句后,由于'的存在,该语句被拆成了如下两个SQL语句,第一个语句虽然会致使登陆失败,但第二个添加了一个用户数据。
    • SELECT * FROM users WHERE username='';
    • insert into users values('20155333','111');#
  • 最后一个#把后面的都注释掉了,因此无论密码输入什么按道理都不影响

咱们能够查看一下本地数据,看看有没有增长什么

结果并无成功,为何呢????我也不知道哎

30.接下来尝试进行XSS攻击即跨站脚本攻击,首先将一张图片login.png 存入/var/www/html目录

31.在用户名输入框中输入<img src="login.png " />balabala</a>读取/var/www/html目录下的图片

运行结果以下所示,正确显示了网页背景图:

返回目录


实验体会

本次实验,我最大的体会就是,网络对抗这门课是个综合性很强的课程,能够与不少咱们学过或正在学习的课程融通,好比上学期的网络安全编程基础,和这学期的信息系统安全等,关于网页编程和数据库的知识,确实打下了基础后进行跨平台学习也会相对容易,就像学会了c语言再学其余语言时也会节省很多力气。因此,我以为既然学一门课就要学好、弄懂,若是只是浮于表面,或是最后应付一个考试,可能真的等到毕业后就都忘记了。

相关文章
相关标签/搜索