跳到主要內容

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的資訊囉!

留言

這個網誌中的熱門文章

What is phpize

What is phpize According to the PHP official document : The phpize command is used to prepare the build environment for a PHP extension. If you need to build such an extension that from github or another code repositories, you can use  build tools to perform the build manually. 

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...

AndroidManifest的小技巧

當在設定推播時,在  AndroidManifest.xml  上需要指定不同application id時該怎麼辦呢?(可能會有xxx.yyy.com.debug與xxx.yyy.com兩個版本) 有個簡單的小技巧可以實現這件事情。 <permission android:name= "${applicationId}.permission.C2D_MESSAGE" android:protectionLevel= "signature" /> <uses-permission android:name= "${applicationId}.permission.C2D_MESSAGE" /> 參考資料: Using build types in Gradle to run same app that uses ContentProvider on one device