せきゅりてぃ

ふとサーバーのログをチェックしてみた。
・・・
韓国、中国等より大量のアタックが!!
なんかいろんなユーザー名でアタックされまくってるし!!
test admin webmaster Administrator suzuki jenifer
いろんな奴が!?
サーバー稼動してからそんなにたってないのに、毎日複数の箇所から数時間にわたりアクセスされてるとは・・・

対策予定
現在公開しているのは、http ftp sshのみ。
アタックが確認されているのはftpとssh
http → 完全公開用なので対策できない
ssh → 秘密鍵がなければアクセスできないはず?一応、国内IPからのアクセスに制限する
ftp → SSLに対応させ、国内IPからのアクセスに制限する

ftpのSSL対応
パソコンおやじさんのサイトを参考に設定を変更(vsftpd)
以前mail.pemファイルを作成済みだったので、ロジカルリンク作成したら簡単に設定は終了しました。

IP制限
tcp-wrappersによるhosts.allow、hosts.denyで制限する事にした。
制限はsshとftpに対してローカルと.jpのみ許可する設定にした。
hosts.allow
vsftpd: 192.168.XXX.0/255.255.255.0 .jp
sshd: 192.168.XXX.0/255.255.255.0 .jp
hosts.deny
vsftpd: ALL
sshd: ALL
ローカルでは動いてるけど、外部からだと動くかなぁ?

画像のキャッシュについて

development環境にて気づかなかったのですが、test環境にて実行したら画像が更新されないという現象が出ました。どうも同じファイル名で別の画像を表示させようとしている為キャッシュされているものが表示しているみたいです。

対策
<img>じゃなくて、image_tagを使う。
image_tagを使うと自動的にこ
という感じで?以降がくっつき、こうした現象に対応できるみたいでした。
まぁ
とか適当に乱数をくっつけても動くと思いますがね。

ImageMagick&RMagickのインストール

自分がやったわけではないですが、ずいぶん動作させるのに苦戦したみたいです。(サーバー:OS Linuxにて。Windowsはけっこう楽ちんだった)
ImageMagickはyum、RMagickはgemにてそのもののインストールはすぐだったみたいだけど、動かしたらいろいろエラーが・・・
[適当履歴]
  • libMagick.so.6が無い → libMagick.so.10をlibMagick.so.6という名前でコピー
  • libdpstk.so.1が無い → libwmf-develをインストールしたり、ImageMagickを1.14.1に戻したり

で、動いたらしい。ちなみに1.14.1とはWindowsと同じバージョンらしい。

フォーム内Enterキー制御

ブックマーク編集のJavaScriptの修正をしました。なんかテキストボックス内にてキー入力が効かないとの問題が出ちゃったからです。
どうやら原因としては、キープレスイベントを捕まえて、Enterキー押下時にsubmitやらタイトル取得処理やら振り分けていた処理にて、Enterキー以外を行ったときの戻り値をfalseにしてたのが問題だった用です。
ということで修正した結果の抜粋です。

