使用者工具

網站工具


webdesign:head_rush_ajax_5

Head Rush Ajax 讀書筆記

Chapter Five

HTML

不再使用提交表單的方式

......
<form id="order-form">
......
<input type="button" value="Order Pizza" onClick="submitOrder();" />
......

PHP

使用 header() 增加回應標頭

if (strlen($order)<=0) {
  header("Status: No order was received.", true, 400);
  echo "";
  exit;
}

使 HTTP 回應變成

HTTP/1.1 400 Bad Request
  Request Version: HTTP/1.1
  Request Code: 400
Date: Tue, 06, Mar 2007 09:00:00 GMT
Server: Apache
X-Powered-By: PHP/4.3.11
Status: No order was received.    // 增加這行
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

JavaScript 使用 getResponseHeader 取出資訊

request.getResponseHeader("Status")

JavaScript

把整個 form 替換成結果輸出

   function showConfirmation() {
     if (request.readyState == 4) {
       if (request.status == 200) {
         var response = request.responseText;

         var mainDiv = document.getElementById("main-page");    // 主要的外層 DIV
         var orderForm = document.getElementById("order-form");    // 將被替換的 FORM

// 建立新的元素
         pElement = document.createElement("p");
         textNode = document.createTextNode("Your order should arrive within " + response + " minutes. Enjoy your pizza!");
         pElement.appendChild(textNode);

         mainDiv.replaceChild(pElement, orderForm);    // 替換
       } else {
         var message = request.getResponseHeader("Status");    // 取出錯誤資訊的 header
         if ((message.length == null) || (message.length <= 0))
           alert ("Error! Request status is " + request.status);
         else
           alert (message);
       }
     }
   }

使用 POST 送出資料

  • POST 無瀏覽器快取問題
  • URL 有長度限制(IE 約 2000 個字元),使 GET 無法放太多資料在 URL 中,而 POST 沒資料長度限制
  • POST 傳送時有編碼,但解碼相當簡單
  • 可用來傳送 XML 資料
   function submitOrder() {
     var phone = document.getElementById("phone").value;
     var address = document.getElementById("address").value;
     var order = document.getElementById("order").value;

     var url = "placeOrder.php";
     request.open("POST", url, true);
     request.onreadystatechange = showConfirmation;

// 需要設定 POST 的內容型別,因為 GET 必為純文字,但 POST 可以送出影像、 XML 或純文字等等任何型別
     request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

// 使用數對「名稱/值」,和 GET 相同
     request.send("phone=" + escape(phone) +
                  "&address=" + escape(address) +
                  "&order=" + escape(order));
   }

送到伺服器的 POST 請求

Hypertext Transfer Protocol
  POST /placeOrder.php HTTP/1.1
    Request Method: POST
    Request URI: /placeOrder.php
    Request Version: HTTP/1.1
  Host: sars.tw
  Keep-Alive: 300
  Connection: Keep-alive
  Content-Type: application/x-www-form-urlencoded    // 增加此行
  Content-Length: 121

SQL injection

在表單中輸入

' || 'a'='a'

造成

SELECT * FROM hraj_breakneck WHERE phone=' 「' || 'a'='a」 '
SELECT * FROM hraj_breakneck WHERE phone='' || 'a'='a'
SELECT * FROM hraj_breakneck WHERE phone='' OR 'a'='a'

其中「phone=''」永遠為 false,但「'a'='a'」永遠為 true

使用 JavaScript 檢查

檢查是否有不應該出現的字元經過表單進入 SQL 查詢式中。

但惡意使用者可以透過自行建立的網頁傳送 POST 進 PHP,完全不會經過 JavaScript 檢查。

強化 PHP

http://tw.php.net/manual/tw/function.mysql-real-escape-string.php

mysql_real_escape_string – Escapes special characters in a string for use in a SQL statement

$phone = mysql_real_escape_string($phone);

若確定查詢的資料永遠只需要輸出一筆,則使用

$row = mysql_fetch_array($queryResult);

取代

while ($row = mysql_fetch_array($queryResult)) { ... }
webdesign/head_rush_ajax_5.txt · 上一次變更: 2007/03/04 14:04 由 wenpei