跳到主要內容

Apache Http Header

安裝了Apache後,總是要注意安全設定,而每次重灌後,總是容易忘東忘西...,所以就把一些基礎的筆記紀錄一下。

這次要設定的是標頭(Header)資訊,為了不讓別人知道自己伺服器資訊,至少要把Header中與伺服器相關的資訊關閉或是不顯示詳細資訊。

要如何知道自己傳送出去的Header呢?
以下用php簡單寫了一個範例程式
<?php
//要測試的網址
$url = 'www.google.com';
$timeout = 5;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

$header = curl_exec($ch);
curl_close($ch);

echo $header;
?>

這樣就可以取得header資訊 :P。(curl_setopt詳細內容
如果不想寫程式,當然有現成的工具可測試。
http://www.webconfs.com/http-header-check.php

一般預設的顯示資料如下(以目前使用的伺服器為範例)
Date: Fri, 22 Feb 2013 12:15:03 GMT
Server: Apache/2.2.15 (CentOS)
Location: index.v
Content-Length: 0
Content-Type: text/html; charset=UTF-8

設定完Apache設定檔後顯示的資料如下。
Date: Fri, 22 Feb 2013 12:17:29 GMT
Server: Apache
Location: index.v
Content-Length: 0
Content-Type: text/html; charset=UTF-8

很明顯的在Server這裡Apache少了詳細資訊,只保留Apache。
要怎樣才能做到呢?

請在Apache設定檔加入以下幾個資訊,或是修改值。
ServerTokens Prod
ServerSignature Off
TraceEnable Off


ServerTokens - 回傳標頭資訊時,Apache顯示方式,根據官方範例(上面是設定,下面是顯示結果)
ServerTokens Prod[uctOnly]
    Server sends (e.g.): Server: Apache

ServerTokens Major
    Server sends (e.g.): Server: Apache/2

ServerTokens Minor
    Server sends (e.g.): Server: Apache/2.0

ServerTokens Min[imal]
    Server sends (e.g.): Server: Apache/2.0.41

ServerTokens OS
    Server sends (e.g.): Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified)
    Server sends (e.g.): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

ServerSignature - 是否在產生錯誤頁面或其他資訊時,顯示Apache版本。(不過在Apache 2.0.44版本後,都是由ServerTokens控制。)

TraceEnable - 預設是開啟,允許 Trace request (RFC 2616)。關閉後只會造成405 error(找不到內容)

如果還想要進一步去設定Header資訊,可以參考mod_headers

附註:如果有顯示PHP的資訊,可以在PHP的設定檔加入expose_php = Off,就不會顯示PHP的資訊囉!

留言

這個網誌中的熱門文章

判斷是不是json格式 - PHP

<?php /** * Check the string is json * * @param string $str * @return bool * @throws Exception if the string is not json */ function isJson ( $str ) { json_decode ( $str ); $code = json_last_error (); switch ( $code ) { case JSON_ERROR_NONE: return true ; case JSON_ERROR_DEPTH: throw new Exception( "Maximum stack depth exceeded" ); case JSON_ERROR_STATE_MISMATCH: throw new Exception( "Underflow or the modes mismatch" ); case JSON_ERROR_CTRL_CHAR: throw new Exception( "Unexpected control character found" ); case JSON_ERROR_SYNTAX: throw new Exception( "Syntax error, malformed JSON" ); case JSON_ERROR_UTF8: throw new Exception( "Malformed UTF-8 characters, possibly incorrectly encoded" ); default : throw new Exception( "U...

Android startActivity跟startActivityForResult

當想要切換Activity時,可以用兩個方式,startActivity與startActivityForResult 而這兩個又有什麼分別呢? 假設目前執行是A activity,startActivity就是單純傳資料給B activity並啟動,而startActivityForResult則是多了一件事情,就是當B activity結束時,可以回傳狀態給A activity。 簡單的範例startActivity:AActivity ... String test = "TEST" ; Intent intent = new Intent(context, BActivity. class ); intent. putExtra (BActivity. TEST_PARAM , test); startActivity(intent); ... 簡單的範例startActivityForResult:AActivity public static final int REQUEST_CODE = 0 ; ... String test = "TEST" ; Intent intent = new Intent(context, BActivity. class ); intent. putExtra (BActivity. TEST_PARAM , test); startActivityForResult(intent, REQUEST_CODE); ... 我們現在完成了開啟與傳資料的動作,當我們使用startActivityForResult,我們必須在BActivity增加setResult且AActivity增加onActivityResult功能才行。 class BActivity ... ... // 沒有回傳資料的方式 setResult(RESULT_OK) // 回傳資料的方式 String back = "Back Test" ; Intent intent = new Intent(); intent. putExtra (BA...

Android開啟Facebook App

如果手機裡已經安裝了Facebook,為什麼還要開啟瀏覽器重新輸入帳密呢? 直接用Facebook操作不是比較方便呢? --以上是前言--XD 所以為了方便已經安裝Facebook使用者,所以App裡開啟粉絲專頁時,應該會有兩種方式 範例如下: ... public static void openFacebookPage (Context context, String id) { Intent intent = null ; try { context. getPackageManager (). getPackageInfo ( "com.facebook.katana" , 0 ); String uri = "fb://page/" + id; intent = new Intent(Intent. ACTION_VIEW , Uri. parse (uri)); } catch (Exception e) { String uri = "https://www.facebook.com/pages/1/" + id; intent = new Intent(Intent. ACTION_VIEW , Uri. parse (uri)); } context. startActivity (intent); } ... 參考資料: android - launch facebook app from other app - Stack Overflow php - Facebook API - How do I get a Facebook user's profile image through the Facebook API (without requiring the user to "Allow" the applicati...