はてなキーワード: スクリプトとは
いや別にそういう風に教える分には良いのだけど。
自己採点は60点? Hatena Inc.が過ごしたシリコンバレーでの1年間:インタビュー - CNET Japan
このインタビューみてて、いままではてなワールドってなんだろーなーと検討もつかなかったんだけどピンときてしまった。
予想する。
はてなワールドはGUIベースの自己認識が可能な状態でのネットブラウジングだ。
以前はみんなそこを目指してきた。
自己の存在が視認できる状態での行動。
RPGも初期の迷路のころは自己視点だけだった。これがWEBブラウジングだ。
RPG2.0とやらはドラクエのように自分が「どれ」だか認識できた状態でアクションをおこす。
もちろんこの傾向はネットにもあった。
卑近としてはセカンドライフもそうだ。
だが、はてなはおそらくセカンドライフのように自己のワールド内にコンテンツを誘致しようとせずにいままでどおり既存のコンテンツを利用するだろう。
ページ内を歩き回るスクリプトがあったように。
はてなの技術レベルはDBもmySQLレベル育ちだしコンパイルできるような言語の土壌があまりない。
MMOのようなワールドの創出はあまり考えられない。
だが、すでにぼくらはその予兆をはてなのテストにより見て取ることができた。
ブログペットが自分のブログから出れない時代はここで終わるかもしれない。
なんてことを思った。だとしたら面白い。リリースが楽しみになってきた。
はてなワールドって何だと思う?
にゃー。
めも。
HTMLに見た目を指定することを書いてはいけないとよく言われるが、それだけでなく、user agentの動作を指示することにも慎重でなければならない。動作を指示する記述とは、例えばtarget属性や、HTML 5のlink typeのprefetch、sidebar、nofollowなどのことである。
これらがあまり有用でないのはuser agentに柔軟な対応をとる余地を与えないということが一番の理由である(当然ながらuser agentにはIEやFirefoxなどの「ウェブブラウザ」だけでなく、検索エンジンのロボットやダウンロードツールなども含まれる)。target属性について考えよう。あなたは何故そのリソースを新しいウィンドウで表示して欲しいと思うのだろう。自分とは違う人や組織によって作成されたリソースだからだろうか。ならば「自分とは違う人や組織によって作成されたリソースだ」と書くだけで良い。user agentは新しいウィンドウで表示するかもしれないし、「別の人によって作成されたリソースです」とアラートを出すかもしれない。あるいは本文と平行して見るべき図だからだろうか。ならば「本文と平行して見るべき図だ」と書くだけで良い。user agentはユーザの設定によって新しいウィンドウで表示したり、サイドバーに表示したりするだろう。「sidebar」についても同じようなことが言える。サイドバーに表示して欲しいのは何故だろう。もしそのリソースが目次ならば、目次と書くだけで良い。(「nofollow」がおかしいというのはHTML 5を策定している人たちもわかっていて、ただ互換性を考慮したようだ。しかし、厳密に言えば、"nofollow"はlink typeとして実装するべきものかどうか疑わしい。一例ではあるが、私のようなiTunesユーザなら、<a rating="0">などと書くことも容易に思いつくだろう)
このように、著者は自分が望む動作ではなくその動作を望む理由だけを書くのが理想的なのである。
付け加えれば、<a href="javascript:...">という記述も不適切だ。これはしばしばJavaScriptが無効な環境にあるユーザに混乱をもたらすとして批判されるが、一番の問題はスクリプトのスイッチは論理的にはリンクではなくボタンだということだ。これはtarget属性や不適切なlink typeでリンクの動作を規定しようとすることと同じ誤解が原因だと思われる。リンクは原理的に動作のスイッチではなく、あくまでリンクなのだ。従って、見た目でそれがa要素かbutton要素かを決めるべきではない。見た目はスタイルシートで指定しよう。
理想的には、クライアントサイドスクリプトも今ほど必要ではないのかもしれない。HTMLのフォームの仕様とuser agentのUIがここまで貧弱でなければ、今日我々がスクリプトでやっている、合理的で、ただの飾りではないことの90%以上はHTMLだけで記述できるのではないだろうか。ウェブのバージョンがいくつになればそれが可能になるのかはわからないが……。
画像とか動画とか音声とかにHTMLを埋め込むことができたら楽しそうじゃね? HTMLに画像や動画を埋め込むんじゃなくて。逆に。写真やイラストを展示するサイトでありがちなのが「リンクはHTMLにお願いします」ってやつで、画像に著作権表示とかコメントとかを添えるには現状そうするしかない。でもやっぱり画像そのものに書き込みたいだろうし、リンクするほうもリンクしたいリソースは画像そのものであって、「おまけ」のほうではないんだよね。俺も友達のバンドのサイト作ったことがあるんだけど、MP3のタグじゃ貧弱だし、ハイパーリンクも使えないし。そういうのもうある?
自分もwebからは遠かった人間なので(最近ちょっと足突っ込み中)、ちやほやされるはてなみたいな会社がうらやましいなーとか思ってた。
スクリプトとかでごにょごにょするだけでどうにかなるんだものプログラムというよりはDTPだよね。
出版広告からの転身が多いのもうなずけるよ。
多くても数人でやるような規模だからね。
でも、多くのエンジニアはWEB業界じゃないところで働いているんじゃない?
いや、そもそもコンピュータと関係ないところでわれわれの生活を支えてくれる人の方が多いだろ。
プログラマがどうこういったって、どっかのだれかがちゃんと光ファイバーを融接する技術をもっていなかったら通信もろくにできないわけだし、
定食屋のおじさんの基礎技術がなかったら今日一日暗澹たる気持ちのまま腹をすかせてすごさなきゃいけない。
>> kn1967
Unix系に関しては必ずしもファイルタイプを拡張子で判別しません。たしかにKDEやGnome, Firefoxは拡張子で判別しているふしがありますが、それはあくまでもアプリケーションの機能です。OSの機能としては、先頭のマジックナンバーで判断するので、たとえPerlのスクリプトをhogehoge.cという拡張子で保存したとしても、実行権限さえあれば ./hogehoge.c で実行することができます。
>> kira2007(質問主)
「HTMLソースが混じったperl」って何のことでしょうか?
もしかしてshtmlのことですか?
なに、君以外の投稿はただのスクリプトだ。気にすんな。
最近どうも増田が見にくいのは割とどうでもよさげなトラックバックがいっぱいあるからじゃないだろうか、と思って書いた。
トラックバックを見たい場合は元記事の右下のトラックバックをクリックする。
// ==UserScript== // @name kill masuda TB // @description kill masuda TB // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/?page=* // ==/UserScript== (function(){ divs = document.getElementsByTagName('div'); for(i = 0; i < divs.length; ++i){ if(divs[i].getAttribute('class') == 'section'){ if(divs[i].getElementsByTagName('h3')[0].innerHTML.match(/Re:/) || divs[i].innerHTML.match(/href=\"http:\/\/anond/) || divs[i].innerHTML.match(/anond:\d{14}/)){ divs[i].innerHTML = ''; } } } })();
割とどうでもよさげなトラックバック、きみが消えたらますだががらんとしちゃったよ……。
2chができた1999年頃、丁度個人ニュースサイトや個人日記サイトも盛り上がり始めたころだった。
「個人ニュースサイトなんて不要だ」「すぐいらなくなる」なんて声も一部にあったけれど、
それどころか年を追うごとにますます増えていく一方だ
。
昔はごく一部の個人ニュースサイトだけが月数万ヒットー10数万ヒットしていて、大手と呼ばれていた。
今じゃ、月10万単位のアクセスのあるサイトが無数に存在する。
単純に市場が大きくなったからだ。
7-8年前よりも、ずっと沢山の人がネットを見るようになった。
だから個人ニュースサイトの需要も、ますます伸びてきているんだ。
ちなみに当時はRSSという仕組みがなかったら、個人ニュースサイトの更新情報を追いかける「アンテナ」も流行した。
今は「はてなアンテナ」があり、誰でも簡単に使えるから、
昔よりも沢山の人が、より多くのニュースサイトを横断的に見ることができるようになったんだ。
え? 前置きはいいからアクセスを増やす方法を教えてくれって?
じゃあ手短に。
2 独自の切り口と、品質絶対主義
1 美しさは人を惹きつける。
だから自分のサイトのデザインは、シンプルで美しくする必要がある。
webページを見て、メニューが複雑だったり、ごちゃごちゃと小さな文字や広告が入り乱れていない?
大きければいいというものではないよ。サイズを小さくしてみたり、あるいは試しに外してしまいなよ。
かつ記事の内容に合致した商品リンクを試してみてはどうだろう。
2 どんなジャンルを扱っているの? 得意分野は何?
それがお客さんにはっきりわかる必要があるよ。
そして何より、記事の品質が全てだ。
つまらないネタ記事を数合わせの為に入れるのは絶対に止めるんだ。
自分が「これは」と思った記事だけを登録すること。
そして、見ている人にとって役に立つ、面白い情報であることを意識した記事にすること。
気の効いたコメントが思い浮かばなかったら、綺麗な画像を載せればいいんだ。
有名なニュースサイトは、いつも美しい写真をアップしているよね。
3 どんな人が管理人なの? もし本気でやるつもりなら、簡単な自己紹介ページを作っておくといいよ。
管理人の人となりがわかると、お客さんは何度も足を運びたくなるよ。
顔文字というのは、上手く使えば驚くほど人の感性に訴えることができるんだ。
2chでキタ━━━━(゜∀゜)━━━━!!などのアスキーアートが常にコピペされているのは、
それが人の心を直撃するからなんだよ。
参考サイトはこちら
http://matsucon.net/material/dic/kao_11.html
【おまけ】
アクセスを増やしたかったら、当然宣伝が必要だよね。
どうやって宣伝しようか?
まず、自分のサイトが検索エンジンに登録されているか確認すること。
自サイト名で検索してみよう、1番目に表示されたかな?
もしサイト名が無個性な名前だったら、必ずオリジナリティのある名前に変えたほうがいいよ。
検索で出るようになったら、次はリンクを貼ってもらうこと。大手ニュースサイトで記事が紹介されたり、
リンクページに載れば必ず大量のアクセスが来るよ。そのお客さんを掴むんだ。
ただ「相互リンクの依頼お断り」の所も多いから、注意してね。
Google AdWordsみたいに有料の広告を使ったことはある?
試しに使ってみたらどうだろう。自分が広告を出す立場になると、見えてくるものがあるはずだよ。
最後に、記事の更新に費やす時間は1日1時間以内にすること!!
ダラダラと長時間やっても、効率は上がらないよ。それよりちょっとデジカメ持って外に出よう。
短い時間の中で工夫しようとすると、どんどん新しいツールや仕組みを使う必要に迫られるから、
かえって自分の能力を高めることができるんだ。ショートカットキー1つ知っているかどうかだって大事だよ。
例えばプログラムを書ける人は、あなたが必死になって手動で収拾しているニュースを、
道具の使い方を覚える事が、自分の時間を増やしてくれるんだよ。
だからニュースを集める時間の他に、自分がスキルアップするための時間を毎日確保しよう。
そーいえばたまに自分のとこの記事もニュースサイトにリンクされるけど、アクセス解析辿ってみると本気でつまらないニュースサイトいっぱいあるのな。
情報がすでにどこかで見たような孫引き曾孫引きだらけ。 コメントもとりあえず語尾にwつけときゃツッコミになってると思ってるような、陳腐で見識の浅さを露呈させるようなものばかり。
何のためにやってるんだかさっぱりわかんねえ。
俺も同じようなこと思ってて、あまりにもこれら弱小ニュースサイト(笑)がくだらなすぎるのでスクリプトで再現してみようと思ったら余裕で出来てしまった過去があるよ。
そしてあまりにも再現度が高いので同じようにつまらなく、さっぱりアクセスが増えない罠。
やっぱ孫引きだけで構成されたニュースサイトって全然人来ないのね。俺はスクリプトを自動で走らせて更新してるから別になんとも思わないが、毎日せっせと孫引きを頑張って「バロスwwww」とかコメントつけて、それで得られるのがあの程度だったらそりゃ「ぜんぜんアクセスねえ・・・」とぼやきたくもなるだろうなぁ。
まぁそのなんだ、彼らもいつかきっと気付くでしょう。
自分達が青春の貴重な数時間を過ごしている「巡回」と「更新」とやらが、たった数百行のPerlスクリプトで実現できてしまう程度のものだということにw
……気付けないなら?
http://anond.hatelabo.jp/20070612072957
↑はコメントアウトを外すだけで、いつ使えなくなるかちょっとアレ。
というわけでせっかくだから各記事のタイトルの横にリンクを追加するようにした。
下のidをmasudaから自分のものに変えて使う。
タイトルの横に ← が追加されるので、クリックして言及しまくればいいんじゃないでしょうか。
// ==UserScript== // @name add masuda reference button // @description add masuda reference button // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/* // @exclude http://anond.hatelabo.jp/*/edit* // ==/UserScript== (function(){ id = 'masuda'; titles = document.getElementsByTagName('h3'); for(i = 0; i < titles.length; ++i){ d = titles[i].innerHTML.match(/\d{14}/); titles[i].innerHTML += '<a href="http://anond.hatelabo.jp/' + id + '/edit?title=Re: [anond:' + d + ':title]" class="edit">\u2190</a>'; } })();
20070629230000改定
20070702125800バグ発見:スクリプト中にある「&&」が、「&&」になっている。増田の仕様らしい。
20070827224900改定
// ==UserScript== // @name anond pickup // @namespace http://anond.hatelabo.jp/20070608230645 // @description pickup trackback tree top section at Hatelabo::AnonymousDiary // @include http://anond.hatelabo.jp/* // ==/UserScript== (function() { var threshold_bm = 1; var threshold_tb = 1; var ignoreList = { "/20070801172335": 33, "/20070806163721": 10, }; var firstPager_l = document.evaluate("//div[@class='pager-l']",document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue; function Hide(){} Hide.prototype.setup = function() { this.style = document.createElement("style"); this.style.id = "hide"; this.style.type = "text/css"; document.getElementsByTagName("head")[0].appendChild(this.style); var self = this; this.a = new Object(); this.a.visible = document.createElement("a"); this.a.visible.id = "visible"; this.a.visible.href = "#"; this.a.visible.innerHTML = "visible hide section"; // this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: block}';document.getElementById('visible').style.display = 'none';document.getElementById('unvisible').style.display = 'inline';"); this.a.visible.addEventListener("click", function(){self.visible()}, false); firstPager_l.parentNode.insertBefore(this.a.visible, firstPager_l); this.a.unvisible = document.createElement("a"); this.a.unvisible.id = "unvisible"; this.a.unvisible.href = "#"; this.a.unvisible.innerHTML = "unvisible hide section"; // this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: none}';document.getElementById('visible').style.display = 'inline';document.getElementById('unvisible').style.display = 'none';"); this.a.unvisible.addEventListener("click", function(){self.unvisible()}, false); firstPager_l.parentNode.insertBefore(this.a.unvisible, firstPager_l); if (GM_getValue("visible", 0)) { this.visible(); } else { this.unvisible(); } } Hide.prototype.visible = function() { this.style.innerHTML = "div.hide {display: block}"; this.a.visible.style.display = "none"; this.a.unvisible.style.display = "inline"; GM_setValue("visible", 1); } Hide.prototype.unvisible = function() { this.style.innerHTML = "div.hide {display: none}"; this.a.visible.style.display = "inline"; this.a.unvisible.style.display = "none"; GM_setValue("visible", 0); } Hide.prototype.append = function(section) { if (section.className.match(/hide/)) { return; } section.className += " hide"; } Hide.prototype.clear = function(section) { section.className = section.className.replace(/ hide/g, ""); } Hide.prototype.is = function(section) { return section.className.match(/hide/); } var hide = new Hide(); hide.setup(); var target = document.evaluate( "//div[@class='section' and child::*[not(@class='sectionfooter') and descendant::a[starts-with(@href,'http://anond.hatelabo.jp/2') or starts-with(@href,'/2') and not(child::span[@class='sanchor'])]]]", document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var i=0; i<target.snapshotLength; i++) { hide.append(target.snapshotItem(i)); } var tbs = document.evaluate( "//p[@class='sectionfooter']/a[2]", document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var i=0; i<tbs.snapshotLength; i++) { var tb = tbs.snapshotItem(i); if (tb.innerHTML == "\u30c8\u30e9\u30c3\u30af\u30d0\u30c3\u30af(0)") { // hide.append(tb.parentNode.parentNode); bookmark(tb, 0); } else if (! hide.is(tb.parentNode.parentNode)) { trackback(tb, 1); } else { bookmark(tb, 1); } } function trackback(tb, callback) { GM_xmlhttpRequest({ method: "GET", url: "http://anond.hatelabo.jp/" + tb.pathname.match(/\d{14}/), onload: function(result) { var link = result.responseText.match(/<a name="tb">(.|\s)*/)[0].match(/<li>\s*<a href="http:\/\/anond.hatelabo.jp\/\d{14}"/g); var n = link.length; for (var l in link) { var m = "/" + link[l].match(/\d{14}/); if (m in ignoreList) { n -= ignoreList[m]; } } if (n < threshold_tb) { tb.innerHTML = tb.innerHTML.replace(/\)$/, "/"+n+")"); if (callback) { bookmark(tb); } } else { tb.innerHTML = tb.innerHTML.replace(/\)$/, '/<span style="color: red;">'+n+"</span>)"); } } }); } function bookmark(tb, callback){ GM_xmlhttpRequest({ method: "GET", url: "http://b.hatena.ne.jp/entry/rss/http://anond.hatelabo.jp/" + tb.pathname.match(/\d{14}/), onload: function(result) { var r = result.responseText.match(/<rdf:li rdf:resource=/g); if (r && r.length >= threshold_bm){ hide.clear(tb.parentNode.parentNode); if (callback) { trackback(tb); } } else { hide.append(tb.parentNode.parentNode); } } }); } })();
今はスッキリしているのは古いやつ
/// ==UserScript== // @name anond pickup // @namespace http://anond.hatelabo.jp/20070608230645 // @description pickup trackback tree top section at Hatelabo::AnonymousDiary // @include http://anond.hatelabo.jp/*?page=* // ==/UserScript== (function() { var target = document.evaluate( "//div[@class='section' and child::*[not(@class='sectionfooter') and descendant::a[starts-with(@href,'http://anond.hatelabo.jp/2') or starts-with(@href,'/2') and not(child::span[@class='sanchor'])]]]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i=0; i<target.snapshotLength; i++) { target.snapshotItem(i).style.display = "none"; } var trackback = document.evaluate( "//p[@class='sectionfooter']/a[2]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i=0; i<trackback.snapshotLength; i++) { if (trackback.snapshotItem(i).innerHTML == "\u30c8\u30e9\u30c3\u30af\u30d0\u30c3\u30af(0)") { trackback.snapshotItem(i).parentNode.parentNode.style.display = "none"; } else if (trackback.snapshotItem(i).parentNode.parentNode.style.display != "none") { count(trackback.snapshotItem(i)); } } function count(tb) { GM_xmlhttpRequest({ method: "GET", url: "http://anond.hatelabo.jp/" + tb.getAttribute("href").match(/[0-9]{14}/), onload: function(result) { var n = result.responseText.replace(/\n/g,"").match(/<a name="tb">.*/)[0].match(/<li>/g).length; if (n < 10) { tb.innerHTML = tb.innerHTML.replace(/\)$/,"/"+n+")"); } else { tb.innerHTML = tb.innerHTML.replace(/\)$/,'/<span style="color: red;">'+n+"</span>)"); } } }); } })();
タグ「delphi」を含む注目エントリー - はてなブックマーク
Delphiアプリケーションのメモリリーク検出法 (山本隆の開発日誌)
http://www.componentsource.co.jp/features/delphi/
TMS Software | Productivity software building blocks
Components > Effects and Multimedia > Video. Torry's Delphi Pages
Components > Effects and Multimedia > Audio. Torry's Delphi Pages
Components > Effects and Multimedia > Voice. Torry's Delphi Pages
Components > Effects and Multimedia > Direct X. Torry's Delphi Pages
eXeScope(Windows95/98/Me / ユーティリティ)
Delphi-ML〓〓〓〓〓〓〓〓〓〓〓??About Delphi
Delphi Q & A 〓f〓〓〓〓 〓〓〓〓〓〓O〓〓(HTML〓o〓[〓W〓〓〓〓)
Delphi WAVEサウンド音を鳴らす/Tips & Tricks
5分ではじめるDelphi - 第1回 簡単なメディアプレーヤの作成(前編)
Controling sound volume from code
lsMicrophone: mxl.dwComponentType :=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
SwissDelphiCenter.ch : ...set the volume for the microphone/ mute it (enhanced)?
Components > Sound Effects > Mixer. Torry's Delphi Pages
PlaySound('C:\WINNT\Media\start.wav', 0, SND_FILENAME or SND_ASYNC);
Delphi6でプログラミング ビットマップの半透明コピー AlphaDraw
procedure TForm1.Button1Click(Sender: TObject);
bmp1.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FINANCE.BMP');
bmp2.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256Color\FACTORY.BMP');
Form1.Canvas.Draw(10,10,bmp1);
Form1.Image1.Canvas.Draw(10,10,bmp2);
bmp1.Free;
bmp2.Free;
無料版Delphi6でSTGをつくるためのプログラミング講座 Ver.2005 Jan.
SwissDelphiCenter.ch : ...get the MAC Address?
もっと楽にGUIとの連携がしたい:Python + Delphi = P4D(Python for Delphi) - ふにゃるん
Delphi WindowsのOSのバージョンを取得する/Tips & Tricks
SourceForge.net: Gecko SDK for Delphi
BDS(Delphi/BCB)用SQLiteライブラリ (山本隆の開発日誌)
SwissDelphiCenter.ch : programming tips
ナッキーの「Turbo Delphiはじめて奮戦記」- 第1回 Turbo Delphi のインストール
フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro
フリーのTurbo Delphiで始めるWindowsプログラミング:ITpro
http://torrent.borland.com/turbo_hotfix_rollup.zip
http://torrent.borland.com/prereqs_jp.zip
http://torrent.borland.com/turbodelphi_jp.exe
(1) \dotNETRedist\dotnetfx.exe
(2) \dotNETRedist\langpack.exe
(3) \dotNETRedist\NDP1.1sp1-KB867460-X86.exe
っていうユーザースクリプト作ったよ。これ使うととってもすっきり。Re: 増田の読み方ってどうしてますか?と組み合わせればめちゃめちゃすっきり。
// ==UserScript== // @name anond unvisualizer with innerlink // @namespace http://anond.hatelabo.jp/ // @description unvisualize specific section at Hatelabo::AnonymousDiary // @include http://anond.hatelabo.jp/* // ==/UserScript== (function() { var target = document.evaluate( "//div[@class='section' and child::*[not(@class='sectionfooter') and descendant::a[starts-with(@href,'http://anond.hatelabo.jp/2') or starts-with(@href,'/2') and not(child::span[@class='sanchor'])]]]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for(var i=0; i<target.snapshotLength; i++) { target.snapshotItem(i).style.display = "none"; } })();
大概理解した。管理の甘いサーバはサーバサイドスクリプトでのっとり、それが出来なきゃindex.htmlおいてのっとり表示orフィッシング、最悪○○.txtや○○.jpgでhtmlおいてクライアントサイドスクリプトで嫌がらせorトロイつーとこですか。
うん。そういう感じ。
置き土産のフィッシングサイトがレンタルサーバーの規約に違反して公開停止の措置をうけました。
よぼぼん。
GDで1.0倍とか掛けるのはよさそうな手だね。
他になにか手があるかな、
認証APIあたりをつかって匿名アップローダーにするとかしか思いつかないや。
googleあたりでフォルダ名あたりから辿ってアタックしているんだろうね。
そこらへんはBBSあたりへの手口と一緒かも。
アップローダー。結局どれもずるずるなんだよね。
どうしたもんか。
ハックしてくるひとのために勝手口に鍵を掛けてないドアを用意して、
入れるようにしておいて、中にはいったらお茶でも出してまっててやりたい。
大概理解した。管理の甘いサーバはサーバサイドスクリプトでのっとり、それが出来なきゃindex.htmlおいてのっとり表示orフィッシング、最悪○○.txtや○○.jpgでhtmlおいてクライアントサイドスクリプトで嫌がらせorトロイつーとこですか。
どうも、その「ずるずるのアップローダー」はターゲットらしい。いろいろやられてる所が散見されました。
やっぱりIEのおせっかい仕様がガンだなぁ。firefoxだとcontent-typeを無視しないから、画像として表示しようとして、表示できなくて終わりだけど、IEだと中身がHTMLだとHTMLとして解釈しちゃうんだよな。
根本対策は、いったん画像をコンバートしてから保存するようにして、画像として処理できないデータは破棄するしかないのかな。GDとかImageMagicで1.0倍に変換とかしたらうまくいったりしないのかな?あとはアップロード時にはCAPTCHA使うとか。
でも、その「ずるずるあっぷろだ」をやめて、世界的にはマイナー、ただしユーザはそこそこいるアップローダにしたら、とりあえず大丈夫な気がする。
この攻撃、のっとったサーバかボットネットか何かから、手当たり次第に特定環境を機械的に攻めてるだけじゃないかな?だから、狙われないマイナーな奴使うのも一つの手だと思うよ。
何はともあれサイト復旧がんばってください。
ごめんね紛らわしいかきかたした。
ヘッダって書いたのはバイナリヘッダね。
ファイルの先頭数バイトとファイナルにファイル情報数バイト入ってたりするじゃない。
あそこらへんに画像情報ヘッダ埋め込まれて、実態はスクリプトファイル。
ごめんね、急いで書いたから適当に書いちゃった。
アップロードを試みられたファイルを適当に名前だけのっけておくね。
jpgなんて拡張子でphp割り当ててないから動くわけもないんだけどさ、
どうもあれこれしようとした形跡はあった。
phpスクリプトをよしんば動かせたとしても、権限がないから設定を書き換えたりはできないんだけど、もし権限があったらgif画像でスクリプト動いてたんだろうね。
で、実質あまり被害が広がったとも思えないけど、txtでフィッシングサイトの置き場にされてあえなくアボン。
アップローダーとか画像アップ用のスクリプトを安全に運用するすべはないもんかのー
.174 UPLOAD data_w2box/index.htm.jpg
.251 UPLOAD data_w2box/tac6.php.jpg
.217 UPLOAD data_w2box/c99.php.jpg
72.9 UPLOAD data_w2box/d.html.JPG
4.33 UPLOAD data_w2box/mad.gif
44.6 UPLOAD data_w2box/sniper_sa.php.jpg
.246 UPLOAD data_w2box/c99built16.php.jpg
.196 UPLOAD data_w2box/cmd.jpg
4.15 UPLOAD data_w2box/shell.php.jpg
72.9 UPLOAD data_w2box/pouya2.html.JPG
.157 UPLOAD data_w2box/mefisto.txt
.119 UPLOAD data_w2box/pv2.php.jpg
78.8 UPLOAD data_w2box/rv.php.jpg
.101 UPLOAD data_w2box/hack.jpg
1.15 UPLOAD data_w2box/index.jpg
4.83 UPLOAD data_w2box/qqq.jpg
4.83 UPLOAD data_w2box/hacked sssssubay.jpg
1.15 UPLOAD data_w2box/hacked.jpg
1.15 UPLOAD data_w2box/hackedturan.jpg
1.15 UPLOAD data_w2box/hacked turan.jpg
.180 UPLOAD data_w2box/c99.jpg
.180 UPLOAD data_w2box/root.jpg
8.11 UPLOAD data_w2box/se.php.jpg
7.59 UPLOAD data_w2box/putrio.php.jpg
.144 UPLOAD data_w2box/r57.txt
.144 UPLOAD data_w2box/ugur.txt
.128 UPLOAD data_w2box/hacked_sssssubay.jpg
0.14 UPLOAD data_w2box/verification.txt
6.97 UPLOAD data_w2box/test.php.jpg
.224 UPLOAD data_w2box/tool.txt
72.9 UPLOAD data_w2box/hacked.txt
つか、こいつわかりやすい名前つけるよな。。
ちなみに最後のやつがPayPalのフィッシングサイトだそうで、
サーバー管理にひっかかった。
http://anond.hatelabo.jp/20070529203018
それってHTTPサーバのログからとったやつだよね?apache?それ以外?
何にしても、ヘッダが偽装って、プロクシとかが付けるviaの事?
「拡張子偽造のスクリプト」ってのが気になる。どんな事するの?それ。
つか、IEの内容見て判断するお節介機能は何とかなんないのかな。
ま、とりあえずUAにMSIEってあったら、問答無用でattachmentにしとけばいいよ。
imgタグだったらインラインで表示してくれるから。それはそれでどうかと思う(IEの)仕様だけどね。
いや、似た様な事が出来るCGI使ってるんで。
[追記]
そうそうセキュリティに詳しい増田さん。いたら教えてください。
信頼できない者から送られてきたデータが、セキュリティ的に他の多数のクライアントへ画像として送っても良いデータ(JPEG、PNG、GIF、BPM)であるか、判断するのは先頭4バイトくらいで可能ですか?