warning: Creating default object from empty value in /var/www/drupal-5.23/modules/taxonomy/taxonomy.module on line 1418.

Perl で、BASIC 認証(基本認証)付きのサイトにアクセスするには?

LWP::UserAgent を使うのだが、以下のコードで太字の行がポイント。 使用するモジュール use LWP::UserAgent; コード
#!/usr/bin/perl

use LWP::UserAgent;

our $HOME_URL = 'ユーザー名とパスワード付きの URL';
our $USERNAME = '上記 URL にアクセスするためのユーザー名';
our $PASSWORD = '上記 URL にアクセスするためのパスワード';

$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => $HOME_URL);
<strong>$req->authorization_basic($USERNAME, $PASSWORD);</strong>

print $ua->request($req)->as_string;

1;
LWP::UserAgent を使うのだが、以下のコードで太字の行がポイント。 使用するモジュール use LWP::UserAgent; コード
#!/usr/bin/perl

use LWP::UserAgent;

our $HOME_URL = 'ユーザー名とパスワード付きの URL';
our $USERNAME = '上記 URL にアクセスするためのユーザー名';
our $PASSWORD = '上記 URL にアクセスするためのパスワード';

$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => $HOME_URL);
<strong>$req->authorization_basic($USERNAME, $PASSWORD);</strong>

print $ua->request($req)->as_string;

1;

ウェブサイト構築時のセキュリティのポイント

IPA(独立行政法人情報処理推進機構)の「安全なウェブサイトの作り方」というドキュメントは、なかなかまとまっていて、良い。すべてのウェブアプリ開発者は目を通しておくべきだ。ここではこのドキュメントから注意点をピックアップしてまとめてみた。
  1. SQL インジェクション
  2. OS コマンド・インジェクション
  3. パス名パラメータの未チェック/ディレクトリ・トラバーサル
  4. セッション・ハイジャック
  5. クロスサイト・スクリプティング
  6. クロスサイト・リクエスト・フォージェリ (CSRF)
  7. HTTP ヘッダ・インジェクション
  8. メールの第三者中継
IPA(独立行政法人情報処理推進機構)の「安全なウェブサイトの作り方」というドキュメントは、なかなかまとまっていて、良い。すべてのウェブアプリ開発者は目を通しておくべきだ。ここではこのドキュメントから注意点をピックアップしてまとめてみた。
  1. SQL インジェクション
  2. OS コマンド・インジェクション
  3. パス名パラメータの未チェック/ディレクトリ・トラバーサル
  4. セッション・ハイジャック
  5. クロスサイト・スクリプティング
  6. クロスサイト・リクエスト・フォージェリ (CSRF)
  7. HTTP ヘッダ・インジェクション
  8. メールの第三者中継

Perl で、JavaScript と連動してサーバにアクセスログを残す方法

ウェブページへのアクセスログを記録する方法は、いろいろな方法があると思う。もっとも簡単なのは Apache などのウェブサーバが自動的に記録するログをチェックすることで、これには何の手間もいらない。しかし、レンタルサーバなどでログが自由に扱えない場合はどうしたらいいのだろう? そのひとつが、画像としてリンクされている Perl などの CGI を呼び出す方法だ。利用者に知られずこっそりとアクセスログを取るには 1x1 ピクセルの画像をそのウェブページの背景と共に表示してしまえば、そのウェブページのソースをチェックされない限り、ほとんどの場合は気づかれずにすむだろう。 そんなわけで、以下のように JavaScript と対応する Perl スクリプトで、アクセスログを記録する仕組みを作ってみた。ログの形式は Apache に準拠する(たぶん)。
ウェブページへのアクセスログを記録する方法は、いろいろな方法があると思う。もっとも簡単なのは Apache などのウェブサーバが自動的に記録するログをチェックすることで、これには何の手間もいらない。しかし、レンタルサーバなどでログが自由に扱えない場合はどうしたらいいのだろう? そのひとつが、画像としてリンクされている Perl などの CGI を呼び出す方法だ。利用者に知られずこっそりとアクセスログを取るには 1x1 ピクセルの画像をそのウェブページの背景と共に表示してしまえば、そのウェブページのソースをチェックされない限り、ほとんどの場合は気づかれずにすむだろう。 そんなわけで、以下のように JavaScript と対応する Perl スクリプトで、アクセスログを記録する仕組みを作ってみた。ログの形式は Apache に準拠する(たぶん)。

