php

[PHP] input所有過濾與攻擊

SQL注入攻擊(SQL injection attack)

在password部分輸入’ or ‘1’=’1,這將會造成整個SQL query 呈現以下的形式,使得
WHERE中整個判斷式為真,所以此使用者即便沒有帳號密碼也順利登入系統。

$sql = "select count(*) as ctr from users where
username='foo' and password='' or '1'='1' limit 1";

可以簡單地用PHP內建的函式mysql_real_escape_string()來解決
,mysql_real_escape_string()是用來脫逸資料庫語法中的特殊字元,像是 ,’,」。

$sql = "select count(*) as ctr from users where
username='".mysql_real_escape_string($username)."'
and password='". mysql_real_escape_string($pw)."' limit 1";

緩衝器溢位攻擊(buffer overflow attack)

主要是藉由 overflow the memory allocation buffer,造成網頁應用程式 denial of
service、資料損毀或藉機對主機執行惡意的程式。要防止 buffer overflow attack 最大
的重點就是檢查使用者輸入資料的長度。


<input id="name" type="text" maxlength="40" name="name" size="20" />

除此之外

$name = substr($_POST['name'],0,20);

這可以擷取從0到第20個字元的字 後面太長的就不要了 避免塞進去sql會有問題
跨站腳本攻擊(cross-site scripting)

可利用 PHP 內建的函式 strip_tags() 去除字串中的 HTML 和 PHP 標籤,同時這函式也
可以自己設定可接受的 tags(例如:<b>、<i>)。

如果你開放使用者使用 HTML 標籤來發表內容的話,就必須使用 htmlspecialchars() 讓
使用者輸入的 HTML 標籤保留它的意義,例如此函式會將 ampersand (&) 轉化成 &amp ;
將 < 和 > 視為 HTML entities。


$name = strip_tags($_POST['name']);
$name = substr($name,0,40);

操縱瀏覽器內的資料(manipulating data inside the browser)

就是利用一些工具來修改form的資料,這我常幹所以就不用多說了,不過話說回來
這就表示 儘量不要使用 hidden 的方式傳送變數,避免透露過多和系統操作相關的訊息

沒其他解 就這樣

遠程表格遞交(remote form posting)

使用者瀏覽網頁時,任何人都可以用「另存新檔」的方式複製一份網頁檔案到自己電腦中
這時對方的 server 會把它視為合法的資料,但這個 request並非由本身 server 所發出。
這個我也很常玩學校 portal我就玩過了

要防制 remote form posting 的攻擊可產生一個 token,為一個獨特的字串或者是一個
timestamp,再將這個 token 存進 session 以及放入表單中,藉由檢查這兩個 tokens 是
否相同,來判定是否是 remote的表單發出的request。

<!--?php <br ?-->session_start();
if ($_POST['submit'] == "go"){
//check token
if ($_POST['token'] == $_SESSION['token']){正確}else{錯誤}
$token = md5(uniqid(rand(), true));
$_SESSION['token']= $token;

<input type="hidden" name="token" value=""<?php" />"/>

——————————————————————

nl2br函數的功能在於把字串裡的換行n換成<br>

//去掉開始和結束的空白
$str = trim($str);
//去掉跟隨別的擠在一塊的空白
$str = preg_replace(‘/s(?=s)/’, ”, $str);
//最後,去掉非space 的空白,用一個空格代替
$str = preg_replace(‘/[nrt]/’, ‘ ‘, $str);

———————————————————————–

我知道平常一定懶得看 所以來個總結

$name =substr( strip_tags(addslashes(trim($_POST['name']))),0,40);

預防過長字串(除HTML PHP標籤(引號前加上跳脫(除去前後空白)))

一般input收到的資料 直接套用上面這些就好 如果還有想到其他的在用吧
或是更簡單一點 把她寫成一個function 會比較乾淨
→ davidou:不過SQL injection 那個我記得測試過apache會直接檔掉了 09/21

One comment

發佈回覆給「NC」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)