赞
踩
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。
关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。超文本标记语言Html的结构包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
一个网站对应多个HTML文件,超文本标记语言文件以.htm
(磁盘操作系统DOS限制的外语缩写)为扩展名或.html
(外语缩写)为扩展名。可以使用任何能够生成TXT类型源文件的文本编辑器来产生超文本标记语言文件,只用修改文件后缀即可。
标准的超文本标记语言文件都具有一个基本的整体结构
这2个标记符分别表示头部信息的开始和结尾。头部中包含的标记是页面的标题、序言、说明等内容,它本身不作为内容来显示,但影响网页显示的效果。头部中最常用的标记符是标题标记符和meta标记符,其中标题标记符用于定义网页的标题,它的内容显示在网页窗口的标题栏中,网页标题可被浏览器用作书签和收藏清单。
网页中显示的实际内容均包含在这2个正文标记符之间。正文标记符又称为实体标记。
JavaScript一种直译式脚本语言,它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
Javascript脚本语言和其他语言一样
<html>
<head>
<title>Javascript简单示例</title>
</head>
<body>
<script language="javascript">
alert("第一个javascript");
</script>
</body>
</html>
在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。
会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。用平述的语言可以解释为:你拔打你女友的电话号码,你女友接听,然后一翻“亲爱的”,直到任何一方挂掉电话,这个过程就是一个会话。你挑逗一只小狗,它跟你互动,也是会话;它不鸟你,那就不形成会话。
HTTP协议属于无状态的通信协议。无状态是指,当浏览器发送请求给服务器的时候,服务器响应,但是当同一个浏览器再发送请求给服务器的时候,他不知道你就是刚才那个浏览器。简单地说,就是服务器不会去记得你,所以是无状态协议。
本质是,HTTP是短连接的,请求响应后,断开了TCP连接,下一次连接与上一次无关。
为了识别不同的请求是否来自同一客户,需要引用HTTP会话机制。即:多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session)。通过会话管理对会话进行创建、信息存储、关闭等。
Cookie
与session
是与HTTP会话相关的两个内容,其中Cookie存在在浏览器,session存储在服务器中。
Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求附上这些cookies。
具体来说,cookie机制采用的是在客户端保持状态的方案
它是在用户端的会话状态的存贮机制,需要用户打开客户端的cookie支持。cookie的作用是为了解决HTTP协议无状态的缺陷所作的努力。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
Session机制是一种服务器端的机制。
服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。所以,一种常见的HTTP会话管理就是,服务器端通过session来维护客户端的会话状态,而在客户端通过cookie来存储当前会话的session id。
但 cookie 可以被人为的禁止,则必须有其他机制以便在 cookie 被禁止时仍然能够把session id 传递回服务器。经常被使用的一种技术叫做 URL 重写,就是把 session id 直接附加在 URL 路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把 session id 传递回服务器
分为WEB静态语言和WEB动态语言,WEB静态语言就是通常所见的超文本标记语言(标准通用标记语言下的一个应用),WEB动态语言主要是ASP、PHP、JAVA、Javascript、CGI等计算机脚本语言编写出来的执行灵活的互联网网页程序。
PHPnow是Win32下绿色免费的Apache + PHP + MySQL 环境套件包。简易安装、快速搭建支持虚拟主机的 PHP 环境。附带 PnCp.cmd控制面板
,帮助你快速配置你的套件,使用非常方便。
PHPnow 是绿色的,解压后执行 Setup.cmd 初始化,即可得到一个 PHP + MySQL 环境。然后就可以直接安装 Discuz!,PHPWind, DeDe, WordPress 等程序。
具体安装不作详细说明
点击PnCp.cmd,如下:
选择序号20,即可启动PHPnow。打开网页,访问http://127.0.0.1如下:
点击phpMyAdmin将进入数据库管理界面,可以自行创建数据库、表以及录入数据等:
使用工具Dreamweaver
,来编辑产生一个静态网页,该网页命名为js.htm,存储到PHPnow\htdocs下。
在网页js.htm中,进行如下四个代码的编辑和运行,可以看到Javascript对浏览器中网页内各元素的读写功能。
<html>
<head>
<title>Javascript简单示例</title>
<script language="javascript">
for(i= 1; i <= 100; i++){
num= Math.floor(Math.random() * 100);//0-99之间的随机数
document.write(num,"");
}
</script>
</head>
<body>
</body>
</html>
<html> <head> <title>Javascript简单示例</title> <script language="javascript"> function func1(){ alert("按钮单击后调用的函数1!"); } function func2(){ alert("按钮单击后调用的函数2!"); } </script> </head> <body> <!--单击后调用两个函数用”,“隔开 --> <input type="button" value="单击我" onClick="func1(), func2()" /> </body> </html>
<html> <head> <title>Javascript简单示例</title> </head> <body> <script language="javascript"> function Student(name, school, grade){ this.name= name;//注意这里要用this this.school=school; this.grade= grade; } hui= new Student("noting_gonna", "XX学校", "小学二年级"); //使用with可以省略对象名 with(hui){ document.write(name+ ": " + school + "," + grade + "<br />"); } if(window.hui){ document.write("hui这个对象存在"); } else document.write("hui这个对象不存在"); </script> </body> </html>
<html> <head> <title>Javascript简单示例</title> </head> <body> <script language="javascript"> function getLoginMsg(){ //以下也达到了省略对象名称的作用 loginMsg= document.loginForm; alert("账号:" +loginMsg.userID.value + "\n" + "密码:" +loginMsg.password.value); } function setLoginMsg(Object){ alert(Object.id); } </script> <form name="loginForm"> 账号:<input type="text" name="userID" /><br /> 密码:<input type="text" name="password" /><br /> <input type="button" value="登录" onclick="getLoginMsg()" /> 记住密码<input type="checkbox" id="这是checkbox的id" onclick="setLoginMsg(this)" /> </form> </body> </html>
PHP是一种免费的脚本语言,主要用途是处理动态网页,也包含了命令行运行接口。
PHP需要在每个语句后用分号结束,在一个PHP代码段中的最后一行可以不用分号结束。
使用注释可以增加语言的可读性,PHP支持三种C/C++、perl、unix-shell风格的注释:
# ——Perl式的单行注释
// ——C++式的单行注释
/* */ ——C/C++式多行注释
变量解析当遇到符号$时产生,解析器会尽可能多地取得后面的字符以组成一个合法的变量名,然后将变量值替换他们,如果$后面没有有效的变量名,则输出"$"。如果想明确的变量名可以用花括号把变量名括起来。
<?php
$username = “liuzheli”;
$SQLStr = "SELECT * FROM userinfo where username='$username'";
echo $SQLStr ;
?>
在对上述php段进行解析时,第一个$标识的username将被解析为一个变量,因为第一次定义,将分配内存空间被赋以初值liuzheli。在第二个标识的变量SQLStr的初值中,因为$username已经被解析为变量,所以,最终显示的结果是:SELECT * FROM userinfo where username=’ liuzheli '。
同样也可以解析数组索引或者对象属性。对于数组索引,右方括号(])标志着索引的结束。对象属性则和简单变量适用同样的规则。
使用工具Dreamweaver来编辑产生一个静态网页,该网页命名为login.htm,存储到PHPnow\htdocs下。
htdocs是PHPnow的web应用的根目录。
<form id="form1" name="form1" method="post" action="loginok.php"> <table width="900" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20">姓名</td> <td height="20"><label> <input name="username" type="text" id="username" /> </label></td> </tr> <tr> <td height="20">口令</td> <td height="20"><label> <input name="pwd" type="password" id="pwd" /> </label></td> </tr> <tr> <td height="20"> </td> <td height="20"><label> <input type="submit" name="Submit" value="提交" /> </label></td> </tr> </table> </form>
Form表单:表单是一个包含表单元素的区域。表单区域里包含了两个文本框()、一个确认按钮(submit) 。确认按钮的作用是当用户单击确认按钮时,表单的内容会被传送到另一个文件。
表单属性:表单的动作属性(action)定义了目的文件的文件名。由动作属性定义的这个文件通常会对接收到的输入数据进行相关的处理。在上面的表单中定义了接受表单输入的处理文件为“loginok.php”。method属性指定了与服务器进行信息交互的方法为POST。
HTTP定义了与服务器交互的不同方法,最基本的方法有4种:GET、POST、PUT、DELETE。
URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET、POST、PUT、DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息,早期的系统由于不支持DELETE,因此PUT和DELETE用的较少。
处理提交输入的第一个php文件代码如下:
<?php
$username = $_POST['username'];
$pwd = $_POST['pwd'];
$SQLStr = "SELECT * FROM userinfo where username='$username' and pwd='$pwd'";
echo $SQLStr ;
?>
搭建环境,将表单的输入改为GET,php的程序也改为GET,看看变化在哪里?
具体地,POST和GET的区别如下:
(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=sean&password=123。
POST的安全性要比GET的安全性高:
1.GET模式下,通过URL就可以作数据修改
2.GET模式下,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存、其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了
3.GET模式下,提交数据还可能会造成跨站请求伪造攻击
在myDB库中,设有一个表userinfo,包含两个字段,即username、pwd。
假设在上述login.php中实现对输入的用户名和密码进行认证,代码如下:
<?php
$conn=mysql_connect("localhost", "root", "123456"); //连接数据库
$username = $_POST['username'];
$pwd = $_POST['pwd'];
$SQLStr = "SELECT * FROM userinfo where username='$username' and pwd='$pwd'"; echo $SQLStr ;
$result=mysql_db_query("MyDB", $SQLStr, $conn); //执行数据库SQL语句
if ($row=mysql_fetch_array($result))//读取数据内容
echo "<br>OK<br>";
else
echo "<br>false<br>";
mysql_free_result($result); // 释放资源
mysql_close($conn); // 关闭连接
// 登陆成功则显示ok否则显示false
?>
//1. 连接数据库:
$conn=mysql_connect("localhost", "root", "123456");
//2. 执行SQL操作:
$result=mysql_db_query("MyDB", $SQLStr, $conn);
//3. 关闭连接:
mysql_free_result($result); mysql_close($conn);
数据库的操作主要依赖于SQL语句,查询数据并显示的一个例子如示例:
<?php
// 定位到第一条记录
mysql_data_seek($result, 0);
// 循环取出记录
while ($row=mysql_fetch_row($result))
{
for ($i=0; $i<mysql_num_fields($result); $i++ )
{
echo $row[$i];
echo " | ";
}
echo "<br>";
}
?>
创建show.php来演示验证:
<?php $conn=mysql_connect("localhost", "root", "123456"); //连接数据库 $SQLStr = "SELECT * FROM userinfo "; //echo $SQLStr ; $result=mysql_db_query("MyDB", $SQLStr, $conn); //执行数据库SQL语句 // 定位到第一条记录 mysql_data_seek($result, 0); // 循环取出记录 while ($row=mysql_fetch_row($result)) { for ($i=0; $i<mysql_num_fields($result); $i++ ) { echo $row[$i]; echo " | "; } echo "<br>"; } mysql_free_result($result); // 释放资源 mysql_close($conn); // 关闭连接 ?>
Cookie和session
共性:都可以暂时保存在多个页面中使用的变量。
区别:cookie存放客户端浏览器,session保存在服务器。它们之间的联系是session ID一般保存在cookie中,来实现HTTP会话管理。
Cookie工作原理
生成Cookie:当客户访问某网站时,PHP可以使用setcookie函数告诉浏览器生成一个cookie,并把这个cookie保存在c:\Documents and Settings\用户名\Cookies目录下。
使用Cookie:Cookie是HTTP标头的一部分,当客户再次访问该网站时,浏览器会自动把与该站点对应的cookie发送到服务器,服务器则把从客户端传来的cookie将自动地转化成一个PHP变量。
SetCookie函数
对 cookie 进行赋值的函数为setcookie,赋值成功返回 true,否则返回 false。
函数原型如下:
setcookie(name, value, expire, path, domain, secure)
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的有效期。
举例,time()+3600*24*30 将设置 cookie 的过期时间为 30 天。
secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
domain 可选。规定 cookie 的域名。
path 可选。规定 cookie 的路径。
如下实例设置COOKIE
<?php
if ($row=mysql_fetch_array($result))//读取数据内容
{
setcookie("uname",$username);//创建一个索引为uname的cookie
echo "<br>OK<br>";
} else {
echo "<br>false<br>";
}
?>
//在loginok.php中对应修改
可以通过$HTTP_COOKIE_VARS[“uname”] 或 $_COOKIE[“ uname ”]
来访问索引为name的 cookie 的值。
<?php
if ($_COOKIE["uname"]==null)
echo "should cookie";
else
echo "ok";
?>
//在show.php中对应修改
由于示例所使用的是内存COOKIE,即没有设定COOKIE值的expires参数,也就是没有设置COOKIE的失效时间情况下,这个COOKIE在关闭浏览器后将失效,并且不会保存在本地。验证:关闭浏览器后,重新打开浏览器直接访问useCookie.php,则发现,提示should cookie。
设置Cookie有效期
修改示例中的COOKIE类型为设置expires参数
即COOKIE的值指定了失效时间,比如
setcookie(“uname”,$username, time()+36002430),
那么这个COOKIE 会保存在本地,关闭浏览器后再访问网站useCookie.php,则发现,提示ok。
可见:在COOKIE有效时间内所有的请求都会带上这个本地保存COOKIE。
结论:如果一个页面依赖于某个cookie,而cookie的值或者文件被泄露后,即使没有登录,也可能利用该cookie来访问该页面,这就是cookie在客户端不安全引发的后果。
根据2010年OWASP(开放Web软件安全项目—Open Web Application Security Project)发布的Web应用十大安全威胁排名,排在前十位的安全风险依次为:注入、跨站脚本、遭破坏的身份认证和会话管理、不安全的直接对象引用、伪造跨站请求、安全配置错误、不安全的加密存储、没有限制的URL访问、传输层保护不足和未验证的重定向和转发。
“遭破坏的认证和会话管理”是指攻击者窃听了用户访问HTTP时的用户名和密码,或者是用户的会话,从而得到sessionID或用户身份信息,进而冒充用户进行HTTP访问的过程。
由于HTTP本身是无状态的,HTTP的每次访问请求都要带有个人凭证,SessionID是用户访问请求的凭证。sessionID本身很容易在网络上被嗅探到,所以攻击者往往通过监听sessionID来实现进一步的攻击,这就是这种安全风险居高不下的重要原因,但这种形式的攻击主要针对身份认证和会话。
密码(口令)是最常见的一种认证手段,持有正确密码的人被认为是可信的。使用密码进行认证的优点是成本低,认证过程实现简单。缺点是密码认证是一种比较弱的安全手段,因而存在被猜解的可能。
目前黑客们常用的破解密码手段,不是暴力破解,而是使用一些弱口令去尝试进行字典攻击破解,比如123456,admin等,同时猜解用户名,直到发现使用这些弱口令的账户为止。由于用户名往往是公开的信息,攻击者可以收集一份用户名的字典,这种攻击成本很低,然而效果却很好。密码的保存也有一些需要注意的地方,例如,密码必须使用不可逆的加密算法或者是单向散列函数算法进行加密后存储到数据库中。这可以最大程度地保证密码的私密性。
在用户登录时,在用户输入用户名和密码后一般通过POST的方法进行传输,认证信息可通过不安全的HTTP传递,也可通过加密的HTTPS传递。有些网站在登录页面显示的是HTTPS,而事实上却是用HTTP。
检测是否使用HTTPS的最简单方法就是使用网络嗅探工具,如通过SnifferPro或Ethereal嗅探数据包来判断是否加密。
SessionID一旦在生命周期内被窃取,就等于账户失窃。由于SessionID是用户登录持有的认证凭证,因此黑客不需要再想办法通过用户名和密码进行登录,而是直接使用窃取的SessionID与服务器进行交互。
会话劫持就是一种窃取用户SessionID后,使用该SessionID登录进入目标账户的攻击方法,此时攻击者实际上是利用了目标账户的有效Session。如果SessionID是被保存在Cookie中,则这种攻击被称为Cookie劫持。
Session是有生命周期的,当用户长时间未活动后,或者用户点击退出后,服务器将销毁Session。如果攻击者窃取了用户的Session,并一直保持一个有效的Session(比如间隔性地刷新页面,以使服务器认为这个用户仍然在活动),而服务器对于活动的Session也一直不销毁,攻击者就能通过此有效Session一直使用用户的账户,即成为一个永久的“后门”,这就是会话保持攻击。
下面一段代码可以保持session长期有效
<script>
var url=”http://bbs.example.com/index.php?sid=1”;
Window.setInterval(“keepsid()”,6000);//按照指定的周期(以毫秒计)来调用函数或计算表达式
Fuction keepsid()
{
Document.getElementById(“a1”).src=url+”&time=”+Math.random();
}
</script>
<iframe id=”a1” src=””></iframe>
IFrame内联框架被用来在当前 HTML 文档中嵌入另一个文档。其原理就是不停地刷新页面,以保持Session不过期。
不安全的直接对象引用在OWASP TOP 10排名中居于第四位,它可以被归于访问控制一类威胁。
直接对象引用:是指WEB应用程序的开发人员将一些不应公开的对象引用直接暴露给用户,使得用户可以通过更改URL等操作直接引用对象。
不安全的直接对象引用:是指一个用户通过更改URL等操作可以成功访问到未被授权的内容。比如一个网站上的用户通过更改URL可以访问到其他用户的私密信息和数据等。
String query=”SELECT * FROM accts WHERE account=?”;
PreparedStatement pstmt=connection.prepareStatement(query, ...);
pstmt.setString(1,request.getParameter(“acct”));
ResultSet results=pstmt.executeQuery();
代码中通过一个未被验证的用户账号来获取相关数据,在这样的情况下,攻击者可以通过在浏览器中简单修改“acct”参数的值发送到不同的用户账号来获取信息。
举例:未能及时对软件进行更新,默认的用户名密码没有及时修改等等。
所谓不安全的加密存储指的是Web应用系统没有对敏感性资料进行加密,或者采用的加密算法复杂度不高可以被轻易破解,或者加密所使用的密钥非常容易检测出来。
举例:CSDN网站泄密、Facebook用户信息泄密等
当传输层没有进行安全保护时,会遇到下面的安全威胁:
HTTP是无状态协议,客户端和服务端并没有建立长连接。服务器为了识别用户连接,服务器会发送给客户端SessionID。如果传输层保护不足,攻击就可以通过嗅探的方法获取传输内容,提取SessionID,冒充受害者发送请求。
中间人攻击(Man-in-the-middle attack),即MITM。HTTP连接的目标是Web服务器,如果传输层保护不足,攻击者可以担任中间人的角色,在用户和Web服务器之间截获数据并在两者之间进行转发,使用户和服务器之间的整个通信过程暴露在攻击者面前。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。