Hatena::ブログ(Diary)

GFSの興味ごととか このページをアンテナに追加 RSSフィード

February 11(Sat), 2012

[] Apacheでアクセス制限をする

Apacheでアクセス制限をしようと頑張った結果こうなりました.


1. やりたいこと


私がやりたかったのは以下のことです.

ここでのアクセス制限とは,192.168.0.0/24なら自由にアクセスできる,ただしそれ以外の場合はBASIC認証が必要というやつです.

また,/docroot/{foo,bar}は指定した拡張子(ここでは.htmlと.php)のみ外部から参照できます.


2. 勘違いしてたこと


アクセス制限がホスト制限と認証しかないということです.

<Directory>とか<Files>とかはただ単にその2種類の制限を操作するかどうかのif文でしかなかった,というのに気付くのにえらい時間がかかってしまいました.


3. アクセス制限書く

<Directory /docroot>
  Order Deny,Allow
  Deny from All
  Allow from 192.168.0.0/24

  AuthUserFile /path2pass
  AuthName "Nyan"
  AuthType Basic
  require valid-user

  Satisfy Any
</Directory>

4. 拡張子の制限を書く

<Directory /docroot/foo>
  <Files "*">
    Order Deny,Allow
    Deny from All
    Satisfy All
  </Files>
  <Files "">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </Files>
  <FilesMatch "\.(html|php)$">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </FilesMatch>
</Directory>

<Files>と<FilesMatch>は同時に適用&上書きされるらしいのでこう書きました.

ちなみに,""はttp://example.com/foo/の様にDirectoryIndexを省略した時用です.


5. モウヒトコエ

ただし上記のままではttp://example.com/fooの様に最後にバックスラッシュが付いていない場合にアクセスできません.

なぜなら<Files "*">にfooとしてマッチしてしまうからです.

そこで,<Files "*">を<Files "^(((([^f]*)*(f+[^o][^f]*)*)*)*(f+[^o][^f]*)*)*$">にしてもいいのですが,よくわからないのでfooを許可します.

  <Files "foo">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </Files>

6. 最後に

これだとttp://example.com/fooでアクセスできますが,ttp://example.com/foo/fooにもアクセスできてしまいます.

なので,次のやつを書きました.

<Location /foo/foo>
  Order Deny,Allow
  Deny from All
  Satisfy All
</Location>

<Location>は<Files>の後に評価されるので上書きされてアクセスが禁止されます.

これでだいたいうごくとおもいます.

ちゃんと動いていなかったり,もっと上手い方法がある,まちがってる,とか教えていただけるとうれしいです.

mod_rewriteとかでできそう?


あと,私が実際にやった環境ではVirtualHostがからんでたりするのでちょっと違うかもしれないです.


7. 関係ないこと

httpd.confを0から書くというのをやってみたらおもしろかったです.

Apache3.0になるとこの辺をもっときれいに書けるみたい?


参考書:Apache公式サイト

Apacheセキュリティ

Apacheクックブック

January 12(Thu), 2012

[] 1: Best Software Writing


読みました!


とても面白かったです.特にソーシャルソフトウェアについての内容はとても興味深いです.あとWIPOの話など読んでいて面白い(そして知るべきである)ストーリなどが多くありとても勉強になりました.

BEST SOFTWARE WRITING

BEST SOFTWARE WRITING

July 25(Mon), 2011

[][]Boost.PtrContainer


Boost.PtrContainerのptr_array<>というのを使ってみました.

中身をポインタとして保持して,アクセスする時はポインタの先の参照を返してくれる粋なやつです.


ptr_array<>はptr_vector<>とかに比べてちょっと特殊かも.

実体の供給方法とかnullの保持とか.


>>|cpp|

#include <cassert>

#include <iostream>

#include <iterator>

#include <boost/ptr_container/ptr_array.hpp>

#include <boost/range/algorithm/copy.hpp>

const unsigned size = 10;

int main(){

  boost::ptr_array<int, size> numbers;


  // 要素(実体)があるかどうかチェックできる.当然無い.

  assert(numbers.is_null(1) == true);


  // arrayの場合はpush_backとか当然できないので,

  // replaceという関数で置き換えてnewする.

  for(unsigned i=0; i<size; ++i)

    numbers.replace(i, new int(i));


  // 実体がある.

  assert(numbers.is_null(1) == false);


  // アクセスする時はポインタの指す先になる.

  const int n = numbers[1]; // n==1


  // (イテレータでも)アクセスする時は参照なので,中身がポインタとか関係ないでござる.

  boost::copy(numbers, std::ostream_iterator<int>(std::cout, ","));

  std::cout << std::endl; // 0,1,2,3,4,5,6,7,8,9,

}

||<

April 20(Wed), 2011

[][]PropertyTreeのptreeをiterationする


ちょっと調べたのでメモです.

以下の様なiniファイルのKeywordsを順番にiterationしていくのが目的です.

// trends.ini

[Keywords]

触手 = 秋猫

しまぱん = 桜花

縞ぱん = 桜花

縞パン = 桜花



#include <iostream>
#include <boost/property_tree/ini_parser.hpp>

namespace ptl = boost::property_tree;

int main(){

  ptl::ptree pt;
  read_ini("trends.ini", pt);

  const auto& keywords = pt.get_child("Keywords");
  auto it = keywords.begin();
  const auto end = keywords.end();

  for(; it!=end; ++it)
    std::cout << it->first << " : " << it->second.data() << std::endl;

// 触手 : 秋猫
// しまぱん : 桜花
// 縞ぱん : 桜花
// 縞パン : 桜花

}


・・・終わりです><.

April 08(Fri), 2011

[][]AnyPtrとxtal::undefinedの比較

バージョンはXtal Unofficial Wikiのr429です.


Xtalスクリプトで定義したbooleanの値を取得しようとした所,undefinedと==が成り立っちゃいました.


// .xtal

bool_true : true;
bool_false : false;

// .cpp

const xtal::CodePtr& code = load_and_call(the_file);

const auto& bool_true = code->member(Xid(bool_true));
const auto& bool_false = code->member(Xid(bool_false));

assert(bool_true != xtal::undefined); // こっちは期待通り
assert(bool_false == xtal::undefined); // あれ?

// 解決策?
assert(!xtal::is_undefined(bool_true));
assert(!xtal::is_undefined(bool_false)); // パーペキ


てっきりoperator==で良いのかと思ってましたが,ダメなんですね.

ソースコードを読んでたらxtal::is_undefined(...);というのを発見.

これを使ったら期待通り動いてくれました.