Web信息安全实践_4.3 Ajax

Ajax的特性:

  • 局部更新。仅仅更新数据。
    • 不会页面跳转
    • 不需要iframe
  • 异步更新,在请求受阻,其他部分的代码可以继续执行。
  • 接收回复并处理。

Ajax的使用特点:

第一,生成XMLHTTPRequest对象;

第二,发出请求;

第三,处理请求返回的结果


<html>
<head>
<script type="text/javascript">
function loadXMLDoc(URL) { // 使用Ajax获取内容之后,在原始页面进行更新
    if (window.XMLHttpRequest) { /* code for IE7+, Firefox, Chrome, Opera, Safari */
      xmlhttp=new XMLHttpRequest(); // 1.生成XMLHttpRequest对象
    }
    else { // code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }    

    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText; /* responseText属性返回字符串形式的响应*/
      }
    }

    /* 2.将请求发送到服务器。使用 XMLHttpRequest 对象的 open() 和 send() 方法。 */
    xmlhttp.open("GET",URL,true); /* open(method,url,async) */
    xmlhttp.send();
}

function loadXML(URL) { // 使用原生的JS来获一个文件内容
    document.location = URL;
}
</script>
</head>

<body>
    <div id="myDiv"><h3>Let AJAX change this text</h3></div>
    <button type="button" onclick="loadXML(‘test.txt‘)">Change Content with raw JS</button> <!--使用原生的JS来获一个文件内容-->
    <br>
    <button type="button" onclick="loadXMLDoc(‘test.txt‘)">Change Content with Ajax</button> <!--使用Ajax获取内容之后,在原始页面进行更新-->
</body>

XHR 对象

  • XMLHttpRequest是AJAX 的基础
  • 所有现代浏览器均支持XMLHttpRequest对象
    • IE5和IE6使用ActiveXObject
  • XMLHttpRequest用于在后台与服务器交换数据:这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

(1)浏览器中的对象构造函数

req = new XMLHttpRequest();

(2)在 IE5 和 IE6

req = new ActiveXObject("Microsoft.XMLHTTP");
req = new ActiveXObject("Msxml2.XMLHTTP");

XHR 对象方法

方法  描述
open("method", "URL"[, asyncFlag[, "userName"[, "password"]]]) 设置目的 URL 、方法、同 / 异步以及其他可选参数
getAllResponseHeaders()  获得返回头部中的所有信息
getResponseHeader("headerLabel")  获得返回头部信息中的特定内容
send(content)  发送该请求(携带参数)
setRequestHeader("label", "value")  设置请求头部中的值

XHR 的 open() 函数

open("method", "URL", asyncFlag); 
  • method:请求的类型; GET 或 POST
  • url:文件在服务器上的位置
  • async: true (异步)或 false (同步)

GET 方法和 POST 方法

  • GET 使用缓存; POST 不使用
  • 向服务器发送大量数据( POST 没有大小限制;GET放在URL中,有大小限制)
  • GET 通过 URL 发送用户输入; POST中将参数存放于数据报文中
<html>
<head>
<script type="text/javascript">
function loadXMLDoc() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    }
    else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","1.txt",true); // xmlhttp.open(“POST","1.txt",true);
    xmlhttp.send();
}
</script>
</head>

<body>
<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="loadXMLDoc()">Change Content with Ajax</button>
</body>

<html>
xmlhttp.open("GET","1.txt",true);
  • 如果希望传递参数。那么,使用GET方式,直接在URL中把参数的值加上就行了;
  • 如果使用POST方式,相当于是使用表单传递数据,需要额外地设置HTTP头。然后把参数通过send方法传递出去。
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");

send(content)

  • send 类似于点击表单上的提交按钮
  • 参数发送
    • 如果正在使用 GET ,值附加到 open 方法中的 URL
    • POST 发送需要填写以 & 间隔的键值对
  • 发送参数必须手动添加头部
setRequestHeader("Content-type","application/x-www-form-urlencoded");

XHR 对象属性

属性 描述
onreadystatechange  连接会话的每次状态变化都会触发该属性
状态:打开请求、准备发送、发送成功、返回
readyState 连接的状态( 0~4 )
状态4:收到回复
responseText 服务器返回的应答内容
status 服务器返回的页面状态,如 404 “Not Found” 或者是 200 "OK"
statusText 描述状态的文字

onreadystatechange

  • 当请求被发送到服务器时,我们需要执行一些基于响应的任务。
  • 每当 readyState 改变时,就会触发 onreadystatechange 事件。

