トップ «前の日記(2005-04-20) 最新 次の日記(2005-04-22)» 編集

いしなお!

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|
2009|03|10|

2005-04-21 [長年日記]

_ [tDiary] tDiaryのアンカーリンク時にドキュメントタイトルを表示する その3 (14:43)

段落アンカーの頭は必ずしも1文字ではないようなんで、最初の半角スペースまでを除去するように変更。あと、日記タイトルはh1から取得するのはやめて、tDiary側でJavaScriptに埋め込むようにしてみた。

23,27d22
<
<         if (highlightElem.tagName == 'H3') {
<           var title = "#{@conf.html_title}(#{@date.strftime('%Y-%m-%d')})";
<           document.title = (highlightElem.innerHTML + ' - ' + title).replace(/<[^>]+?>/g, '').replace(/^[^ ]+ (.*)/, '$1');
<         }

これだともしも@conf.html_titleに「"」が含まれているような場合にまずかったりするんだけど、なんか上記の文脈で「"」を適切にエスケープする方法が良くわからなかったんでパス。@conf.html_title.tr('"', '\\"')だとダメなんだよなー。

Rubyのヒアドキュメントと式展開が入れ子になっていて、さらにその結果をJavaScriptの文字列に埋め込む場合、適切なエスケープはどう書くのが正解でしょう?

ネタがかぶっていた

「最初の半角スペースまでを除去する」というネタがかぶっていた

replace(/[^ ]* /, '')

の方がスマートな表現か。

ちなみにdocument.titletitleタグは、title_tag.rbを使っている場合は、その日のすべての段落タイトルが含まれてしまうんで、日記タイトル取得用には使えないんですよねー。

_ [MM][セキュリティ][CSRF] MM/Memoでも一応対応コードをつけてみた (15:10)

MM/Memoの場合はTypeKey認証を使っている関係上、直接アプリケーションからPOSTするようなツールは使えない(ものすごく頑張れば使えなくもないけど)から、こういうチェックを導入したせいで、その手のツールが使えなくなるという人はいないよね? ブラウザ上でbookmarkletとか使ってGETでパラメータ渡ししている場合は問題ないし。

ちなみにチェック処理の内容は、フォームを生成するときに、

$check_key = md5([ユーザーID] , [秘密の文字列]);

で生成したチェックコードを、

<input type="hidden" name="check_key" value="<?=h($check_key) ?>">

なんて感じで埋め込んでおき、POSTされたときに、

if ($_POST['check_key'] != md5([ユーザーID] , [秘密の文字列])) {
  die('認証失敗');
}

しているだけね。認証キーはユーザーIDから生成しなくても、まったくランダムに作ってセッションに保存しておいてもいい。

それにしても、これからの公開Webアプリはみんなこういう対策を標準で取らないとだめなんだろうなー。これから作るフォーム周りのライブラリには、こういう機能を標準で持たせておくべきか。

あ、できればリファラーチェックで弾くような実装はやめてね。俺は基本的にリファラーオフが標準だし。

_ [tDiary][Ruby] tDiaryのアンカーリンク時にドキュメントタイトルを表示する その4 (18:23)

決定版は、こんな感じかなー。

23,28d22
<
<         if (highlightElem.tagName == 'H3') {
<           var diary_title = "#{@conf.html_title.gsub(/"/, '\\"')} (#{@date.strftime('%Y-%m-%d')})";
<           var section_title = highlightElem.innerHTML.replace(/<[^>]+?>/g, '').replace(/^[^ ]* /, '');
<           document.title = section_title + ' - ' + diary_title;
<         }

結局「"」のエスケープについては、

print '"'.gsub(/"/, '\\"')

で「\"」にエスケープできたけど、なんで

print '"'.tr('"', '\\"')

の結果が「"」になって、

print '"'.tr('"', '\\\\"')

の結果が「\」になるのかよくわからんかった。trとgsubでは何が違うんだ?

ああ!

trは文字列置換じゃなくて、文字単位での置換なのか!

_ [PHP][PEAR] HTML_QuickFormを使う場合 (22:12)

<label><input type="checkbox" name="foo[]" value="abc">abc</label>
<label><input type="checkbox" name="foo[]" value="def">def</label>
<label><input type="checkbox" name="foo[]" value="ghi">ghi</label>

みたいな使い方は想定されていないのかな?

本日のツッコミ(全1件) [ツッコミを入れる]
_ ただただし (2005-04-21 17:21)

>俺は基本的にリファラーオフが標準だし<br>だよねー、やっぱし。<br>あ、hilight.rbの改造は、決定版ができたら教えてください。取り込みます:-)