はてなキーワード: エスケープとは
おそらく一昨日の激しいMOJIBAKE不具合の発生原因となった修正によると思われる、キーワードがアンカー文字列にあるとそこからキーワードリンクにされてしまう、という別の不具合が発生している。
+[http://anond.hatelabo.jp/:title=はてな匿名ダイアリー] +<a href="http://anond.hatelabo.jp/">はてな匿名ダイアリー</a> +[http://anond.hatelabo.jp/:title=はてな匿名ダイアリー] +[http://anond.hatelabo.jp/:title=これがはてな匿名ダイアリーの姿] +[http://anond.hatelabo.jp/:title]
5番目のパターンは、多くの文字の数値文字参照化と取得した文字との関係で起こっている現象であろうと、たとえば「YouTube - Broadcast Yourself([http://www.youtube.com/:title])」等から推察できる。
+http://www.hatelabo.jp/ +http://anond.hatelabo.jp/ +[http://www.hatelabo.jp/:title=http://www.hatelabo.jp/] +[http://anond.hatelabo.jp/:title=http://anond.hatelabo.jp/] +[http://anond.hatelabo.jp/:title=http://www.hatelabo.jp/] +[http://www.hatelabo.jp/:title=http://anond.hatelabo.jp/]
例えばwwwとこのエントリー内に書いてありキーワードリンクが発生している条件では、上記の内容が下記のようなリンクになる。
この時、ASCII文字によるanondもキーワードである事に注意。
これは若干異なるものの、以下のように連続した英数字からなる文字列の場合は途中でキーワードリンクにならないが、他の場所でキーワードリンクとなってる文字列の場合はキーワードリンクとなる従来の仕様の影響かもしれない。
このほか従来からのpタグ(下記参照)に加え、&や>(ASCII文字による&と>)等の不具合も出ている。
<p>
しかし、この修正でhttp://anond.hatelabo.jp/20070129012129と同一の内容であっても、多くのキーワードが正常にリンクされるようになった。
OK
C# $10 (T_T) *ist D +ANIMA yes,mama ok -196℃ .book c/w :active ave;new アンリ・カルティエ=ブレッソン ?B @CHaT [TV] ^H _no PE`Z ||リ・_・`川
AirH" AirH" 女子高生 GIRL'S-HIGH 女子高生 GIRL'S-HIGH MÄR MÄR (*゚∀゚)ノ パキャッ (*゚∀゚)ノ パキャッ
文字参照に変換されるため双方上と同様に
P&G
含むキーワードを見つけられず
% \ { } ~
キーワード関連
また、近い問題としてhttp://anond.hatelabo.jp/20070328234724もあげておく。修正されていた。
結論としてエスケープは面倒臭
このたびは、御社はてラボ内のサービスの一つ「はてな匿名ダイアリー」において、正式サービスではないにもかかわらず、迅速な荒らし対策を行っていただき、誠に有難う御座いました。
心より御礼申し上げます。
さて、上記対策により、一部閲覧し難いエントリーも正常に表示されるようになりましたが、しかし、その対策による影響とは断定できるわけではありませんが、一部機能に不具合が生じております。
具体的には、エントリーのパーマリンクのページに付加されます、トラックバックツリーにおきまして、本文の一部表示を全文表示に展開できる「その場で全文機能*1」が動作しなくなっております。
原因としましては、modeパラメータに対しjsonを指定した際の応答が、本来jsonまたはjsonp形式となるはずが、HTMLエスケープされた上で幾つかのHTMLのタグが付加されているためです。
ご多忙の中、このようなお願いが甚だ失礼とも存じますが、すばらしい機能である「その場で全文機能*1」が正常に動作しない現状は非常に残念であり、また荒らし行為への対策を完璧にするためにも、ご対応をして頂けないものかと希望しております。
御社のますますのご発展をお祈りいたしております。
*1 誠に勝手ではありますが、呼称が定まっておりませんでしたので、僭越ながら命名させていただきました。
http://anond.hatelabo.jp/20090102095509
はてなダイヤリーでは確かtex記法はimgタグに変換される。imgタグのソースにtex記法の一部が記述されていて、画像のURIとしてcgiとそれに渡すパラメタが記述されている。よってブラウザはimgタグをみてcgiに画像を要求し、cgiは数式が記述された画像を返す。推測だけど。
しかし匿名ダイヤリーはimgタグに変換されたところでエスケープが働く。これはバグというより仕様と思われる。imgタグだろうとtex記法のものだけ通すとか判定めんどうそうだし、tex記法で思わぬ使われ方をすると危ないと判断したからかもしれない、これらも推測ではあるが。
結論としてやはりバグではなく仕様と評するほうがずっと合っていると思われる。よってはてラボに要求するならデバッグ要求ではなく仕様変更要求のほうが適しているだろう。しかしなおバグだと考えるならばもちろん好きになされるとよい。
[3:39] *** えがちゃんが奥野肛門括約筋, oquno, ryo_GRID, ryuzi_kambeを追加しました ***
[3:39] UK - Yuki Akamatsu: エモオフなめんな
[3:39] *** えがちゃんが=ujihisa24を追加しました ***
[3:40] *** satoru.netが、会話のタイトルを"えがえがチャット?"に変更しました ***
[3:41] *** OKが、会話のタイトルを""に変更しました ***
[3:41] OK: みす
[3:41] *** えがちゃんがhayamiz, hogelog, nkztmktを追加しました ***
[3:41] *** Mishoが、会話のタイトルを"<<ここをクリックしてチャットのタイトルを設定>>"に変更しました ***
[3:42] *** えがちゃんが、会話のタイトルを"えがえがチャット"に変更しました ***
[3:42] nommy/asuinim/L4RK: えっと、これは何がしたいんです?
[3:42] Misho: 世界の果てだよ
[3:42] satoru.net: えがちゃんが 主催者になりたいのだろうか。。
[3:42] Misho: はじめましてのひとははじめまして!みしょです!!!!
[3:42] えがちゃん: 正解>misho
[3:43] えがちゃん: 今日ここに集まってもらったメンバーに
[3:43] satoru.net: はじめましてー>みしょ様
[3:43] えがちゃん: 大事なお知らせがあります
[3:43] UK - Yuki Akamatsu: 結婚すんの?
[3:43] UK - Yuki Akamatsu: おめでとう
[3:43] えがちゃん: えー、発表していいですか?>satoruさん
[3:43] Misho: おめでとう!
[3:43] えがちゃん: うん、ありがとう
[3:43] OK: 江上自己顕示欲旺盛のクソ
[3:43] satoru.net: しらんしおれw
[3:43] えがちゃん: www
[3:43] OK: 偉くなりたいだけ
[3:43] OK: 謙虚さが見えない
[3:43] えがちゃん: エー実は僕、
[3:43] OK: はい
[3:43] えがちゃん: (まずここでのチャットは非公開でお願いしますね)
[3:43] えがちゃん: まず、2つありまして1つは
[3:43] UK - Yuki Akamatsu: 学習したのか
[3:44] OK: はい
[3:44] nommy/asuinim/L4RK: それアレ?上島?
[3:44] えがちゃん: 今までのはてなでの流れにつきましてです
[3:44] satoru.net: 学習機能ついてたんだー えがちゃんて 感動
[3:44] Misho: わかった!!絶対に公開しない!!!
[3:44] Misho: おまえらも絶対に公開するんじゃないぞ!!!!
[3:44] nommy/asuinim/L4RK: よし、みしょ、公開するなよ!
[3:44] Misho: いいな!!!ぜったいだぞ!!!!!!
[3:44] えがちゃん: なぜ、今までこういったことをはてなでやってきかた
[3:44] nommy/asuinim/L4RK: 絶対にだぞ!
[3:44] Misho: おう!!!ぜったいしない!!!!!
[3:44] えがちゃん: すべてをお話、、、
[3:44] えがちゃん: すればいいですか?
[3:44] えがちゃん: まぁそれはいいか
[3:44] UK - Yuki Akamatsu: いや
[3:44] nommy/asuinim/L4RK: OKもするなよ!公開するなよ!
[3:44] えがちゃん: んで、2つ目が
[3:44] えがちゃん: では、発表します!
[3:44] えがちゃん: えー、、、緊張しますね
[3:44] えがちゃん: では、いきます
[3:45] えがちゃん: 「週に1つサービスを作ろうの会」発足
[3:45] えがちゃん: をここに表明いたします。
[3:45] UK - Yuki Akamatsu: ほい
[3:45] えがちゃん: 皆さんは、メンバーでございます。
[3:45] えがちゃん: 一緒に、気づきあげましょう。
[3:45] えがちゃん: 僕が、会長です。
[3:45] UK - Yuki Akamatsu: 拒否権はあるんですか
[3:45] yuiseki: ^^;
[3:45] えがちゃん: うーん、一旦今日は表明だけなので
[3:45] nommy/asuinim/L4RK: 後のともだち ですね
[3:45] えがちゃん: ない
[3:45] えがちゃん: >拒否権
[3:45] UK - Yuki Akamatsu: ないwwww
[3:45] OK: 映画化決定!!!!!!!
[3:46] えがちゃん: 一応、実は計画があります
[3:46] えがちゃん: もちろん、ばかみたいに今までサイトを作ってきて
[3:46] OK: マルチ商法だ!
[3:46] えがちゃん: 目的もないなんて、バカのやることです
[3:46] OK: 大丈夫、馬鹿は何やっても馬鹿ですから。
[3:46] *** えがちゃんがVoQnを追加しました ***
[3:46] OK: 江上とか江上とか江上とか。
[3:46] UK - Yuki Akamatsu: タイミングが
[3:46] えがちゃん: では、何をゴールにするか
[3:46] UK - Yuki Akamatsu: おかしくねw
[3:46] えがちゃん: wwwww
[3:46] *** VoQnが退席しました ***
[3:46] えがちゃん: いや、VoQnさんはここでよぶできでしょうw
[3:46] satoru.net: ちなみにここにあつまってるひとって
[3:47] satoru.net: みんhな webつくる系なひとなの?w
[3:47] OK: プライバシー設定で拒否られていることに
[3:47] OK: 江上は無反応である
[3:47] UK - Yuki Akamatsu: ニートです
[3:47 | 3:47:19を編集しました] OK: わろす
[3:47] satoru.net: おー。ニート( ・∀・)イイ!!
[3:47] えがちゃん: わろす
[3:47] OK: 江上を叩くのが職業
[3:47] えがちゃん: って、別にOKさんはそんなにたたいてないでしょうw
[3:47] OK: 修行中
[3:47] えがちゃん: まぁ、一応理念てきなものはここで今後発表していきます
[3:47] OK: 精進します
[3:47] yuiseki: (think)
[3:47] えがちゃん: そうだね
[3:47] えがちゃん: まずは
[3:48] えがちゃん: みんな、メンバー同士仲良くしてもらいたいと言うのが1つと
[3:48] えがちゃん: VoQnさんを誰か読んでもらいたいwwww
[3:48] *** yuisekiがjavascripterを追加しました ***
[3:48] えがちゃん: と言うのが2つ目
[3:48] satoru.net: あー えが叩き家の方ですか。お務め御苦労です!
[3:48] えがちゃん: 3つ目が、自分を大切にしてもらいたい
[3:48] *** yuisekiがtackeを追加しました ***
[3:48] OK: えが叩き券
[3:48] OK: 1枚1000円
[3:48] えがちゃん: 4つ目が今後、僕についてブログでドンドン言及してもらいたい
[3:48] *** UK - Yuki Akamatsuが、会話のタイトルを"ログは非公開だそうですよ。"に変更しました ***
[3:48] javascripter: 参上
[3:48] UK - Yuki Akamatsu: それは
[3:48] えがちゃん: 毎週土曜日に
[3:48] UK - Yuki Akamatsu: 批判とかでも
[3:48] OK: やなこった>topic
[3:48] UK - Yuki Akamatsu: いいんですか
[3:49] OK: 江上について言及すると
[3:49] OK: 彼のモチベーションが上がる!
[3:49] えがちゃん: えがちゃんちに集合
[3:49] OK: 逆説的に言えば
[3:49] えがちゃん: ってなんでやねんwwwwww
[3:49] OK: 江上は無敵である
[3:49] えがちゃん: おkだよ
[3:49] OK: えがみけ。
[3:49 | 3:50:04を削除しました] えがちゃん: このメッセージは削除されました
[3:49] javascripter: というか途中から入ったから1つめと2つめ見れん
[3:49] えがちゃん: ぼくのうちにかってにすみついてもらっても.
[3:49] UK - Yuki Akamatsu: javascripterの人だ
[3:49] えがちゃん: かまいません
[3:49] えがちゃん: 食糧 そのた 物資は
[3:49] OK: 矢野さんってネットでいっぱい稼いでるんですよね!おうちっておっきいんですか!
[3:49] UK - Yuki Akamatsu: えがみハウスや
[3:49] satoru.net: ちっこいです。
[3:50] nommy/asuinim/L4RK: 削除された発言を見れなかった
[3:50] OK: あー俺黒歴史創造しつつあるなー
[3:50] OK: まあいいや
[3:50] えがちゃん: そうですね
[3:50] えがちゃん: OKさんとかの
[3:50] UK - Yuki Akamatsu: おれあれなんですよ
[3:50] えがちゃん: 今日のブログの言及はなかなかよかったです。
[3:50] UK - Yuki Akamatsu: 話の流れとか理念とかを
[3:50] UK - Yuki Akamatsu: 理解してもらうために
[3:50] えがちゃん: ただもっと突っ込んでもいいかなと言うのが正直な話ですが
[3:51] えがちゃん: ああいいう感じで、言及してもらい
[3:51] UK - Yuki Akamatsu: ログは公開した方がいいとおもうんですよ
[3:51 | 3:51:16を削除しました] えがちゃん: このメッセージは削除されました
[3:51] UK - Yuki Akamatsu: > えがちゃん
[3:51] えがちゃん: 最終ゴールは
[3:51] えがちゃん: 日本征服。
[3:51] えがちゃん: これいきましょう。
[3:51] satoru.net: ちっちゃ
[3:51] えがちゃん: おお!
[3:51] OK: ちっちゃいなー
[3:51] えがちゃん: え?
[3:51] satoru.net: 海外にせまないんっすか?
[3:51] nommy/asuinim/L4RK: 全然
[3:51] nommy/asuinim/L4RK: 見てなかった
[3:51] えがちゃん: なるほど
[3:51] えがちゃん: 世界征服
[3:51] nommy/asuinim/L4RK: 消された発言なに?
[3:51] OK: アイスランドをのっとる!
[3:51] えがちゃん: これいきましょう
[3:51] UK - Yuki Akamatsu: わすれた
[3:51] yuiseki: ??くにをつくる
[3:51] satoru.net: とりあえず えがみハウスを
[3:52] えがちゃん: 具体的に土曜日に集まって
[3:52] えがちゃん: 世界征服できるかよwwww
[3:52] OK: 江上殴り放題
[3:52] えがちゃん: とお思いですよね?
[3:52] javascripter: 日曜にしろや
[3:52] OK: えがみはうす
[3:52] えがちゃん: それはうざい>殴る
[3:52] えがちゃん: そういうのやめろ>OK
[3:52] satoru.net: えがみはうすって 飲み食いじゆうですか?
[3:52] えがちゃん: あっはい、
[3:52] OK: 冗談です
[3:52] えがちゃん: 基本的に自由です。
[3:52] yuiseki: えがちゃんが養ってくれるの?
[3:52] えがちゃん: ただ、帰って来て
[3:52] えがちゃん: 物なくなってたらちょっと切れます
[3:52] satoru.net: www
[3:52] えがちゃん: ちなみに、この企画は本気です。
[3:53] OK: そうか江上はSか
[3:53] javascripter: はあそうですか、すごいですね
[3:53] OK: 僕は昔は殴られるだけで心地よかった
[3:53] えがちゃん: もうこうなったら、自分と言うコンテンツを最大限に発揮し
[3:53] えがちゃん: 家を貸し出そうと思います。
[3:53] えがちゃん: さー!みなさん!
[3:53] OK: 不動産に進出!
[3:53] えがちゃん: もし興味がありそうな人がいたら
[3:53] えがちゃん: このグループチャットに知り合いを呼んでください
[3:53] nommy/asuinim/L4RK: マルチ?
[3:53] えがちゃん: あと、部屋の中の状況は常にカメラで公開
[3:53] えがちゃん: されます
[3:53] えがちゃん: ( ^ω^ )ニコニコ風に
[3:54] えがちゃん: こめんとがつけられるので
[3:54] OK: オナニーとかできないじゃないかそれ!
[3:54 | 3:54:06を削除しました] えがちゃん: このメッセージは削除されました
[3:54] OK: それはよくない!
[3:54] えがちゃん: そのてんだけ ごりょうしょうくださいw
[3:54 | 3:54:17を削除しました] tacke: このメッセージは削除されました
[3:54] satoru.net: ww
[3:54] OK: そうか公開オナニーか
[3:54 | 3:54:32を削除しました] tacke: このメッセージは削除されました
[3:54] えがちゃん: いうw
[3:54] UK - Yuki Akamatsu: 友達呼ぶのにログみせたいんですけど
[3:54] えがちゃん: いやだめ
[3:54] UK - Yuki Akamatsu: えー
[3:54] えがちゃん: ここのログは非公開
[3:54] satoru.net: えー ええやろw
[3:54] OK: どうぞどうぞご自由に
[3:55] えがちゃん: ではおkさんでw
[3:55] UK - Yuki Akamatsu: 理念とか説明するのだるい
[3:55] nommy/asuinim/L4RK: 友達を広く呼ぶためにログを一部twitterに張るのはだめですか?
[3:55 | 3:55:22を編集しました] OK: 全部でもどうぞ
[3:55] *** UK - Yuki Akamatsuが、会話のタイトルを"ログ公開ok"に変更しました ***
[3:55] satoru.net: 何でも公開精神でいくほうがよくねw
[3:55] satoru.net: いつから えがちゃんは 保守派になったのw
[3:55] えがちゃん: 公開でw
[3:55 | 3:56:07を削除しました] えがちゃん: このメッセージは削除されました
[3:55] OK: 江上さんはコードを隠してもcrackされるので
[3:55] OK: 仕方がない
[3:55] yuiseki: ほあー
[3:55] えがちゃん: 副理事なのでみなさん言うこと聞いてください
[3:55] OK: 江上民主党
[3:55 | 3:56:02を削除しました] えがちゃん: このメッセージは削除されました
[3:56] OK: 江上「日本をぶっこわす」
[3:56] えがちゃん: 今後satoruさんの言うことを聞いてください
[3:56] OK: 何故ですか
[3:56] *** tackeがsendを追加しました ***
[3:56] yuiseki: 江上のギアスが発動する
[3:56] *** sendが退席しました ***
[3:56] OK: 僕は矢野という男は
[3:56] satoru.net: あ。ぼくはかんけいないですw
[3:56] OK: おもっている
[3:56] satoru.net: 江上が 勝手にいってるだけです
[3:56] *** nommy/asuinim/L4RKがNANKI Haruoを追加しました ***
[3:56] OK: 顔が
[3:57] *** えがちゃんがcats, poohtarou(ぷーたろー), kamemoto.sayaka, 安江健, VoQn, ymrlを追加しました ***
[3:58] *** VoQnが退席しました ***
[3:58] nommy/asuinim/L4RK: 発言が収まったと思ったら人よんどっただけかw
[3:58] satoru.net: えとー、とりあえず 役割分担として、
えがみは 実際 開発とか ばりばりできるわけでもないので、
そのへんは 僕が フォローできればなあとおもってます。
[3:58] OK: 今くしゃみしようとして舌かんだ
[3:58] OK: 痛い
[3:58] OK: 矢野さんに一言。
[3:58] Misho: みしょと聞いて
[3:58] UK - ukstudio - Yuki Akamatsu: ホイミ
[3:58] OK: 江上さんにエサあげてどうするんですか
[3:58] OK: 彼の向上意欲が
[3:59] OK: ますます低下しますよ
[3:59] satoru.net: あー。ぼくは べつに どーこーしたいつもりでもなくて
えがみがやりたいことを やればいー ってくらいです。
[3:59] OK: 可愛い子には旅をさせよ
[3:59] *** えがちゃんが、会話のタイトルを"この計画を「Webサイトを週一で作ろうの会」プロジェクトとして布教してちょ"に変更しました ***
[3:59] 亀: なぜ呼ばれたのか分からない亀
[3:59] OK: 昔の人の言葉です。
[3:59] OK: 矢野さんはダイレクトに助けるのではなく、彼に考えさせる手助けをすべき
[3:59] UK - ukstudio - Yuki Akamatsu: マスコットキャラクターとしてじゃないですかね > 亀さん
[3:59] OK: 彼はどんどん働かなくなります
[3:59] 亀: わーわーさとるさんだーヽ(´ー`)ノ
[3:59] えがちゃん: OKもうわかったから次いこうか
[3:59] nommy/asuinim/L4RK: 分からない亀 に吹いた
[3:59] OK: wwwww
[3:59] えがちゃん: satoruさんのおっしゃるとおり
[3:59] えがちゃん: えとー、とりあえず 役割分担として、
えがみは 実際 開発とか ばりばりできるわけでもないので、
そのへんは 僕が フォローできればなあとおもってます。
[3:59] NANKI Haruo: 働かなくなったら、それはそれでいいんじゃないの?
[4:00] えがちゃん: と言う形でいきます
[4:00] UK - ukstudio - Yuki Akamatsu: この会の一番の理由は
[4:00] OK: ここから江上さんがニートになって廃人になるちょうすぴーどの
[4:00] OK: ふぃくしょんが
[4:00] UK - ukstudio - Yuki Akamatsu: えがみを表にたたせて、裏で勝手に働いてくれる人を
[4:00] えがちゃん: まとめると
[4:00] UK - ukstudio - Yuki Akamatsu: さがすってことじゃないの?
[4:00] えがちゃん: まとめますね
[4:00] OK: 展開するとこだったのに
[4:00] NANKI Haruo: 何故か笑うせーるすまんを思い出すな。
[4:00] OK: まとめなくていいです
[4:00] UK - ukstudio - Yuki Akamatsu: 例:おれがつくる->えがみ「つくったよー」
[4:00] OK: UKがまとめた
[4:00] OK: 以上。
[4:00] yuiseki: 実装つかれたー
[4:00] nommy/asuinim/L4RK: えがちゃんの部屋の床が抜けるくらいの人数で押しかけようぜ
[4:00] satoru.net: 1Fだから 床ないね 乙
[4:00] nommy/asuinim/L4RK: 1Fかー・・・
[4:01] NANKI Haruo: 一畳に8人入れるとして、64人いける
[4:01] NANKI Haruo: もっと入れると思うけど。
[4:01] satoru.net: よーし 64にんだー
[4:01] nommy/asuinim/L4RK: 何人乗っても大丈夫!
[4:01] えがちゃん: 1、Webサイトを週一で作ろうの会発足
5、えがみが会長
[4:01] *** yuisekiがitkzを追加しました ***
[4:01] えがちゃん: 以上。
[4:01] OK: 大丈夫、一階でも
[4:01] OK: 基礎というものがあってだな・・・・
[4:01] *** yuisekiがはまちや2を追加しました ***
[4:01] OK: むしろ矢野家に地下を掘る
[4:01] えがちゃん: OKが今日はいつもよりとばしててうけるw
[4:02] NANKI Haruo: 床が抜けないなら天井を抜け、と先人も申しておる
[4:02] OK: そうだそうだ
[4:02] OK: 天井を抜くんだ!
[4:02] えがちゃん: 7、最終ゴールは世界征服
[4:02] 亀: さとるさんのいえ超散らかってるってきいた(´・ω・`)
[4:02] OK: 今夜の抜きネタは何がいいですか
[4:02] satoru.net: あ、ぼくのうちは きたないので ひとはいれないです>亀さん
[4:02] tacke: 3、えがみハウスではライブカメラ公開とある程度の食事がある
5、えがみが会長
7、最終ゴールは世界征服
[4:02] えがちゃん: 8、サポートはsatoruさんが対応
[4:02] OK: えがちゃんが
[4:02] 亀: >Webサイトを週一で作ろう サイトなん?サービスじゃなくてー?
[4:02] OK: 酷いじょうやくを
[4:02] *** javascripterがsendを追加しました ***
[4:03] OK: 矢野さん搾取されてもいいんですか!
[4:03] えがちゃん: サービスだね
[4:03] *** えがちゃんが、会話のタイトルを"この計画を「Webサービスを週一で作ろうの会」プロジェクトとして布教してちょ"に変更しました ***
[4:03] OK: 独裁者を許すな!
[4:03] satoru.net: 楽天ショップで食糧いろいろ えがみはうすに輸出しときます
[4:03] UK - ukstudio - Yuki Akamatsu: それを活動することで
[4:03] UK - ukstudio - Yuki Akamatsu: おれにメリットはあるんですか?
[4:03] satoru.net: 搾取>だいかんげい
[4:03] UK - ukstudio - Yuki Akamatsu: ギブアンドテイクで
[4:03] OK: 共和制こそが求められる!
[4:03] UK - ukstudio - Yuki Akamatsu: いきたいです
[4:03] UK - ukstudio - Yuki Akamatsu: 金くれ
[4:03] OK: さとるさんがもう駄目な感じ
[4:03] NANKI Haruo: 食べ物貰えるんじゃないの
[4:03] OK: 搾取されていいのは女性だけでして
[4:03] OK: 大歓迎なんですが
[4:03] OK: 江上さんがかわいい女の子とかだったら
[4:03] UK - ukstudio - Yuki Akamatsu: おれは現金がほしい
[4:04] satoru.net: ふつうに さいとつくって
[4:04] satoru.net: 現金ほしいひとは
[4:04] えがちゃん: 1、Webサービスを週一で作ろうの会発足
5、えがみが会長
7、最終ゴールは世界征服
8、サポートはsatoruさんが対応
[4:04] satoru.net: こうこくいれることになるので
[4:04] tacke: 1、Webサービスを週一で作ろうの会発足
5、えがみが会長
7、最終ゴールは世界征服
8、サポートはsatoruさんが対応
[4:04] satoru.net: そこで 各自 現金もうければいいのかなぁ。
[4:04] satoru.net: ただ えがみはうすが ひとふえるだけだと 崩壊しちゃうので
[4:04] 亀: えがちゃんの家ハムスターいるらしいからちょっといきたい
[4:04] satoru.net: 一部は えがみはうす運営に まわればいいのかな?
[4:04] yuiseki: (wasntme)
[4:04] えがちゃん: あーいいですね
[4:04] OK: じゃあ僕は
[4:04] OK: 運営として
[4:04] えがちゃん: おい、、、それはもういないよ、、、>亀
[4:05] OK: 浸水させる
[4:05] satoru.net: えがみはうす はむすたー いたっけ?ティッシュが散乱してたくらいしかおぼえてないぞ
[4:05] OK: ギークハウスを超えろ!
[4:05] えがちゃん: 超えれるよ簡単に
[4:05] はまちや2: 管理権ちょうだい
[4:05] OK: あーしこってますねー
[4:05] nommy/asuinim/L4RK: えがみはうすに行くための金がない
[4:05] 亀: えっ( ̄□ ̄;)ショック><
[4:05] nommy/asuinim/L4RK: 1000円しかもってない
[4:05] UK - ukstudio - Yuki Akamatsu: はまちやさんだ
[4:05] OK: それとも風俗嬢とですか
[4:05] satoru.net: えがみはうす ネット環境が
[4:05] tacke: えがみはうすってどこですか
[4:05] satoru.net: しょぼいよな。無線LANをセット& モニタを数台
[4:06] 亀: ごめんねかなしいこと言わせちゃって>えがちゃん
[4:06] satoru.net: 設置して ノーとの持ち込みできるようにせよ
[4:06] OK: それは触れてはいけないこと>はまちや2
[4:06] えがちゃん: いえいえ>亀
[4:06] *** yuisekiが加山雄三を追加しました ***
[4:06] OK: ぶっちゃけVIP炎上みたいにすれば
[4:06] UK - ukstudio - Yuki Akamatsu: だれw
[4:06] *** えがちゃんが田村 健太郎を追加しました ***
[4:06] OK: うん
[4:06] *** yuisekiがvoqnを追加しました ***
[4:06] えがちゃん: お
[4:06] えがちゃん: Voqnだ
[4:07] *** yuisekiがVoQnを追加しました ***
[4:07] *** えがちゃんがnishio_hirokazuを追加しました ***
[4:07] yuiseki: (bow)
[4:07] *** nishio_hirokazuが退席しました ***
[4:07] Misho: えがみはうすって
[4:07] Misho: なに?
[4:07] Misho: 一軒家!?
[4:07] えがちゃん: 俺の家です
[4:07] satoru.net: www
[4:07] yuiseki: :)
[4:07] OK: えがみの精液くさい家なんて嫌だ
[4:07] satoru.net: リアルハウスでしょ。えがちゃんのw
[4:07] えがちゃん: まぁ、にちかいものはあります
[4:07] Misho: どこにあるの!?
[4:08] Misho: YEBISU
[4:08] OK: おお、ちょろっといけますね
[4:08] tacke: いいとこじゃん
[4:08] *** UK - ukstudio - Yuki Akamatsuがscolorsを追加しました ***
[4:08 | 4:08:54を削除しました] えがちゃん: このメッセージは削除されました
[4:08] Misho: いいとこすぐる。えびすびーるのめいさんちだ。
[4:08] えがちゃん: シムシティみたいに みんなで どんどんおおきくしていく計画
[4:09] NANKI Haruo: 家賃どれくらいですか
[4:09] *** yuisekiがid:todeskingを追加しました ***
[4:09] えがちゃん: 15万ぐらい?
[4:09] はまちや2: 管理権ちょうだい
[4:09] NANKI Haruo: 東京高ぇ
[4:09] *** yuisekiがgeekhouseを追加しました ***
[4:09] id:todesking: 人間が死んでしまった……
[4:09] yuiseki: (bow)
[4:09] OK: ここで私から
[4:09] tacke: 壊滅だ、、、
[4:09] OK: 提案があります!
[4:09] itkz: 人間を殺そう
[4:09] えがちゃん: 管理権のわたしかたがわからないす><
[4:09] scolors: ゆいせき追加しまくりわろた
[4:09] えがちゃん: 1、「Webサービスを週一で作ろうの会」発足
5、えがみが会長
7、最終ゴールは世界征服
8、サポートはsatoruさんが対応
[4:09] tacke: カニバリズム
[4:09] send: とでちんがしゃべった
[4:09] yuiseki: !!!!
[4:09] えがちゃん: 地方で来れない人は、リアルで僕の自宅に寝泊まりOKです。
寝袋は複数用意します。
[4:10] OK: 9、利益は皆で山分け
[4:10] OK: これを追加しましょう
[4:10] えがちゃん: 1、「Webサービスを週一で作ろうの会」発足
5、えがみが会長
7、最終ゴールは世界征服
[4:10] OK: 社会主義を目指す
[4:10] id:todesking: えがみ会に入れば情報商材系サイト作り放題
[4:10] tacke: えがちゃんはもうけをきにしないので1銭もいただきません
[4:10] えがちゃん: 1、「Webサービスを週一で作ろうの会」発足
5、えがみが会長
7、最終ゴールは世界征服
9、利益は皆で山分け
[4:10] OK: よいよい
[4:10] えがちゃん: いやいるよw
[4:10] OK: そして反乱分子として
[4:10] えがちゃん: でも、副業はできないので
[4:10] yuiseki: 新手のネットワークビジネスですか
[4:10] えがちゃん: そこは要相談
[4:10] OK: えがみは粛清されるのであった
[4:11] えがちゃん: サーバは専用サーバを1台用意するのでそこをみんなで共有。
[4:11] OK: えがみさん、もうウェブサービスは
[4:11] えがちゃん: 1、「Webサービスを週一で作ろうの会」発足
5、えがみが会長
7、最終ゴールは世界征服
9、利益は皆で山分け
10、サーバは専用サーバを1台用意するのでそこをみんなで共有。
[4:11] OK: これからの時代はやりませんよ
[4:11] えがちゃん: うっせ>OK
[4:11] OK: これからの時代は島です
[4:11] OK: 島を買いましょう
[4:11] はまちや2: 管理権ちょうだい
[4:11] NANKI Haruo: そういえば昔、
[4:11] OK: 管理権とかない
[4:11] えがちゃん: いや、本気で譲渡の方法がわからないです
[4:11] えがちゃん: はまちちゃんさんも
[4:11] UK - ukstudio - Yuki Akamatsu: グループって管理権ないん?
[4:11] えがちゃん: 入ります?
[4:12] OK: >[4:11:30] えがちゃんの発言: うっせ>OK
ショックでした
[4:12] UK - ukstudio - Yuki Akamatsu: ここのメンバーは強制じゃないんかい
[4:12] はまちや2: hairuhariru
[4:12] NANKI Haruo: やっぱり、情報商材とか、怪しげなビジネスモデルに興味津々な後輩がいて、
[4:12] satoru.net: いそがしくて えがみはうすなんて これないとおもわれww>はまちやさん
[4:12] えがちゃん: よかったー
[4:12] はまちや2: いくにきまってんじゃん
[4:12] satoru.net: まじっすか!!!
[4:12] えがちゃん: おぉありがとうございます。
[4:12] NANKI Haruo: 好き放題やらせてたな。
[4:12] sys: Available commands:
/me [text]
/topic [text]
/add [skypename]
/history
/find [text]
/fa or /
/alertson [text]
/alertsoff
/call [skypename] ..
/leave
/goadmin
/get creator
/get role
/whois [skypename]
/setrole [skypename] MASTER|HELPER|USER|LISTENER
/kick [skypename]
/kickban [skypename]
/get guidelines
/get xguidelines
/set guidelines [text]
/get options
/set options [[+|-]flag] ..
/setpassword [password] [password hint]
/clearpassword
/get password_hint
/get banlist
/get allowlist
/set banlist [[+|-]mask] ..
/set allowlist [[+|-]mask] ..
/help
For more help please see http://www.skype.com/go/help.chathelp
[4:12] NANKI Haruo: 専用のサーバも買ってさ。
[4:12] えがちゃん: XSSの脆弱性部をお願いしたいものですね
[4:12] send: はまちちゃんが行くなら俺も見に行くか
[4:13] UK - ukstudio - Yuki Akamatsu: おれもおれも
[4:13] OK: PHPでXSSの脆弱性出すヤツは
[4:13] javascripter: 俺もいこう
[4:13] えがちゃん: おk
[4:13] OK: ただのコーダーの知識不足で
[4:13] scolors: 見るだけ
[4:13] OK: PHPは適切に標準関数使えば
[4:13] えがちゃん: ちなみに、何度も言うけど
[4:13] OK: ワンステップでXSS可能性を排除できる
[4:13] えがちゃん: ここのチャットは公開のしかたよろしくね!
[4:13] UK - ukstudio - Yuki Akamatsu: htmlspe(ryだけじゃダメな時もあった気がするけど。
[4:13] えがちゃん: 決して、ブログとかでコピペしちゃだめだよ?w
[4:13] UK - ukstudio - Yuki Akamatsu: ん?
[4:13] tacke: ん?
[4:13] UK - ukstudio - Yuki Akamatsu: 公開okだろ?
[4:13] えがちゃん: XSS云々そんな細かいことできにしてるやつらは、ちょっと 表に出ろ
[4:13] OK: なんかそれに対する全対策的関数とかなかったっけ>UK
[4:14] scolors: 公開のしかたよろしくねって
[4:14] えがちゃん: (っていうふり>XSS)
[4:14] UK - ukstudio - Yuki Akamatsu: あったっけ
[4:14] tacke: 公開の仕方がそもそもわからんのですが
[4:14] NANKI Haruo: 表って、家の外にでればいいのか?
[4:14] UK - ukstudio - Yuki Akamatsu: PHPわかんないや
[4:14] えがちゃん: XSS云々そんな細かいことできにしてるやつらは、ちょっと 表に出ろ
[4:14] javascripter: htmlspe(ryが駄目なのってUTF-7の時とか?
[4:14] OK: えがみみてると
[4:14] OK: いわいらするなー
[4:14] えがちゃん: 俺らの狙ってるのはそんなちっけーことじゃねえ
[4:14] UK - ukstudio - Yuki Akamatsu: 文字コードとか
[4:14] OK: UTF-7 Injection
[4:14] id:todesking: PHP、何でデフォルトでHTMLエスケープされるようになってないんだろう
[4:14] *** yuisekiがsatromiを追加しました ***
[4:14] *** tackeがdankogaiを追加しました ***
[4:14] send: IE で ` もダメじゃなかったっけ
[4:14] えがちゃん: だんこがい!?ww
[4:14] satoru.net: とりあえず いるもの:
[4:15] OK: だんこがいわろすwwwwwwwwwwwwwwwwww
[4:15] *** dankogaiが退席しました ***
[4:15] OK: ぷらいばしーせっていwwwwwwwwwww
[4:15] UK - ukstudio - Yuki Akamatsu: w
[4:15] NANKI Haruo: さすが
[4:15] はまちや2: うん。その方が良かったね。デフォルトでエスケープ。
[4:15] tacke: ・・・チッ
[4:15] yuiseki: !!
[4:15] OK: 使いづらくないか
[4:15] satoru.net: ドメインって共通にしたほーがいいのだろうか。その辺はXSSのとき
色々問題ありそげだから じゆうにしとく?
[4:15] NANKI Haruo: XSS垂れ流しよりマシ
[4:15] UK - ukstudio - Yuki Akamatsu: PHPに関していえば
[4:15] はまちや2: 世の中の脆弱性がすごくへるよ
[4:15] UK - ukstudio - Yuki Akamatsu: デフォルの方がいいかなーとはおもう
[4:15] scolors: ていうか PHP XSS で検索するだけでも大量に参考 Permalink | 記事への反応(1) | 05:08
はいこんにちは! Hamachiya2だよ。
alertでなくなったね。こんな短時間ですごい。
エガミくん飲み込みはやい感じだね…。
ええと、あとは、下の方の画像で、どうもマーキータグ(marquee)が埋め込まれてるみたいってことだよね。
うん。もう一回、htmlソースを表示ってして確認してみたよ。
こんなのが埋め込まれてた。
<img src='http://farm4.static.flickr.com/3120/2784053843_b7a7d07c9a_s.jpg' border=0 title=<marquee>test XSS</marquee> alt=<marquee>test XSS</marquee> />
これは問題点が二つあってね、
1つは、タグをエスケープしわすれている箇所がある点
もう1つが、htmlの属性値(alt=ナントカとか)をクオートでくくってない点
この二つを直していこうか!
phpのプログラムの中のどこかで、<img>タグを出そうとしている部分があるはずだよ。
まずはそれを探そう。
そしたらきっと、その部分は、imgにphpの変数を色々埋め込んで出そうとしているはず。
たとえばこんな風に。
echo "<img src='xxxxxx" . $hensuu1 "' title=" . $hensuu2 . " />";
これの$hennsuuも全てhtmlspecialchars()してあげる感じかな。
echo "<img src='xxxxxx" . htmlspecialchars($hensuu1, ENT_QUOTES) "' title=" . htmlspecialchars($hensuu2, ENT_QUOTES) . " />";
こうだね。
そうすればmarqueeタグが埋め込まれていても、
<img src="xxxxxxxx" title=<marquee>test xss</marquee> />
こんな風にmarqueeとかがタグじゃなくなるので防げる。
でも完全じゃないんだこれ。
さっきも言った、属性値のクオートが足りてないから、ちょっと工夫すればxssやられちゃう。
詳細は長くなるので今は省くけど。
だから上の対処に加えて、titleとかaltとかの中身が、htmlでみた時に、ダブルクオートかシングルクオートで
くくられているようにしてやれば、いい感じになるよ!
<img src="xxxxx" title=ぺろぺろ alt=ぺろぺろ />
こうじゃなくて
<img src="xxxxx" title="ぺろぺろ" alt="ぺろぺろ" />
こうなるようにしよう。
(追記)
ちなみに、何で悪い大人の人はXSSの脆弱性を突いてきて悪い事をするんですかー??
それだけエガミくんの生み出すものが注目されているってことだよ。
目立つとどうしても悪い人も寄ってきちゃうから困るよね。
はい! こんにちは! Hamachiya2ですよ!
いま、エガミくんの書き込みみながら、ざくっとソースみてみたよー。
XSSの対策ってね、ぼくもよくわかってないけど、
「出力時にエスケープする」っていうのが定石らしいよ。
でもエガミくんのやろうとしたのは「入力時のエスケープ」だね。
だから $_GET のところ(入力)で何かをするのではなくて…、
レスポンスのコーナーのところ。htmlに変数埋め込んで echo してるとこ。
そこの全ての変数をエスケープしちゃう方がいい感じかな。
その際に注意すべきは、htmlの属性内(alt=ナントカとか、src=ナントカとか)に変数を埋め込んでいる場合は、ちゃんとクオートの類もエスケープする感じ?
echo '<img src="' . $hensuu . '" alt="ぺろぺろ" />';
とかなら、$hensuu はダブルクオートもエスケープだよ。
あ、htmlspecialchars ってダブルクオートはデフォルトで「"」に変換されるんだっけ?
ちょっと試してみてね。
もし↓こんな風に、htmlの属性のクオートにシングルクオートを使ってる場合だと…
echo "<img src='" . $hensuu . '" alt='ぺろぺろ' />";
これは
echo "<img src='" . htmlspecialchars($hensuu, ENT_QUOTES) . '" alt='ぺろぺろ' />";
こうする感じかな?
あと、サンプルコードには含まれていなかったけど、
本番の方だと、htmlのheadの中でも変数つかってるよね。
たとえば、xxxで検索すると、titleタグやメタタグにもxxxが入ってくる。
そのあたりも、とりあえず「表示しようとしてる箇所」の「表示する一歩手前」で全てエスケープしてやればいいと思うよ。
もしかしたら言ってること間違ってるかもしれないけど、
その時はきっと誰かが突っ込んでくれるはずー。
追記
あと、寂しいことってなに?
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.
』『*
』『*?
』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『
』『a
』『<
』といったものです。
「検索する文字列:『egg
』 置換する文字列:『chicken
』」
などとすれば、正規表現を使わない置換と同じ効果になります。
なお、検索して検索文字列が当てはまることを「マッチする」と言います。
メタ文字に使われている文字を検索したい場合は、直前に『\
』を置きます。(これを「エスケープ」と呼びます。)
『.*?^$()[]{}
』などがメタ文字です。
『$100
』を検索したければ、『\$100
』とすればいいということになります。
(『\
』は環境によって、半角の『¥』『\』のどちらかになります。)
言語、ツール、モードなどによっては『@/#
』もエスケープが必要です。
また、『\
』自体は常にエスケープが必要です。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す |
* | 直前の文字を0回以上繰り返す |
+ | 直前の文字を1回以上繰り返す |
{n} | 直前の文字をn回繰り返す |
{n,} | 直前の文字をn回以上繰り返す |
{n,m} | 直前の文字をn〜m回繰り返す |
これらのメタ文字は「量指定子」といって、直前の文字の繰り返しを意味します。
『*
』は「任意の文字を0回以上繰り返す」とありますが、
「0回以上繰り返す」とは、「全く何もなくてもいいし、いくらあってもいい」という意味です。
よって、『?
』は「あってもなくてもいい」、『+
』は「1つ以上あればいい」と解釈できます。
『colou?r
』は『u
』があってもなくてもいいので「colorかcolour」ということになります。
『{n}
』は、たとえば『-{15}
』なら、「ハイフン(-)が15個続くもの」となります。
『-{10,}
』なら「ハイフン(-)が少なくともは10個続くもの(多いのはいくらでも)」、
『-{10,15}
』なら「ハイフン(-)が10〜15個続くもの」となります。
また、複数の文字を繰り返したい場合は括弧で囲みます。
『(Gang){2}Dance
』は『GangGangDance
』と同じ意味になります。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す(欲張り) |
* | 直前の文字を0回以上繰り返す(欲張り) |
+ | 直前の文字を1回以上繰り返す(欲張り) |
?? | 直前の文字を0回または1回繰り返す(非欲張り) |
*? | 直前の文字を0回以上繰り返す(非欲張り) |
+? | 直前の文字を1回以上繰り返す(非欲張り) |
「欲張り」とは、「なるべく多くの文字に適用しようとする」、
「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。
すると、検索する文字列が『a+
』なら『aaa bbb ccc
』、
検索する文字列が『a+?
』なら『aaa bbb ccc
』が置換対象となります。
(「すべてを検索/置換」する場合は当てはまりません)
「『a
』を1回以上繰り返す」ということは、『a
』でも『aa
』でも『aaa
』でもマッチすることになりますが、
「欲張り」かそうでないかで実際のマッチは変わってくるわけです。
文字クラス | 意味 |
---|---|
[abc] | a、b、cのいずれか |
[a-z] | a〜zのいずれか |
[^a] | a以外の文字(改行文字を含めaを除いた全て) |
[^a-z] | a〜z以外の文字(改行文字を含めa〜zを除いた全て) |
文字クラスは『a
』や『<
』などの代わりに文字の種類を指定するものです。
a〜eのどれかの1文字という指定をしたい場合に『[abcde]
』や『[a-e]
』といった指定ができます。
また、文字クラス内の最初に『^
』をつけて『[^abc]
』などとすれば、
「a、b、c以外の何の文字でもいい」とすることができます。
間違いやすいのが「そこにaもbもcも存在しなければいい」という意味ではないということです。
文字クラスは「なんらかの1文字の身代わり」なので、それは何か1文字を表しています。
『-
』は範囲を表すのに使用します。そのため、『[;-%]
』で「; - %のどれか」を表現することはできません。
『-
』を含める場合は必ず最初に持ってきます。すると『[-;%]
』という風になります。
「; - %以外の文字」としたいならば『[^-;%]
』とします。
『[
』や『]
』、『\
』を文字クラスに含めたい場合は直前に『\
』を置いてエスケープします。
「『[
』または『]
』」であれば『[\[\]]
』となります。
『^
』やその他の記号は先頭に置かなければいいので、エスケープの必要はありません。
『.
』は「改行以外のすべての文字」を表しています。
改行は『\n
』で表されるため、『.
』は『[^\n]
』と等価です。
(ただし、正規表現のモードによっては「改行も含めすべての文字」を表す場合もあります)
文字クラス | 意味 | 同等の表記 |
---|---|---|
\w | 記号や空白ではない文字すべて | [a-zA-Z0-9_] |
\W | 記号や空白ではない文字以外 | [^a-zA-Z0-9_] |
\d | 数字 | [0-9] |
\D | 数字以外 | [^0-9] |
\s | タブや改行など、空白類とされる文字 | [ \t\n\r\f\v] |
\S | タブや改行など、空白類とされる文字以外 | [^ \t\n\r\f\v] |
(*間違って『\s
』の同等の表記にも『^
』がついていたのを修正しました)
(『\t
』はタブ、『\v
』は垂直タブ、『\r
』はキャリッジリターン(CR、改行の一種)、『\f
』は改ページ)
これらは『[a-fA-F\d]
』のようにすることで、文字クラスのブラケット(角括弧)内に含めることができます。
「同等の表記」と書きましたが、文字をユニコードして扱うツールの場合は、上記が同等の表記にはならず、
たとえば『\d
』であれば漢数字が含まれてしまったりするので注意が必要です。
『(A|B)
』は「AまたはB」という意味です。(これを「選択」と呼びます)
『(A|B|C)
』なら「A、B、Cのどれか」という意味になります。
『(gray|grey)
』は『gr[ae]y
』とほぼ等価となります。
『[ae]
』は「1文字のaまたはb」という意味になるので結果的に、ほぼ同じ効果が得られるわけです。
(ただし、これはgrayとgreyの違いが1文字だけだったためで、そうでない場合はこうはなりません)
気をつけなければならないのは、その順番です。
『(Java|JavaScript)
』で検索すると、対象文字列内に存在する『Java
』と『JavaScript
』すべてマッチするように思えますが、
『JavaScript
』は選択肢の前(左)のほうにある『Java
』が当てはまってしまうため、
『Script
』部分にはマッチせず、『JavaScript
』というマッチになってしまいます。
選択では左側が優先されるので、『(JavaScript|Java)
』とすることでこの問題は防げます。
(言語、ツールによっては、この問題が起こらない=順番関係なく長いほうを適用しようとするものもあります)
メタ文字 | 意味 |
---|---|
^ | 行頭 |
$ | 行末 |
\b | 単語境界 |
\B | 単語境界以外 |
リテラル文字や文字クラスが「文字自体」にマッチするのと違い、アンカーは「位置」にマッチします。
検索する文字列が『^
』、置換する文字列が『>
』なら、「行頭に『>
』を挿入する」という意味になります。
単語境界とは、「単語を構成する文字=『\w
』に相当する文字」と「単語を構成しない文字=『\W
』に相当する文字」の間の位置のことです。
『regular expression.
』なら『^regular^ ^expression^.
』の4ヶ所に当てはまります。
『\b.*?\b
』とすれば単語すべてにマッチさせることができます。
しかし、「単語構成文字」が基準なので、『JavaScript
』は1単語でも、『L?K?O
』は1単語とは見なされません。
アンカーは位置にマッチするので、文字クラス内に含めることはできません。
『^
』や『$
』を文字クラスに含めても、その文字自体という意味になります。
つまり、『[^$]
』なら「行頭または行末」ではなくて、「『$
』文字以外」ということになります。
また、『\b
』は文字クラス内のみ、バックスペース文字を表す場合が多いようです。
正規表現には、大抵「大文字と小文字を無視する」というオプションがあります。
これが入っていないと「『to:
』で検索しても『To:
』にマッチしない」といったことが起こります。
言語、ツールによっては、正規表現の一部にのみ大文字と小文字を無視する機能があるものもあります。
例えばRubyでは『(?i:foo)
』という形式を使用できます。
『(
?i:Ruby) Python
』という表現なら、『ruby Python
』や『RuBy Python』にはマッチしますが、
『RUBY PYTHON
』にはマッチしない、ということになります。
括弧内に入れた文字列は、ある場所に記憶されます。(「キャプチャ」と呼びます)
これは『\n
』という表記を使って呼び出すことができます。(nは数字)
同じ単語が2連続で出てくるもの(『merry merry
』みたいなもの)を探すという場合、
『\b(\w+)\b \1
』とすることができます。(ここで使った『\1
』を「後方参照」と呼びます)
こうすると、『\1
』の部分は、『(\w+)
』を使ってマッチしたものと同じものがあるものとして解釈されることになります。
括弧を何個も使う場合は、左の括弧から順に『\1
』、『\2
』、『\3
』となります。
また、後方参照は置換文字列にも使うことができます。
つまり置換文字列内に『\1
』と書けば1番目の括弧、
『\2
』と書けば2番目の括弧でキャプチャされたものがそこに入ることになります。
この場合、言語、ツールによっては『\n
』ではなく『$n
』を使う場合もあるようです。
括弧は『(foo|bar)
』という選択や、『(humbert){2}
』というグループ化など、キャプチャ以外にも使われます。
そのため、キャプチャに使われた数字をわかりやすくするために、キャプチャしない括弧もあります。
それには『(?:foo)
』という表記を使います。
前の例であれば『(?:foo|bar)
』と『(?:humbert){2}
』になります。
「その位置の続くものを確認する」というのが「先読み」です。
対象文字列を『JavaScript Java Applet』として考えてみましょう。
『Java(?=Script)
』は「『Script
』が後に続く『Java
』」にマッチします。
『(?=Script)
』の部分が、「『Script
』が後に続くかどうか」をチェックしているので、
後ろに『Script
』が続かない単なる『Java
』にはマッチしません。
『(?=Script)
』の部分は「後に『Script
』が続く位置」にマッチしていることになります。
この例のマッチは『JavaScript Java Applet』となります。
逆に、『Java(?!Script)
』とすれば、「『Script
』が後に続かないかどうか」をチェックするので、
後ろに『Script
』が続かない単なる『Java
』にマッチさせることができます。
こちらは「否定先読み」と呼びます。
この例のマッチは『JavaScript Java Applet』となります。
言語、ツールによっては、「その位置の前にあるものを確認する」という「戻り読み」「否定戻り読み」がサポートされているものもあります。
(これは『(?<=foo)
』『(?<!=bar)
』という形で使います)
先読みや否定先読み、戻り読みなどをまとめて「前後読み」と呼びますが、
前後読みは位置にマッチするため、戻り読みは先読みとは通常書くべき位置が逆になります。
『(?<Mozilla )Firefox
』とすれば、『Mozilla
』に続く『Firefox
』のみにマッチします。
メタ文字 | 意味 |
---|---|
?+ | 直前の文字を0回または1回繰り返す(強欲) |
*+ | 直前の文字を0回以上繰り返す(強欲) |
++ | 直前の文字を1回以上繰り返す(強欲) |
上のほうで?、*、+は「欲張り」だと書きましたが、「欲張り」な量指定子も“ゆずる”ことがあります。
対象文字列が『"something"
』だとして、検索文字列『".*"
』はこれにマッチします。
しかし、強欲な量指定子『*+
』に置き換えて『".*+"
』とするとマッチしません。
これはなぜかというと、「欲張り」な量指定子を使った『.*
』の部分は、
最後の『"
』がなければ『something"
』にマッチすることになりますが、
正規表現の最後に『"
』があるために、対象文字列の最後の『"
』をゆずっているのです。
『.*+
』の部分が『something"
』にマッチしてしまい、
強欲な量指定子をサポートしていない言語、ツールでも、「アトミックなグループ」というものが使える場合があります。
アトミックなグループでは『(?>foo)
』という表記を使います。
『\w?+
』なら『(?>w+)
』、『\w*+
』なら『(?>w*)
』、『\w++
』なら『(?>w+)
』で代替できます。
『*
』の「直前の文字の0回以上の繰り返し」はよく気をつけないと、間違ったものにまでマッチしてしまいます。
リテラル文字と文字クラスは「文字自体」にマッチすると書きましたが、
『-*
』というような表現は、『-
』や『--------
』だけでなく、
なぜそうなるかというと、「0回以上」ということは「なくてもいい」ということだからです。
空文字列へのマッチは、実質上「位置」へのマッチと似たようなものになります。
検索文字列を『-*
』として一括置換すると、
『-
』や『--------
』が置換されるだけでなく、
『-
』が存在しないすべての場所に置換文字列が挿入されてしまうことになります。
正しい正規表現を書くためには、「どう書けばマッチするか」だけでなく、
「どういう場合にマッチしなければいいか」についても考えてみる必要があります。
*
』≒正規表現の『.*
』とありますが、これは厳密には微妙に違います。
ファイルグロブでは《*
》は「任意の文字を1回以上繰り返す」
つまり、1文字以上あればなんでもいいということになります。
この意味だと、《*.*
》は "foo." や ".bar" は当てはまりません。
しかし、「0回以上」であればマッチすることになります。
正規表現では「1回以上繰り返す」は、《+
》なので、
「任意の文字を1回以上繰り返す」は『.+』となります。
よって、《*.*
》とほぼ等価な表現は『.+\..+
』となります。
これは私の勘違いでした。miauさんご指摘ありがとうございます。
「*.*」は foo. にマッチするはずだし、.bar にマッチしないのは、「*」がドットファイルにマッチしないっていう特殊ルールがあるから・・・ですよね?
ファイルグロブの《*
》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。
《*.*
》とほぼ等価な表現は、正しくは『(?!\.).*\..*
』となります。
正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。
『\d{4}[-/]\d{1,2}[-/]\d{1,2}
』で日付と思われる文字列を検索することができますが、
これは『00-0000-00-00
』というものにもマッチしてしまいます。(『00-0000-00-00
』)
しかしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、
どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。
冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、
その辺りについては各言語、ツールの説明を参照してください。
本格的に学びたい場合はオライリーの「詳説 正規表現」がおすすめです。
(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)
また、PHP正規表現チェッカーですぐに試せるようです。
b:id:K-Onoさんの
について。
実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、
匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。
*2008-09-23 誤記の修正と、一部加筆しました。
*2008-09-24 ワイルドカードの記述を修正しました。
*2008-09-24 文字クラスの記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。
地下生活者の手遊び(tikani_nemuru_Mのダイアリー) が「にゃ」が目に付いて読みづらいので除去するUser Scriptを書いた。
前同様ブックマークレットを見たけど、Greasemonkeyのほうがいいと思ったので。
カタカナ化された語が多用されてるのも目につくのでそれも除去するようにした。
// ==UserScript== // @name No Flavour tikani_nemuru_M // @namespace http://anond.hatelabo.jp/20080918103850/gm/tikani_nemuru_M/nya // @include http://*.hatena.ne.jp/tikani_nemuru_M/* // ==/UserScript== document.body.innerHTML = document.body.innerHTML.replace(/にゃん([ねな])/g, 'なの$1') .replace(/個にゃん/g, '個人') .replace(/にゃんからね/g, 'なんだからね') .replace(/にゃ。/g, '。') .replace(/にゃー/g, 'ない') .replace(/にゃ/g, 'な');
// ==UserScript== // @name No Flavour tikani_nemuru_M // @namespace http://anond.hatelabo.jp/20080918103850/gm/tikani_nemuru_M/nya_katakana // @include http://*.hatena.ne.jp/tikani_nemuru_M/* // ==/UserScript== document.body.innerHTML = document.body.innerHTML.replace(/にゃん([ねな])/g, 'なの$1') .replace(/個にゃん/g, '個人') .replace(/にゃんからね/g, 'なんだからね') .replace(/にゃ。/g, '。') .replace(/にゃー/g, 'ない') .replace(/にゃ/g, 'な') .replace(/オモチロイ/g, '面白い') .replace(/スバラチイ/g, '素晴らしい') .replace(/ジンケン/g, '人権') .replace(/ニンゲン/g, '人間') .replace(/ニッポンジン/g, '日本人') .replace(/カガク/g, '科学') .replace(/シヤワセ/g, '幸せ') .replace(/キョウダイ/g, '兄弟') .replace(/ウサンクセエ/g, '胡散臭い') .replace(/メンドクセエ/g, '面倒臭い') .replace(/ワリイ/g, '悪い') .replace(/ソノトオリ/g, 'その通り') .replace(/ケコーン/g, '結婚') .replace(/ガクモン/g, '学問') .replace(/アッ?タリマエ/g, '当たり前') .replace(/アリガチ/g, '有りがち') .replace(/カンタン/g, '簡単') .replace(/ムツカシイ/g, '難しい') .replace(/イイカゲン/g, 'いい加減') .replace(/メリケン/g, 'アメリカ') .replace(/シャカイ/g, '社会') .replace(/キョーサン/g, '共産') .replace(/漢(オトコ)/g, '漢') .replace(/怖気(オゾケ)/g, '怖気') .replace(/ちかれた/g, '疲れた');
まあ、どのくらいの数の脆弱性オタがそういう彼女をゲットできるかは別にして、
「オタではまったくないんだが、しかし自分のオタ趣味を肯定的に黙認してくれて、
その上で全く知らない脆弱性の世界とはなんなのか、ちょっとだけ好奇心持ってる」
ような、ヲタの都合のいい妄想の中に出てきそうな彼女に、Webアプリ脆弱性のことを紹介するために
(要は「脱オタクファッションガイド」の正反対版だな。彼女に脆弱性を布教するのではなく
相互のコミュニケーションの入口として)
あくまで「入口」なので、時間的に過大な負担を伴うような図解などは避けたい。
できれば、秋葉原とか筑波とかから突っ込みがはいるような微妙な奴も避けたいのだけれど、つい選んでしまうかもしれない。
あと、いくら脆弱性的に基礎といっても古びを感じすぎるものは避けたい。
プログラム言語オタがCOBOLは外せないと言っても(いましたね)、それはちょっとさすがになあ、と思う。
そういう感じ。
彼女の設定は
セキュリティは専門でもなんでもないが、クロスサイトなんちゃらとか、SQLなんとかくらいは聞いたことがある。
サブカル度も低いが、頭はけっこう良い
という条件で。
まあ、なんで一番がSQLインジェクションじゃないんだよとも思うけれど、たいていのWebアプリに必ずあるという普遍性(日本語変か?)とか、文字コードネタのバリエーションとか、DOMが絡んでわくわくするとか、Same Origin Polic何じゃそりゃという点では外せないんだよなあ。長さも3文字だし。
ただ、ここでオタトーク全開にしてしまうと、彼女との関係が崩れるかも。
この情報過多な脆弱性について、どれだけさらりと、嫌味にならず濃すぎず、それでいて必要最小限の情報を彼女に
伝えられるかということは、オタ側の「真のコミュニケーション能力」の試験としてはいいタスクだろうと思う。
アレって典型的な「オタクが考える一般人に受け入れられそうな脆弱性(そうオタクが思い込んでいるだけ。実際は全然受け入れられない)」そのもの
という意見には半分賛成・半分反対なのだけれど、それを彼女にぶつけて確かめてみるには
一番よさそうな素材なんじゃないのかな。
「Webアプリの専門家からいえば、この二つはアプリネタじゃないと思うんだけど、率直に言ってどう?」って。
侵入先のファイルが見えてしまうというハッカー的なものへの憧憬と、これによる逮捕者がいるという法的な考証へのこだわりを
彼女に紹介するという意味ではいいなと思うのと、それに加えていかにもマニアックな
「よく眼にするけどあまり実害の思いつかない」/etc/passwd
「滅多に見られないけど、見つけたらゾクゾクする」/etc/shadow
の2ファイルをはじめてとして、オタ好きのするファイルを世界に公開(流出?うわ、日本語間違いが怖い)しているのが、紹介してみたい理由。
たぶん秋のDK収穫祭を見た彼女は「これCSRFだよね」と言ってくれるかもしれないが、そこが狙いといえば狙い。
そして、われらがアイドルはまちちゃんの紹介のおかげで、この脆弱性が日本で大人気になったこと、
「やっぱりWebアプリの脆弱性は個人情報DBなんかがあるサイトのものだよね」という話になったときに、そこで選ぶのは「SSIインジェクション」
でもいいのだけれど、そこでこっちを選んだのは、この脆弱性がふつーのホームページなどでも本当によく見つかるくせに、意外に問題視されていないレアっぽさが好きだから。
断腸の思いでJavaMailのAPIがTo欄やFrom欄に改行チェックいれているのに、なぜかSubject欄だけチェックがされてなくて脆弱性の原因になるかもって中途半端さが、どうしても俺の心をつかんでしまうのは、
その「チェックする」ということへの躊躇がいかにもオタ的だなあと思えてしまうから。
ほかのメールAPIでもチェックが不十分なものはあるし、そもそもsendmail呼び出すときはチェックはアプリ側でやるしかないとは思うけれど、一方でこれが
Microsoftだったら意外にきっちりセキュアに仕上げてしまうだろうとも思う。
なのに、安全なAPIを使わずに(知らずに?)脆弱性を混入してしまうというあたり、どうしても
「自分の過去から知っている書き方でないと書けないプログラマ」としては、たとえ脆弱性混入した奴がそういうキャラでなかったとしても、
親近感を禁じ得ない。脆弱性の高危険度と合わせて、そんなことを彼女に話してみたい。
今の若年層でディレクトリリスティングによる個人情報漏洩事件をリアルタイムで見聞きしている人はそんなにいないと思うのだけれど、だから紹介してみたい。
SQLインジェクションよりも前の段階で、個人情報の漏洩規模とかはこの脆弱性で頂点に達していたとも言えて、
こういう危険の高さが経産省あたりの個人情報保護ガイドラインにのっていたり、というのは、
別に俺自身がなんらそこに貢献してなくとも、なんとなく脆弱性好きとしては不思議に誇らしいし、
いわゆるインジェクション系でしか脆弱性を知らない彼女には見せてあげたいなと思う。
UNIXシェルの「セミコロン」あるいは「バッククォート」をオタとして教えたい、というお節介焼きから見せる、ということではなくて。
「ホワイトリストで対策すると安全なんだけど敢えてエスケープを究めたいマニア」的な感覚がオタには共通してあるのかなということを感じていて、
だからこそ佐名木版『セキュアWebプログラミングTips集』は20ページ以上もかけてOSコマンドインジェクション対策の説明しているのは、エスケープ手法以外ではあり得なかったとも思う。
「侵入先のコンピュータでコードが動いてこそなんぼ」というクラッカーの感覚が今日さらに強まっているとするなら、その「クラッカーの気分」の
源はOSコマンドインジェクションにあったんじゃないか、という、そんな理屈はかけらも口にせずに、
単純に楽しんでもらえるかどうかを見てみたい。
これは地雷だよなあ。昔だったら筑波方面、今だったら秋葉原方面から火のような「hiddenは危険脳」ブクマがつくか否か、そこのスリルを味わってみたいなあ。
こういう昔のIPA風味の解説をこういうかたちでブログ化して、それが非オタに受け入れられるか
突っ込みを誘発するか、というのを見てみたい。
9本まではあっさり決まったんだけど10本目は空白でもいいかな、などと思いつつ、便宜的にSQLインジェクションを選んだ。
XSSから始まってSQLインジェクションで終わるのもそれなりに収まりはいいだろうし、カカクコム以降のWebアプリ脆弱性時代の原動力と
なった脆弱性でもあるし、紹介する価値はあるのだろうけど、もっと他にいい脆弱性パターンがありそうな気もする。
というわけで、俺のこういう意図にそって、もっといい10パターン目はこんなのどうよ、というのがあったら
教えてください。
「駄目だこの増田は。俺がちゃんとしたリストを作ってやる」というのは大歓迎。
Inspired by アニオタが非オタの彼女にアニメ世界を軽く紹介するための10本
横レスだけど。
簡単すぎて多分ここで説明しても無意味だとおもうよ。
インジェクションに対応してるっていってもさ・・・
例えば`(バッククオート)とかに対応してなかったりするところ多いじゃん。
どうせエスケープしなかったら'なんてSQLエラーになって登録もできないんだから、
登録しようとしたら自然に覚えるよ。
別に開き直ってるわけじゃななくて、さ、、、、
なんていうんだろ。
例えばタグをエスケープしないと攻撃されるっていう概念すら無かった時代があったわけですよ。
検索窓にSQLつっこんで情報引き出すなんていうのが簡単だった時代もあったわけですよ。
そういう体験をしてるかしてないかの問題かな。
既知の脅威なんてたいした脅威じゃないとおもうんだよね。
そんなの作ろうとすれば必ず触れる情報だもの。
そういう対応をせずにいれば、巡回BOTが必ず攻撃しかけてくれるよ。
むしろそういうレベルで攻撃されて学習してくれた方がその後を考えればその人のためだし、みんなのためだと思うよ。
子供には大きな火傷をするまえに暖かく成り始めたストーブに触らせておけってね。
どうせ守りきれないんだから過保護はよくないよ。
長いけど要するに
不完全でもとりあえず作って公開する、ってのは意味があること。
これにはものすごく同意。
けど、元増田みたいに単なるインジェクションすら分からんと開き直られると、ちょっとねえ。。。
難しくないですよ。インジェクション。例えばHTMLなら、タグの一部として解釈される<や>のキャラクタを<や>に置き換えろってだけ。もう理解したでしょ?応用で、SQLの文字列として解釈される部分は、' というキャラクタは文字列の終端として解釈されるのでエスケープしましょうね。ってだけ。
あと処理系のバグは定期的なセキュリティアップデートで埋める。
簡単でしょ?
簡単な文字列操作を覚えたプログラマなら誰だってすぐに実践できますよ。抜けがあったってしょうがないと思うけど、穴を作らないようにするセキュリティ意識が大事。
だとしたらなぜ君は初心者を萎縮させるようなことばかりいうんだい?
こんなんで萎縮するほうがおかしい。インジェクションくらい簡単なことを調べようともしないで萎縮するような人はどうせできないよ。普通にプログラミングをローカルでちょっとやれば理解できる話。それも知らずに公開サービスとか、あきらかに順序がおかしい。
セキュリティアップデートを毎回やらない人はどうみても駄目だよ。
だいいち、誰が萎縮してるんだ?わら人形たたきじゃねえの?
自分が細かいことを気にしたくないだけだろ?初心者じゃないなら、ちったあ気にしろ。
目標にするのは勝手だけど、自称初心者のうちに公開してしまうのはどうみてもよろしくない。せめてXSSくらい理解しろと。文字列をエスケープしましょうね、ってだけだから。簡単だから。至極あたりまえの理屈だよね?
インターネットに触れるなとは言ってない。サーバーにアップロードすれば十分でしょ。公開しなきゃいい。
公開がイントラ上でもなんでもいいけど、
イントラに公開するのなら、勝手にやればいいじゃん。どんどんやればいいと思うよ。
穴のないものができあがるまで外に出すなと言う言いぶんはさすがに酷いとおもうよ。
んなことは一言も書いてない。
こういう言い方が君には煽っていると感じるのかい?
いや、元増田の「分からんから開き直る」という態度はアマチュアでもプロでも害悪でしかないぞ。つーか人としてどうよ。おまけに自分はリスクを取らず増田で無知な人を煽ってるのが卑怯すぎる。
というか、Webでサービスを公開しなくてもプログラミングなんて十分学べる。
今では教科書だって充実している。手元で動かしてみるのも良いし、ソースをブログに貼り付けて反応を待つのも良いし、何でもありだ。ビバインターネット。情報化社会。
むしろ、サービスを公開しなきゃプログラミングじゃないという印象を振りまかれることの方が迷惑。
あとは実際に必要な学習のコストだけど、さっきまでそこで書いてたんだが、
HTMLやシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。
これくらいなら、簡単にできるでしょ?一応、高木浩光が言ってることを極限まで簡単にしてみたんだが。
オウフ。そーかCSRF… まあそれこそ初心者にそこまで求めなくても。
最低限、XSS等の対策のために、文字列のエスケープ箇所だけ分かってればいいんじゃないかなー。
…めんどくさいのう。ワンタイムトークンというのはわりと「余計な」概念だし。
当のひろみちゅは
http://takagi-hiromitsu.jp/diary/20060409.html
みたいな事いってるし
HTMLやシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。
あとは処理系とApacheのセキュリティアップデートをこまめにやっとけ。
Webでメシを食うわけじゃなきゃ、これで十分。
本当にたったこれだけでいいんだから、とっとと覚えてからサービス作れって話ですよ。
なんでそう煽る人が多いんだろう。全然難しくないから!
HTMLやシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。
あとは処理系とApacheのセキュリティアップデートをこまめにやっとけ。
Webでメシを食うわけじゃなきゃ、これで十分。
みんな、どのくらいまでセキュリティ対策してる?
俺の場合は、、、
使用するパラメータ(標準入力(POST)、環境変数、クエリストリング)を全てチェックして、
必要に応じてパラメータを削除/エスケープ/クォート/サニタイズすればいいのかなあなんて、思ってるんだけど、
実際のところ、どこまでやればいいのか検討つかないや。
DOS攻撃にそなえて、アクセスしてきたIPアドレスは常に解析して、動的にアクセス拒否する必要があるのかとか、
アクセス集中にそなえて動的コンテンツをキャッシュするだの、サーバのクラスタリングだの、ロードバランサー設置とか、
バックアップは何分おきにやるのかとか、
午前三時にメンテナンスのために作業するのかとか、
地震地帯を避けつつ、法律問題を回避できる国で、税金とエネルギーの安い土地にサーバルームを作って、
サーバを鎖で縛って、電磁波遮断して、部屋にかぎ掛けて、クーラー効かせて、元特殊部隊の人をガードマンに雇って、
最終的にはサーバを核シェルターに入れて、あらゆる攻撃から守らなくちゃいけないのかなあ。
ああ、憂鬱だ。
http://anond.hatelabo.jp/20071030034313 の二番煎じ
あまりのアホさに、作ってて気が狂いかけた
方針
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Reflection; using Microsoft.CSharp; delegate void ConvertTemplateDelegate(TextWriter tw, Dictionary<object, object> args); static class TemplateGenerator { public static ConvertTemplateDelegate Generate(string code) { CompilerParameters param = new CompilerParameters(); param.GenerateInMemory = true; param.ReferencedAssemblies.Add("System.Web.dll"); CompilerResults rs = new CSharpCodeProvider().CompileAssemblyFromSource(param, ParseTemplate(code)); if (0 < rs.Errors.Count) { StringWriter sw = new StringWriter(); sw.WriteLine("Compile Error..."); foreach (CompilerError err in rs.Errors) sw.WriteLine(err.ToString()); throw new Exception(sw.ToString()); } return (ConvertTemplateDelegate) Delegate.CreateDelegate(typeof(ConvertTemplateDelegate), rs.CompiledAssembly.GetType("Template", true).GetMethod("Convert")); } private static string ParseTemplate(string code) { using (StringWriter sw = new StringWriter()) { sw.WriteLine("using System; using System.Collections.Generic; using System.IO; using System.Web;"); sw.WriteLine("public static class Template {"); sw.WriteLine("public static void Convert(TextWriter tw, Dictionary<object, object> args) {"); int index = 0; while (0 <= index && index < code.Length) { int i = code.IndexOf("<%", index); sw.WriteLine("tw.Write(\"{0}\");", EscapeString(i < 0 ? code.Substring(index) : code.Substring(index, i - index))); if (0 <= i) { i += 2; int i2 = code.IndexOf("%>", i); if (0 <= i2) { string cc = code.Substring(i, i2 - i); if (cc.StartsWith("=")) sw.WriteLine("tw.Write(HttpUtility.HtmlEncode(\"\"+({0})));", cc.Substring(1)); else sw.WriteLine(cc); i = i2 + 2; } } index = i; } sw.WriteLine("}}"); return sw.ToString(); } } private static string EscapeString(string code) { return code.Replace("\\", "\\e").Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\\e", "\\\\"); } }
サンプル C# コード。ためしにテンプレートから Xml 生成して、標準出力してみる。
class Program { static void Main(string[] args) { ConvertTemplateDelegate func = TemplateGenerator.Generate(TemplateEngine.Resource1.template); using (StringWriter sw = new StringWriter()) { Dictionary<object, object> arg = new Dictionary<object, object>(); arg["title"] = "template sample"; arg["data"] = new string[] { "foo", "fooo", "<strong>foooooooooo!</strong>" }; func(sw, arg); Console.WriteLine(sw); } } }
サンプルテンプレート
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title><%= args["title"] %></title> </head> <body> <h1><%= args["title"] %></h1> <table> <% string[] data = (string[]) args["data"]; %> <% for(int i = 0; i < data.Length; i++) { %> <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>"> <td><%= i %></td> <td><%= data[i] %></td> </tr> <% } %> </table> </body> </html>
出力例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>template sample</title> </head> <body> <h1>template sample</h1> <table> <tr bgcolor="#FFCCCC"> <td>0</td> <td>foo</td> </tr> <tr bgcolor="#CCCCFF"> <td>1</td> <td>fooo</td> </tr> <tr bgcolor="#FFCCCC"> <td>2</td> <td><strong>foooooooooo!</strong></td> </tr> </table> </body> </html>
CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。
素直に ASP.NET 使ったほうが楽だと直感した。
あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw
やってしまった・・・。
方針:
package SixtyLinesTemplate; use strict; use warnings; our $VERSION = '0.01'; sub convert { return unless defined(my $str = shift); $str =~ s{&}{&}gso; $str =~ s{<}{<}gso; $str =~ s{>}{>}gso; $str =~ s{\"}{"}gso; $str; } sub include_template { my $tmpl = shift; my %c = %{+shift}; eval convert_template($tmpl); die $@ if $@; } sub convert_template { my $tmpl = shift; my $cache = $tmpl.'.cache'; return scalar do { open my ($FH) , $cache; local $/; <$FH> } if ( -f $cache && (stat($tmpl))[9] <= (stat($cache))[9] ); my $out = do { open my ($FH) , $tmpl; local $/; <$FH> }; $out =~ tr/()/\x28\x29/; $out =~ s/\[%\s*(foreach|if|unless|end)\s*(.+?)\s*{?\s*%\]/");".(lc($1) eq 'end' ? '} print q(' : "$1 $2 { print q(")/ige; $out =~ s/\[%(.+?)%\]/);print $1; print q(/g; $out =~ s/\[#(.+?)#\]/);print SixtyLinesTemplate::convert($1); print q(/g; $out = 'print q('.$out.');'; open my ($FH) , '>' , $cache; print $FH $out; $out; } 1;
サンプルコード:
use SixtyLinesTemplate; my $context = { 'title' => 'Example', 'list' => [10,'<A&B>'] }; SixtyLinesTemplate::include_template('template.tmpl',$context);
サンプルテンプレート:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>[# $c{title} #]</title> </head> <body> <h1>[# $c{title} #]</h1> <table> [% foreach my $i (0..@{$c{list}}-1) %] <tr bgcolor="[% $i % 2 ? '#FFCCCC' : '#CCCCFF' %]"> <td>[% $i %]</td> <td>[# $c{list}[$i] #]</td> </tr> [% end %] </table> </body> </html>
出力例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Example</title> </head> <body> <h1>Example</h1> <table> <tr bgcolor="#CCCCFF"> <td>0</td> <td>10</td> </tr> <tr bgcolor="#FFCCCC"> <td>1</td> <td><A&amp;B></td> </tr> </table> </body> </html>
foreachんところが汚く見えるかもしれませんが、あれは添え字を取ろうとするとああなるんでご勘弁を。
普通にループするだけならforeach my $item (@$c{title}) でいけますゆえ。
あと存在しない変数とか使うと死んだり警告でたりするのでevalの前にno strictとno warningsをやった方がいいかもねぇ。
って何まじめに検証してんだ俺・・・orz
追記:
SixtyじゃなくてFortyだね。恥ずかし!
追追記:
でも&amp;の奴はちゃんと書いてるんだけども投稿すると勝手にエスケープされてしまってるんだよね。何でだろ?
ちなみにこのconvertの処理はCGI::Utilから拝借しました。
なぜに「htmlのエンティティ」で検索しなかったのかが謎だ。