結果
bookmark.js
//—————————————————————————————
// Enterキー押下(入力フォーム)
//—————————————————————————————
function edit_enter(e, exe)
{
//———————————————————————————–
// Enterキーのみ以降の処理を実施
//———————————————————————————–
if(get_key(e) != 13){            // Enterキー以外?
return true;
}
// サブミットとかEnterキー押下時の処理をつらつらと
return false;
}
$(function()
{
$(“#edit_name”).keypress(function(e){return edit_enter(e)});
// Enterキー入力時にチェックするID&イベントとかを記述(上はid=edit_nameにおけるキー押下イベントでedit_enterを実行的な処理)
});

わかったこと
onclickとかonkeypress等のイベントにてScriptの戻り値がfalseだと処理が中断し、trueや戻り値無しは続行する場合がある。
(適当)

ブックマークのタイトル取得

指定されたURLのタイトルとコメントを取得する処理をつけています。
テスト環境にてとりあえずの動作はできているっぽいです。 


内容
テキストフィールド(id=edit_url)に記述されたURLのページを取得し、その情報からタイトル(id=edit_name)とコメント(id=edit_comment)のテキストフィールドの値を変更する。タイトルは<title>タグにて囲まれた文字を対象とし、コメントは<meta name=”description”>の属性contentとして指定された文字列とする。
ちなみにAjaxを使用するので、jquery.jsを使用しています。(prototype.jsではないです) 


処理の流れ
当初はJavaScript(Ajax)にてURLのhtmlを取得して、それを解析しようと思っていたのですが、セキュリティ上同じドメインからでないとJavaScriptではデータを取れないということが判明しました。なのでrailsにて他サーバーからのhtml取得とかを行う事にしました。
  1. JavaScriptにてURLをパラメータとしてrailsに送信
  2. railsにてパラメータのURLをhtmlで取得
  3. railsにて取得したhtmlを解析してタイトルとコメントを取得する
  4. railsにてタイトルを<title>タグで囲み、またコメントを<comment>タグで囲んで出力する
  5. JavaScriptにてrailsのレスポンスを解析し、タイトルとコメントのテキストフィールドにセットする
 


サンプル

参考にしたサンプルソースです。取得ボタンのonclickイベントにてtest()は実行するみたいです。
 


bookmark.js

function test(){
$.post(’edit/test’, {}, function(result){
alert(result);
});
 


edit_controller.rb

def test
render_text “aiueo”
end
なんか$.postが動かなくて$(this).postって記述を変えたような気もする。正直どうだったか忘れました。
 


結果

そんなこんなで出来上がったものも貼っておきます。使い道はhttp://ihp.mydns.jpのブックマーク編集にて使用する予定です。(現在はまだ未実装)
取得ボタンのonclickイベントで実行されるのはget_info()で、内部で使用している文字コードはutf8です。
 


bookmark.js

//—————————————————————————————
// タイトル/コメントの取得
//—————————————————————————————
var get_info_flg = false;
function get_info(){
var   url;
var   msg;
//———————————————————————————–
// 二重処理防止チェック
//———————————————————————————–
if(get_info_flg != false){
return;
}
get_info_flg = true;
url   = $(“#edit_url”).val();         // URLの取得
//———————————————————————————–
// URLチェック
//———————————————————————————–
if(url.length == 0){
return;
}
//———————————————————————————–
// 結果出力先の初期化
//———————————————————————————–
$(“#edit_name”).val(MSG_NOW_GET_INFO);
$(“#edit_comment”).val(MSG_NOW_GET_INFO);
//———————————————————————————–
// タイトル、コメントの取得
//———————————————————————————–
$.post(“edit/bookmark_get_info?url=” + url, {}, function(html){
$(“#edit_name”).val(get_substring(html, “title”));    // タイトルの取得
$(“#edit_comment”).val(get_substring(html, “comment”));   // コメントの取得
// エラー表示
msg  = get_substring(html, “message”);
if(msg != “”){
alert(msg)
}
get_info_flg = false;
});
}
//—————————————————————————————
// 部分取得
// [引数] src  検索対象
//   key  キーワード
// [戻り値]結果
//—————————————————————————————
function get_substring(src, key)
{
var x1, x2;
x1 = src.indexOf(‘<‘ + key + ‘>’);
x1 += key.length + 2;
x2 = src.indexOf(‘</’ + key + ‘>’, x1);
return (src.substring(x1, x2));
}
 


edit_controller.rb

#
# 指定URLの情報表示
#
require ‘hpricot’
require ‘open-uri’
def bookmark_get_info
title   = “”
comment = “”
msg     = “”
begin
doc       = Hpricot open(URI.encode(params[:url]))                        # 指定されたURLのファイル取得
# タイトル取得
title     = doc.search(“title”).first.inner_html
# コメント取得
doc.search(“meta”) do |t|
comment = t[:content] if t[:name] && t[:content] && t[:name].casecmp(“description”) == 0
end
# 文字コード変換
title     = bookmark_get_info_conv title
comment   = bookmark_get_info_conv comment
unless title != “”
msg     += MES_WARN_GETINFO_TITLE
end
unless comment != “”
msg     += MES_WARN_GETINFO_COMMENT
end
rescue
msg       += MES_WARN_GETINFO
end
render_text “<title>#{title}</title><comment>#{comment}</comment><message>#{msg}</message>”
end
#
# 文字列のエンコード変換&整形
#
def bookmark_get_info_conv str
str = Kconv.toutf8 str
str = str.strip
str = str.gsub “\n”, “”
str = str.gsub “\t”, ” ”
str = str.gsub “ ”, ” ”
str = str.gsub ”  “, ” ”
while str.include?(”  “)
str = str.gsub ”  “, ” ”
end
return str
end