readyState:连接的状态( 0~4 )

存有XMLHTTPRequest的状态,从0到4发生变化

?0 - 请求未初始化

    • 创建对 Object 的新引用时的初始值

?1 - 服务器连接已建立

    • 已成功调用 open()方法

?2 - 请求已发送

    • 请求发出,但尚未收到任何数据

?3- 请求处理中

    • 已收到所有 HTTP 标头
    • 在接收邮件正文之前设置的值

?4- 请求已完成,且响应已就绪

    • 数据传输已完成
    • 我们现在可以使用数据了!
if (xhr.readyState == 4) {
    alert(xhr.readyState+"\n Loaded, Ready to
    display!");
    if(xhr.status==200) {
        alert("really ready!");
        document.getElementById("symbol").innerHTML = xhr.responseText;
    }
}

else if (xhr.readyState == 3)
    alert(xhr.readyState+"\n receiving...");

else if (xhr.readyState == 2)
    alert(xhr.readyState+"\n sent request!");

else if (xhr.readyState == 1)
    alert(xhr.readyState+"\n open() opened!");

else if (xhr.readyState == 0)
    alert(xhr.readyState+"\n Uninitialized!");

state

在接收到返回结果,也即readyState为4的情况下,state的情况:

function handler() {
 // only handle loaded requests
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
        alert(xhr.status + "\nPage Ready!");
        document.getElementById(‘symbol‘).innerHTML = xhr.responseText;
           }
    else if (xhr.status == 404)
        alert(xhr.status+"\nPage not found!");
    else if (xhr.status == 403)
        alert(xhr.status+"\nAccess Denied!");
    }
}

responseText 服务器返回的应答内容

  • 如果来自服务器的响应并非XML,请使用responseText属性
  • 如果来自服务器的响应是XML,而且需要作为XML对象进行解析,请使用responseXML属性

Status 服务器返回的页面状态

  • 200 OK
  • 403 Forbidden
  • 404 Not Found
if (xhr.status == 200)
{
    alert(xhr.status + "\nPage Ready!");
    document.getElementById(‘symbol‘).innerHTML = xhr.resp onseText;
}

else if (xhr.status == 404)
    alert(xhr.status+"\nPage not found!");

else if (xhr.status == 403)
    alert(xhr.status+"\nAccess Denied!");

同步与异步 async

  • 同步需要等待请求返回
  • 异步无需等待返回
<img src="w3.gif" onload="loadXMLDoc();alert(1);" />
<img src="w3.gif" />
xmlhttp.open("POST","1.php",false); //loadXMLDoc()加载的文件
Sleep(10); //返回文件之前等待10s
<!-- A basic example to demonstrate asynchronous. -->
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    }
    else {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    }
    // xmlhttp.open("GET","1.php",true);
    // xmlhttp.open("GET","1.php",false);
    // xmlhttp.open("POST","1.php",false);
    xmlhttp.open("POST","1.php",true);
    xmlhttp.send();
}
</script>
</head>

<body >
    <div id="myDiv"><h2>Let AJAX change this text</h2></div>
    <img src="w3.gif" onload="loadXMLDoc();alert(1);" />
</body>
</html>
<!--1.php-->
<?php
sleep(10);
?>

<html>
  <head>
    <title></title>
  </head>
  <body>
    <form action="" method="get" >
      Symbol: <textarea id="symbol" name="symbol" type="text"> </textarea>
      <br><br>
      <input type="submit" value="Get Quote">
    </form>

    <script>
        document.getElementById(‘symbol‘).innerHTML="<?php print("hello");?>";
        </script>
  </body>
</html>
  • 当使用 async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:
xmlhttp.onreadystatechange=function()
{
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
  • 使用 async=false 时,请不要编写 onreadystatechange 函数 , 把代码放到 send() 语句后面即可:
xmlhttp.open("GET","test1.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

原文地址:https://www.cnblogs.com/tianjiazhen/p/12235894.html

时间: 2024-08-30 16:56:32

Web信息安全实践_4.3 Ajax的相关文章

Web信息安全实践_4.1 XSS防御

XSS 存在的三个条件 网站应用程序必须接受用户的输入信息 用户的输入会被网站用来创建动态内容 用户的输入验证不充分 输入过滤,输出转义:检查用户输入含有攻击信息,尽可能过滤攻击信息:如果不能判断哪些是攻击信息,那么要使得显示的时候不能发送攻击 输入过滤 使用黑名单,从用户的输入中删除 <script> 缺点:很难保证完全:限制了用户展示代码 <scr<script>ipt> //若仅过滤一个script,其他不检查 some<<b>script>

Web信息安全实践_4.0 XSS_知乎1

XSS攻击即为(Cross Site Scripting), 中文为跨站脚本. 之所以它的名字不是CSS而是XSS,是为了区分CSS. XSS攻击是发生在目标用户的浏览器上的,当渲染DOM树的过程中执行了不该执行的JS代码时,就发生了XSS攻击.跨站脚本的重点不是“跨站”,而是“脚本” 页面执行不该执行的JS 我们首先来看一下,页面执行不该执行的JS是什么意思.譬如我们来看这个代码: // 假设有一个自动回答网站:在框内输入一个问题,这个问题是通过$_GET['q']获取的:网站后台接收用户输入

Web信息安全实践_3.4 CSRF防御

错误的CSRF防御方法 (1)只接受 POST 请求 攻击者不能基于链接简单地攻击( IMG ),但是可以使用脚本创建隐藏的 POST 请求 (2)转账需要多步 e.g. 第一个请求转多少个coin,第二个请求转给谁 CSRF 攻击可以按顺序执行每个步骤 (3)检查 Referer Referer Referer报文头是网页请求头的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理. 用户正常转账:请求从

Web信息安全实践_3.2 Cookie

HTTP 持久性 (1)HTTP 是一个无状态的协议:服务器不记录请求之间的关系 e.g. 购物,提交购物车.付钱两次请求之间,http协议不记录这两个请求之间的关系 (2HTTP 如何实现会话的持久性的呢? Cookie HTTP Cookie Cookie 的用途 (1)Cookie 用户浏览器访问网站时,在用户本地存储信息 服务器设置cookie的值,本地保存 (2)Authentication cookie 存储关于用户登录状况的信息 使用 Authentication Cookie 可

Web信息安全实践_6 SQL注入

www.myzoo.com 输入示例 Login a'# 用户a登录 a' or 1# a' or 1=1# a' and 1;# d' or 1# a' or '1  思考:为什么无密码可以登录?为什么最终登录的都是a? b' or 0;#  用户b登录 profile a', Coins=100 where Username='a' ;# User c' union select 1,1,1,1,1,1,if(substring(database(),1,1)=char(119),bench

Web信息安全实践_1.3 HTTP

HHTP HTTPs:HTTP/ssl,安全的http Apache:HTTP服务器 SSL:安全的套接进程,应用层和tcp层中间,提供数据加密.身份认证 OpenSSL 浏览器/服务器交互 URL+HTML+HTTP→www URL(Uniform Resource Location,全局资源定位符) ∈ URI(Uniform Resource Identifiers) URL URL可定位到物理位置一台主机上一份文件的具体位置. e.g. HTTP请求 HTTP请求 方法:Get.Post

Web信息安全实践_1.7 OpenSSL

OpenSSL 用于实现SSL协议,能实现证书生成.证书签名.密钥生成.加解密等各种操作 命令行举例 openssl version openssl prime echo "encode me" |openssl | enc -base64 /*对字符串encode me进行base64编码*/ echo "ZW5jb2RIIG1lCg==" | openssl enc -base64 -d /*对经过base64进行编码的字符串进行解码*/ 自建HTTPS(使用O

Web信息安全实践_1.6 RSA

非对称加密示例 (SSL.SSL工作过程.非对称加密) Alice和Bob进行加密传输 Bob公开自己的公钥91 Alice把三位数123乘以91,将乘积的末三位发给Bob 如123×91=11193:将193发送给Bob Bob将收到的数乘11,取后三位,得到原始信息 如:193×11=2123,:得到123,解密成功 原理:91×11=1001 RSA算法示例 挑选两个质数,如 p=61和 q=53(在实际应用中,RSA要求是大质数) 计算N = p×q = 3233 计算(p-1)× (q

Web信息安全实践_2.5 JS语法基础

JavaScript历史 HTML页面缺乏交互性 造成带宽.时间和服务器资源的浪费 前端加入基本的检查:登录名.密码是否为空,两次密码输入是否一致... JavaScript代码嵌入在HTML中 <script> ... </script> 浏览器加载页面时执行代码,代码的动态输出和HTML的静态内容进行集成 可以在用户输入提交给远程服务器之前进行验证 JavaScript语法 1.动态数据集成 document.write:向文档流写入HTML表达式或JavaScript代码 &