Perl で、RADIUS クライアントを作る。

Radius サーバに接続するためには、そのホスト名とシークレットが必要である。シークレットは Radius サーバへのパスワードみたいなもの。以下のコードでは $r に Radius クライアントのオブジェクトが入り、その後で $USENAME と $PASSWORD を使って $HOST にアクセスしている。 使用するモジュール use Authen::Radius;
#!/usr/bin/perl

use Authen::Radius;

our $HOST     = '1.1.1.1';
our $USERNAME = 'perltips';
our $PASSWORD = 'password';
our $SECRET   = 'testing123';

# First Trial
$r = new Authen::Radius(Host   => $HOST,
                        Secret => $SECRET,
                        Debug  => 1,
                        TimeOut=> 10);

# 前座。ユーザー名とパスワードのチェックをしてみる。
print "auth result=", $r->check_pwd($USERNAME,
                                    $PASSWORD,
                                    $HOST), "\n";
# Authen::Radius->load_dictionary();

# 本番。ユーザー名とパスワードのチェックを設定する。
$r->add_attributes (
                { Name => 'UserName',       Value => $USERNAME },
                { Name => 'Password',       Value => $PASSWORD },
#               { Name => 'NAS-IP-Address', Value => '1.1.1.2' }
#
# RFC 2865 https://www.ietf.org/rfc/rfc2865.txt calls this attribute
# User-Password. Check your local RADIUS dictionary to find
);

# ユーザー名とパスワードの組み合わせ (アトリビュート:属性) を、ACCESS_REQUEST で送る。
# そうすると返事が返って来るので recv_packet で受け取る。
$r->send_packet(ACCESS_REQUEST) and $type = $r->recv_packet();
print "server response type = $type\n";

# サーバから送られてきたアトリビュートを表示してみる。
for $a ($r->get_attributes()) {
        print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
}
Radius サーバに接続するためには、そのホスト名とシークレットが必要である。シークレットは Radius サーバへのパスワードみたいなもの。以下のコードでは $r に Radius クライアントのオブジェクトが入り、その後で $USENAME と $PASSWORD を使って $HOST にアクセスしている。 使用するモジュール use Authen::Radius;
#!/usr/bin/perl

use Authen::Radius;

our $HOST     = '1.1.1.1';
our $USERNAME = 'perltips';
our $PASSWORD = 'password';
our $SECRET   = 'testing123';

# First Trial
$r = new Authen::Radius(Host   => $HOST,
                        Secret => $SECRET,
                        Debug  => 1,
                        TimeOut=> 10);

# 前座。ユーザー名とパスワードのチェックをしてみる。
print "auth result=", $r->check_pwd($USERNAME,
                                    $PASSWORD,
                                    $HOST), "\n";
# Authen::Radius->load_dictionary();

# 本番。ユーザー名とパスワードのチェックを設定する。
$r->add_attributes (
                { Name => 'UserName',       Value => $USERNAME },
                { Name => 'Password',       Value => $PASSWORD },
#               { Name => 'NAS-IP-Address', Value => '1.1.1.2' }
#
# RFC 2865 https://www.ietf.org/rfc/rfc2865.txt calls this attribute
# User-Password. Check your local RADIUS dictionary to find
);

# ユーザー名とパスワードの組み合わせ (アトリビュート:属性) を、ACCESS_REQUEST で送る。
# そうすると返事が返って来るので recv_packet で受け取る。
$r->send_packet(ACCESS_REQUEST) and $type = $r->recv_packet();
print "server response type = $type\n";

# サーバから送られてきたアトリビュートを表示してみる。
for $a ($r->get_attributes()) {
        print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
}