+ JavaScript の質問用スレッド vol.121 + at HP
[2ch|▼Menu]
[前50を表示]
200:Name_Not_Found
14/11/10 13:34:42.97 .net
その個人攻撃には何の生産性も感じられないからいい加減に自重しろ

201:Name_Not_Found
14/11/10 13:38:28.77 .net
jQuery使ってるのにinnerHTML否定した馬鹿が顔真っ赤になって必死だな

202:Name_Not_Found
14/11/10 13:59:44.35 .net
率直にいってjQueryには好ましくない実装が結構あるからねえ
innerHTMLに限らず、使う必要性はあまり感じないね
便利なプラグインがあって自分で作る手間を省きたい時に使うぐらいかな
大抵自分で作ろうとするし、jQueryがなくても困らないだろうね

「どうせおまえもjQueryがなかったら困るんだろ?」はただの思考停止の信者発言だし、問題の本質から論点をずらして逃げてるだけ
まともな議論にもなりそうにないね

203:Name_Not_Found
14/11/10 15:11:10.74 .net
jQueryが2つ以上のファイル構成なら多くの人が使ってなかっただろう

204:Name_Not_Found
14/11/10 15:59:32.97 .net
スタンスの問題では?
コード記述の便利さを取るか、コード実行の最適化を図るか

205:Name_Not_Found
14/11/10 20:13:53.72 .net
innerHTMLを毛嫌いするのに正当な理由がないから
jQueryで使っていても何の問題もないんだが。

明日太陽が昇らないかもって
心配しているようなもん。

206:Name_Not_Found
14/11/10 20:15:19.99 .net
うーん? innerHTMLを根拠なく否定しているやつが
馬鹿というのが大前提なんだが、それわかってる?
そこから説明しないといかんの?

innerHTMLを否定する理由はないという
コンセンサスは得られているかな?

207:Name_Not_Found
14/11/10 20:22:30.14 .net
>>202
それ言うならスタイルだろ…

208:Name_Not_Found
14/11/10 20:37:11.00 .net
>>205
スタンスで間違ってないと思うけど、衝突の原因はそこじゃないんだよね
相手を打ち負かす目的で発言している人とは論理的に議論できる気がしないよ

209:Name_Not_Found
14/11/10 21:03:59.13 .net
うちの上司は、すぐに、エビデンス!とかフィージビリティ!とか逆に!とか言う。
と思っていたら、気が付いたら自分も言うようになってた。

210:Name_Not_Found
14/11/10 21:19:24.57 .net
>>207
「逆に!」だけ別次元の何かを感じさせるな

211:Name_Not_Found
14/11/10 21:20:47.50 .net
根拠はもう出てるだろ

212:Name_Not_Found
14/11/10 21:21:38.97 .net
innerHTMLはDOMを壊す恐れがあるから使うなっ!

213:Name_Not_Found
14/11/10 21:25:37.65 .net
innerHTMLを使ったらダメという根拠は、
代入するHTMLに<script>タグが含まれていたらXSSが起きるから

逆に言えば、innerHTMLに<script>タグが含まれることがないと
保証されているなら使っていい。

ここまでは同意とれてるよね?

214:Name_Not_Found
14/11/10 21:29:17.83 .net
innerHTMLはevalと一緒。
だからevalは使ってはならない。

Googleのスタイルガイドでも
evalは絶対に使ってはならないと書いてある


215:。 ↓うっそぴょーんw http://cou929.nu/data/google_javascript_style_guide/#eval > デシリアライズ (deserialization) するときのみ使用可. (例えば RPC レスポンスを評価するときなど)



216:Name_Not_Found
14/11/10 21:31:47.24 .net
ユーザーが入力した値をinnerHTMLで
代入するときは気をつけないといけないが、
プログラマが書いた文字列を代入するだけなら
安全だから問題ないんだよ。
最低限これぐらいは理解してから会話に参加してくれ。

217:Name_Not_Found
14/11/10 21:45:44.89 .net
人的ミスがないとは言い切れない

218:Name_Not_Found
14/11/10 21:46:51.14 .net
そうなるとサーバサイドで文字列を無害化しなくていいって言ってるるようなもんだね

echo htmlspecialchars($s, ENT_QUOTES, 'utf-8');はしなくていい
ehoc $s;でいいみたいなことをいってるんだね

219:Name_Not_Found
14/11/10 21:49:06.75 .net
>>211
他にも問題があるけどいくらいっても理解されないようだからもういい

220:Name_Not_Found
14/11/10 21:53:17.53 .net
>>214
人為ミスを起こすという話をすると、
createElement('script')って書いたら、
script実行できちゃうから、
createElementも使ったらダメってことになるけどいいの?

221:Name_Not_Found
14/11/10 21:54:57.38 .net
>>101を全く理解してないからXSSだけとか適当な事をいうんだろう

222:Name_Not_Found
14/11/10 21:55:01.01 .net
>>215
おいおい、話が全く違うだろう。

その例で言うのなら

echo 'aaa' は危険だから
echo htmlspecialchars('aaa', ENT_QUOTES, 'utf-8'); って書けって言っているようなもんだよ。

違いわかる? ユーザーの入力値がはいった変数じゃないんだ。
プログラマが入れた固定の文字列。

だから安全なんだよ。

223:Name_Not_Found
14/11/10 21:56:19.69 .net
>>216
その問題はすべて反論しただろw

224:Name_Not_Found
14/11/10 21:57:31.58 .net
echo はミスをするとXSSを起こす。

だからechoを使うな!



え?w

225:Name_Not_Found
14/11/10 21:58:21.95 .net
innerHTML はミスをするとXSSを起こす。

だから innerHTML を使うな!



え?w

226:Name_Not_Found
14/11/10 21:58:59.24 .net
>>217
>>214はヒューマンエラーでXSS問題が起きるリスクを回避する話をしているのだと思うが
趣旨を理解しない意見で煙に巻くのがお得意のようだな

227:Name_Not_Found
14/11/10 22:00:17.47 .net
>>223
だから、ヒューマンエラーが起きるって話をするならば、
echo は使っちゃダメってことですよね?

228:Name_Not_Found
14/11/10 22:02:49.62 .net
script 要素に appendChild() とかやったらどうなる?

229:Name_Not_Found
14/11/10 22:02:54.79 .net
いつからバグをヒューマンエラーっていうようになったの?

バグをしたら脆弱性が起きるような命令は使ったらダメというのなら
プログラム書けないだろ。

ファイルを削除するdeleteは、バグがあったら
全ファイル消えるから使っちゃダメとか?w

230:Name_Not_Found
14/11/10 22:03:05.20 .net
>>224
echoなど知らん
相変わらず、煙に巻くのが得意だな

231:Name_Not_Found
14/11/10 22:05:03.83 .net
>>225
> script 要素に appendChild() とかやったらどうなる?
そりゃ、そういうコードを書く奴が悪いというのは誰もが認めると思うが
ヒューマンエラーで「間違ってappendChild しちゃいました」なんて事が起こりうると思っているのか?

232:Name_Not_Found
14/11/10 22:10:54.50 .net
>>226
ヒューマンエラーでバグが発生するという理屈も分からないのか
原因と結果を切り分けて考えることも出来ないのか

233:Name_Not_Found
14/11/10 22:12:24.92 .net
>>228
いや、単純にscript要素に子要素ノードとか作れてしまうのか
と思って聞いてみたのだが

> 「間違ってappendChild しちゃいました」
例えば script 要素に id が振られていて、
間違ってその id で getElementById で要素を取得して
appendChild するようなことはあり得るかもしれない

234:Name_Not_Found
14/11/10 22:21:11.44 .net
>>219
え?固定された文字列でもサニタイズしないとかありえませんよ?

235:Name_Not_Found
14/11/10 22:26:15.46 .net
>>230
> 例えば script 要素に id が振られていて、
> 間違ってその id で getElementById で要素を取得して
> appendChild するようなことはあり得るかもしれない
それは appendChild 以前の問題だ
それを認めるなら「間違って innerHTML しちゃいました」も起こりうるのだから
期待しなかった場所に appendChild されたのならデバッグ時に気がつくはずだし、気が付くべきだ
(気が付かなかったのならデバッグが足りない)

XSSの厄介なところは事象が発生しなければ問題にはならないという事だ
ヒューマンエラーでXSSが発生しているのなら意図的にXSSを発生しようとしなければ発見できないだろう
「間違ってappendChildしちゃいました」とは根本的に違う

236:Name_Not_Found
14/11/10 22:27:53.51 .net
> それを認めるなら「間違って innerHTML しちゃいました」も起こりうるのだから
ちなみに「間違って innerHTML しちゃいました」の方が想定されるリスクは大きい
script要素でなくてもXSSが起こりうるからな

237:Name_Not_Found
14/11/10 22:30:48.95 .net
ヒューマンエラーはありとあらゆるセキュリティホールの可能性があるから超危険だ
人間はプログラムを書くべきではないな

238:Name_Not_Found
14/11/10 22:36:32.80 .net
だったらプログラムを書くコンピュータを作ろう
しかしそのコンピューターのプログラムは誰が書こうか

239:Name_Not_Found
14/11/10 22:50:36.22 .net
>>231
あほだろ。

固定の文字列に対してエスケープする意味は無い。

240:Name_Not_Found
14/11/10 22:55:23.85 .net
固定の文字列をechoする時にエスケープしなくていいのは
リスクが0だから。

同様に固定の文字列。innerHTML = '<span>abc</span>'とか
XSSになりようがない。つまりリスク0だから何の問題もない。

リスクが0なのに、そのリスクがどうとか言うのは
リスク管理じゃなくて、単なる過保護。

241:Name_Not_Found
14/11/10 22:57:40.87 .net
間違って innerHTML しちゃっても問題は起きない。
なぜなら、appendChildしちゃいましたと同じだから。

appendChildしても、scriptと入れない限り大丈夫なように
inenrHTMLをscriptを入れない限り大丈夫。

この説明で同じだってことがよくわかったと思うがね。

242:Name_Not_Found
14/11/10 23:00:39.74 .net
過保護パターンみたいな名前のアンチパターンありそうだなw

例えば、if (a > 0 and a !== 0) みたいに
明らかにやる必要がないのに、念のためとかいって
やる初心者がいるんだよねw

こういうのは、コードがどう動くか
わかってないから。

243:Name_Not_Found
14/11/10 23:05:14.85 .net
>>238
appendChild と innerHTML が同じ?

244:Name_Not_Found
14/11/10 23:08:28.44 .net
チェックミスが起きるからヒューマンエラーなんだがな
appendChild と innerHTML を同一視するとか、リスクの規模を測る目を持たない人がいう事は違うな

245:Name_Not_Found
14/11/10 23:09:16.38 .net
>>240
はい。同じです。

固定値をinnerHTMLに入れている限りXSSは起きません。
逆に、appendChildの値をユーザーーが入力可能だとXSS起きる可能性があります。
echoも同じです。固定値ならばXSSは起きません。


違い、分かりますか? 変数の内容がユーザーが入れられるかどうかです。
エンドユーザーが入れられるなら、XSSは起きる可能性がありますが、
固定値を入れている限りXSSは起きません。

絶対に起きません。

246:Name_Not_Found
14/11/10 23:10:11.01 .net
>>241
チェックミスって何のチェックですか?

コードにバグがないかチェックしないんですか?

247:Name_Not_Found
14/11/10 23:11:25.57 .net
まさにこれなんだよね。
echoをミスするとXSS起きるから、
echoを使うなっていう馬鹿はいない。

221 名前:Name_Not_Found[sage] 投稿日:2014/11/10(月) 21:57:31.58 ID:???
echo はミスをするとXSSを起こす。

だからechoを使うな!



え?w


222 名前:Name_Not_Found[sage] 投稿日:2014/11/10(月) 21:58:21.95 ID:???
innerHTML はミスをするとXSSを起こす。

だから innerHTML を使うな!



え?w

248:Name_Not_Found
14/11/10 23:13:27.03 .net
>>243
バグがあったら脆弱性になるだよ。

あっ! innerHTML使って、しかも間違って
代入するテキストにscriptタグを書いてしまった!


どんだけありえない話だよwwww

innerHTML使うだけじゃ何の問題も起きないからね。
innerHTMLを使ってなおかつ、ありえない条件を満たさない限りXSSは起きない。

249:Name_Not_Found
14/11/10 23:14:32.00 .net
プロなら過保護はやめろよw
いつまでも補助輪付けて
競輪に出場してるんじゃねーよw

250:Name_Not_Found
14/11/10 23:14:58.62 .net
>>236
お前サーバサイドやったことないだろ

251:Name_Not_Found
14/11/10 23:16:28.18 .net
>>247
お前がやったことないだろ。
はい論破w

252:Name_Not_Found
14/11/10 23:18:21.00 .net
こういう喩え話思いついたわw


あるプログラマが、echo '<p>ほげほげ</p>'というコードを書いていました。


もう一人の知障プログラマがエスケープしろ!固定値でもエスケープしろ!っと喚いて
すべてのプログラムをこう書き換えました。
echo htmlspecialchars('<p>ほげほげ</p>', ENT_QUOTES, 'utf-8');


大損害を与えたため知障プログラマは会社を首になりましたwww

253:Name_Not_Found
14/11/10 23:19:07.39 .net
ところどころ全然的を得てない例を出してる人は流れの邪魔

254:Name_Not_Found
14/11/10 23:20:16.54 .net
まずエスケープする所は、ユーザーが入力した文字。
固定値はエスケープしないで出力しても安全。
これがサーバーサイドの常識。

クライアントサイドでも同じで、
innerHTMLに固定値を代入するときは
何の問題も起きない。リスクもない。

255:Name_Not_Found
14/11/10 23:29:15.60 .net
全然常識じゃない

256:Name_Not_Found
14/11/10 23:30:55.91 .net
お前が意味のないコード書いてるだけ。
意味があることだけやれや
過保護やろう

257:Name_Not_Found
14/11/10 23:32:53.23 .net
ママーこわいよ。ヒューマンエラー怖いよー
リスクがー、リスクがー。
バグかいても、動くコード


258:ゥいてー リスクゼロじゃなきゃだー



259:Name_Not_Found
14/11/10 23:34:00.59 .net
innerHTMLに代入する文字が
固定の文字列ならリスクゼロだよw

260:Name_Not_Found
14/11/10 23:37:50.05 .net
たぶん「固定の文字列」がわからないんだよ

261:Name_Not_Found
14/11/10 23:37:53.79 .net
>>255
innerHTMLを選択する理由もゼロになるな

262:Name_Not_Found
14/11/10 23:40:49.79 .net
innerHTML君はいい加減、黙ってくれないかな
言いたいことは全ていっただろうに、いつまで続けるというのか

263:Name_Not_Found
14/11/10 23:41:21.39 .net
>>257
コードがシンプルになるよ。

innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';

これをinnerHTMLを使わないで書こうとすると
複雑になるからね。つまりコストが掛かってバグを起こすリスク(笑)が高くなる。

>>256
なるほど。固定の文字列がわからないのか。
上の、'<table>〜</table>'のことだよ。
値が変わらないからXSSが起きるリスクがない

264:Name_Not_Found
14/11/10 23:42:38.61 .net
>>258
> いつまで続けるというのか
え? それ言っておかないとダメ?

反論する人がいる限り叩き潰しに来るし、
この話題が出るたびに再登場するよ。

ちゃんと、いつまで続けるか言ったので
今度から聞かないでね。

265:Name_Not_Found
14/11/10 23:45:11.98 .net
innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';

と書こうとして、ちょっと眠くてうっかりして手が滑って

innerHTML = '<table id="tbl"><tr><td class="first"><script>alert(1)</script>なんとか</td></tr></table>';

って書いてしまったらどうするんだ!


ねーよw

266:Name_Not_Found
14/11/10 23:46:03.69 .net
なんとかの部分を可変にしてほしいという変更依頼があったらどうする?

267:Name_Not_Found
14/11/10 23:46:35.70 .net
ここまで低次元だという事がないな

268:Name_Not_Found
14/11/10 23:46:47.42 .net
>>262
エスケープする。サーバーサイドの常識(笑)だろ

269:Name_Not_Found
14/11/10 23:47:52.76 .net
エスケープするの忘れるかもしれないから
echo禁止。ユーザーが入力したものを表示するの禁止。

270:Name_Not_Found
14/11/10 23:48:33.81 .net
変更依頼があって、そこからやるのか…

271:Name_Not_Found
14/11/10 23:49:44.45 .net
>>263
それだけ過保護が多いんだろ。
うちの会社は馬鹿ばかりだから規則を守れ。
理由は考えるなお前らはただ規則を何も考えずに守ってればいいんだ。

272:Name_Not_Found
14/11/10 23:50:40.06 .net
>>266
何か問題?

低次元の人は何考えてるのかわからんので、
ちゃんと書こうね。

273:Name_Not_Found
14/11/10 23:50:41.67 .net
>>215あたりがこいつの考えの根底にあるものか
テキスト操作に拘り過ぎてDOMの概念がないんだな

274:Name_Not_Found
14/11/10 23:51:46.19 .net
>>267
理由を理解できないおまえにいわれたくないわ

275:Name_Not_Found
14/11/10 23:52:22.74 .net
>>264
ネタだと思ってたらお前は絶対にサーバサイドでコード書かないほうがいいよ

276:Name_Not_Found
14/11/10 23:52:50.00 .net
>>268
依頼がなくても最初から全部エスケープしていればいいだろ

innerHTML = escapeHTML('<table id="tbl"><tr><td class="first">なんとか</td></tr></table>');

ドヤッ!

277:Name_Not_Found
14/11/10 23:53:36.23 .net
>>270
みんなお前が馬鹿だってわかってるから
もうやめたら?w

>>271
へー。あんたエスケープしないんだ?
ユーザーが入力した文字をエスケープしないんだねw

278:Name_Not_Found
14/11/10 23:55:03.18 .net
>>271
まさか、まだサーバーサイドで固定値をエスケープしろとか言ってんの?

echo htmlspecialchars('<table id="tbl"><tr><td class="first">なんとか</td></tr></table>', ENT_QUOTES, 'utf-8');

なるほど、こういうコード書けと。

あんた、バグってますよw

279:Name_Not_Found
14/11/10 23:55:37.97 .net
>>273
会話のキャッチボールできないのかな?
まともに相手してもらえなくなりますよ

280:Name_Not_Found
14/11/10 23:57:04.98 .net
>>274
逆にいちいち区別するほうが変だろ
常にしておけばいい

281:Name_Not_Found
14/11/10 23:57:21.39 .net
>>275
相手しなくていいってw
どうせお前だけだろ? 意味もなくinnerHTML使うなって言ってるのは。

俺はしっかり言った。代入するのが固定の文字列であれば
innerHTMLを使うリスクは0だ。

固定値じゃない(ユーザーが入力する文字)ならばエスケープすればいい。

さあ、反論は?

ボール投げたから、ちゃんと投げ返してね。

282:Name_Not_Found
14/11/10 23:58:00.06 .net
>>276
だからバグってるだろw
正しく動いてないだろw

283:Name_Not_Found
14/11/10 23:58:58.39 .net
>>278
いや、そのコードかいたの俺じゃないし

284:Name_Not_Found
14/11/10 23:59:13.25 .net
バグっていても、リスクが0なら
そっちの方がいいだろう?

285:Name_Not_Found
14/11/10 23:59:41.73 .net
初めてだわ、場合によってサニタイズするって考えの人
LTでも勉強会でも見たことないので是非スライドシェアに投稿してほしいね

286:Name_Not_Found
14/11/11 00:00:38.75 .net
>>276
「常にしておく」って誰かから聞いたのをそのまま言ってるだけ?

常にしておくっていうのは、変数を出力する時の話であって
固定の文字列の部分は関係ないよ。

ちゃんと理解してないで、言葉だけ覚えてるから
そういう間違いをするんだよ。

287:Name_Not_Found
14/11/11 00:02:22.99 .net
え?

288:Name_Not_Found
14/11/11 00:03:44.47 .net
>>281
あー、わかったわ。お前が何を勘違いしているのか。

全部エスケープしろって言われて、
echoで出す文字全てをエスケープしろって思ってるだろ?

echo htmlspecialchars('<table id="tbl"><tr><td class="first">$nantoka</td></tr></table>', ENT_QUOTES, 'utf-8');

みたいに。

あのね、よく聞いてね。
みんなが言ってる「常にエスケープしろっていうのは」

<table id="tbl"><tr><td class="first"> <?php echo htmlspecialchars('$nantoka', ENT_QUOTES, 'utf-8') ?> </td></tr></table>;

変数の部分だけだから。

ここまで次元が低いと、降りるまで時間がかかるわw

289:Name_Not_Found
14/11/11 00:05:44.63 .net
>>284のコードを
innerHTMLの話に戻すと

innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';

これはエスケープする必要はない。固定の文字列であり変わることがなくて安全だから。

「なんとかの部分を変えたい」という話であれば、こう。

innerHTML = '<table id="tbl"><tr><td class="first">' + escapeHTML(nantoka) + '</td></tr></table>';

290:Name_Not_Found
14/11/11 00:08:41.72 .net
>>284
あんたが一人で騒いでるだけだろう
俺は>>215と書いたのに勝手に脱線してるのはお前なんだよ

291:Name_Not_Found
14/11/11 00:09:08.73 .net
今頃、変数の前後の固定の文字列まで含めて
エスケープしているスライドを探してるのかな?w

292:Name_Not_Found
14/11/11 00:10:24.93 .net
>>286
別に騒いでるのが俺だけってことでもいいよ。

俺の言ってることが間違っていると言わないなら
全然問題なし。

で、固定の文字列は安全です。

293:Name_Not_Found
14/11/11 00:26:54.56 .net
ここらへんで、一旦まとめを書いておきますね。

Q. innerHTMLは絶対に使ったらダメなの?
A. XSSが起きるような使い方をしなければ使って問題はありません。

Q. XSSが起きる場合とはどんな時ですか?
A. ユーザーからの入力された変数をそのまま出力するとXSSになる可能性があります。

Q. XSSが起きないようにするにはどうすればいいですか?
A. エスケープをしましょう。以下は例です。
innerHTML = '<table id="tbl"><tr><td class="first">' + escapeHTML(text) + '</td></tr></table>';

Q. escapeHTMLが使えません。
A. 残念ながら標準では用意されていないのでライブラリを使うか自分で実装する必要があります。


function escapeHTML(str) {
return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
lodash.js URLリンク(lodash.com)
Prototype.js URLリンク(api.prototypejs.org)

Q. escapeHTMLと書くのが面倒です。
A. テンプレートライブラリなどを使えば簡単にかけます。

例 lodash
_.template('<b><%- value %></b>', { 'value': '<script>' });
// → '<b>&lt;script&gt;</b>'

Q. createElementやappendChild等のDOM命令を使ったほうがいいのではないですか?
A. 使ってもいいですがコードが冗長になります。
安全な場合(XSSが起きない場合)は冗長にしてまでDOMを使う理由がありません。

294:Name_Not_Found
14/11/11 00:48:54.93 .net BE:734417802-2BP(6567)
sssp://img.2ch.sc/ico/nida.gif
casperjsをインストールして試そうとすると以下のエラーがでてうまく動かないです。

【環境】OS:Win7pro 64bit
【何をしたのか】
コマンドプロンプトでcasperjsを試そうとすると以下のエラー?がでます

【エラーメッセージ】

C:\Users\*******>casperjs --version
1.1.0-beta3
Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file:///C:/jstools/casperjs-1.1-beta3/bin/bootstrap.js. Domains, protocols and ports must match.

【期待する結果】
PhantomJSとCasperJSをうまくインストールしたいです。
エラーの原因がわかる方、いらっしゃいましたら宜しくお願いします。

295:Name_Not_Found
14/11/11 00:52:02.90 .net
まとめ書いたら、止まったかw

>>290
Displaying message "Unsafe JavaScript attempt to access frame with URL about:blank ...". #1068
URLリンク(github.com)

これじゃね?

296:Name_Not_Found
14/11/11 00:53:01.76 .net
あ、こっちか?

Unsafe JavaScript attempt to access frame in 1.9.8
URLリンク(github.com)

297:Name_Not_Found
14/11/11 00:53:57.57 .net
早くこの辺の話終わんねえかな…

298:Name_Not_Found
14/11/11 00:55:04.54 .net
>>293
終わったよ。まとめ書いたから止まった。

もう次の話に入ったよ。

299:Name_Not_Found
14/11/11 01:00:10.46 .net
次からID出すといいかもね
ID出しておくと便利で、うざいやつからの反論が無くなるらしいよ

300:Name_Not_Found
14/11/11 01:02:37.92 .net
>>295
昨日だったか一昨日だったかは出したんだけどね。
今回は反論を叩きのめそうと思ったので
あえて隠した。どっちにするかは気分次第。

301:Name_Not_Found
14/11/11 01:07:35.11 .net BE:734417802-2BP(6567)
sssp://img.2ch.sc/ico/nida.gif
>>291
ありがとう
なんとなく?読んでみたけど今のところ解決策がない感じ・・・かなぁ

302:Name_Not_Found
14/11/11 01:08:11.93 .net
ほんとぱたっとやんだなw
やっぱりinnerHTMLを否定していたのは一人だったか。
俺も寝るから、またあしたな。

>>297
どうやらバグみたいだから
一つ前のバージョンに戻すとかしてみればいいんじゃない?

303:Name_Not_Found
14/11/11 01:14:20.91 .net
一人で頑張るならID出したほうがいいぞ
自演を疑われるぐらいなら初めからID出したほうが信用される
後は各自で判断するだろうさ

304:Name_Not_Found
14/11/11 01:17:19.19 .net
ようやく向こうのスレが収束したわけだが

> function escapeHTML(str) {
> return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
> }
これは酷いな
XSSが発生するコードを披露するとは

305:Name_Not_Found
14/11/11 01:20:47.18 .net
>>300
もしかしてシングルクォートの話してる?

URLリンク(d.hatena.ne.jp)

> 私が、シングルクォート「'」もエスケープ対象に加えているのは、
> 属性値をシングルクォートで囲むケースが少なからず見受けられるからで、
> かならずダブルクォート「"」で囲むように徹底されていれば、このガイドラインは必要ありません。

まあ、あったほうがいいよね。

306:Name_Not_Found
14/11/11 01:24:01.42 .net
Underscpreはこうらしいね。 これだけやっておけば大丈夫みたい。

URLリンク(stackoverflow.com)
There's also _.escape in Underscore, that does it like this:

// List of HTML entities for escaping.
var htmlEscapes = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'/': '&#x2F;'
};

// Regex containing the keys listed immediately above.
var htmlEscaper = /[&<>"'\/]/g;

// Escape a string for HTML interpolation.
_.escape = function(string) {
return ('' + string).replace(htmlEscaper, function(match) {
return htmlEscapes[match];
});
};

307:Name_Not_Found
14/11/11 01:29:47.87 .net
訂正版はこれでいいのかな。

function escapeHTML(str) {
return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/'/g, "'&#x27;").replace(/\//g, "'&#x2F;");
}

308:Name_Not_Found
14/11/11 01:31:55.47 .net
>>300
あえてこちらには書き込まなかったのになぜこっちにコピペするんだよ

>>302
明らかに足りない
「ライブラリで使っているから大丈夫」という信者判断はいい加減に卒業しろ
しかも、「大丈夫みたい」とは何も理解してないだろ

309:Name_Not_Found
14/11/11 01:32:57.68 .net
>>304
「足りない」っていうぐらいなら
何が足りないのかいいなよ。
難癖つけてるようにしか見えないからさ

310:Name_Not_Found
14/11/11 01:34:19.23 .net
>>304
> あえてこちらには書き込まなかったのになぜこっちにコピペするんだよ

こっちの続きだから

> 明らかに足りない

じゃあ、足りない文字は何?
そいれ付け加えるだけなんだからさ

311:Name_Not_Found
14/11/11 01:35:41.73 .net
>>304
あなたよりも、徳丸さんの方を信じますよw

徳丸さんは / はエスケープしてないね。
たしかに要らないように思える。

312:Name_Not_Found
14/11/11 01:37:57.87 .net
仕様を読めば分かる事を一々聞くな
仕様も読めない奴が一人前な口を叩くな

この後の展開は読めてる
「知らないんだろ?じゃあ、問題ないってことだな」
煽ってもおまえに教える気は全くないがね

313:Name_Not_Found
14/11/11 01:38:10.16 .net
本当、文句だけ言って自分の意見は書かないクズはなんなんだろうな

314:Name_Not_Found
14/11/11 01:39:59.82 .net
それじゃだめ

なんで?

いいやだめだめ

だからなんで?

だめったらだめ

駄目だこいつ話にならねぇw

315:Name_Not_Found
14/11/11 01:41:50.95 .net
仕様によると最低限のエスケープはこれだけらしい。

URLリンク(d.hatena.ne.jp)
> W3CのHTML4.01の仕様を見ると、〜略〜すなわち、最低限のエスケープだと以下のようになります。
>
> エスケープ対象項目 エスケープ対象文字
> 要素内容(一般のテキスト) 「<」、「&」
> 属性値 「"」、「>」、「&」

これ+ブラウザのバグ対策か。

316:Name_Not_Found
14/11/11 01:44:48.21 .net
>>308
> この後の展開は読めてる
> 「知らないんだろ?じゃあ、問題ないってことだな」

普通にその通りの展開だよw

でも先が読めてても、対策出来てないんじゃ
片手落ちだけどね。


お前がパンチを出してくるのは読めていた!(勝ったつもり)
そしてパンチで殴られる。(笑)
先が読めてても、殴られる例。

317:Name_Not_Found
14/11/11 01:46:38.58 .net
先が読めてるくせに、その先を行けないっていうのは、
言い返せないからってことだと思うw

そういう反論するのはわかっていたが、
その反論の反論はできないってことだから。

318:Name_Not_Found
14/11/11 01:51:25.80 .net
なんか向こうでこういうこと言ってる奴がいるわw

> >>132が向こうのスレにコピペされてるんだが、誰がやったんだ?
> 迷惑だから止めてくれ

こっちの話を移動させようとしてるの見え見えだってのに
見苦しいやつだなw

319:Name_Not_Found
14/11/11 08:02:27.92 .net
innerHTML否定厨が完全論破されててワロタw

320:Name_Not_Found
14/11/11 08:30:42.48 .net
replaceの回数だけ文字列を全部読んでいてワロタw

321:Name_Not_Found
14/11/11 09:01:58.11 .net
>>316
ベンチマークするとそっちのほうが
速かったりするのはなんでなんだろうか?

キャッシュの関係なのかな?

ループが単純=CPUの1次キャッシュに入りきる
ループが複雑=CPUの1次キャッシュに入りきらない

322:Name_Not_Found
14/11/11 09:44:07.85 .net
>>288,289

固定の文字列って何?ハードコーディングって用語も知らないの?
文字列は文字列であり変数に入れようが入れまいが代わりはない
ハードコーディングされた文字列だから安全って思い込みはやめるべきだ
"<div onclick='alert(1);'>click</div>"こういうのは文字列じゃないとか抜かすなよ

>Q. innerHTMLは絶対に使ったらダメなの?
>A. XSSが起きるような使い方をしなければ使って問題はありません。

つまり自分でDOMで構築するよりもリスクが高い事を認めているってことだよね

お前が主張する前にもう言っただろ
innerHTMLはパフォーマンスが悪くDOMを壊す

323:Name_Not_Found
14/11/11 09:56:13.25 .net
>>303
エスケープ

var DIV = document.createElement('div');

function escapeHTML(str) {
DIV.textContent = str;
return DIV.innerHTML;
}

というやり方もあるんじゃないか?

ただし、この関数の場合
escapeHTML(str1) + escapeHTML(str2) の結果が
escapeHTML(str1 + str2)
に等しくならない場合があるブラウザがあると困るかもしれない

ちなみに逆変換はこれでいけるかな?

function unescapeHTML(htmlStr) {
DIV.innerHTML = htmlStr;
return DIV.textContent
}

324:Name_Not_Found
14/11/11 09:57:11.06 .net
innerHTMLはパフォーマンスが悪くDOMを壊す(キリッ

世界中で使われてるのに?
jQueryにも使うなって言ってこいよ
変な宗教か何かやってるのかな?

325:Name_Not_Found
14/11/11 10:19:49.90 .net
デタお決まりのjQueryガーwwwwwwwwwwww

326:Name_Not_Found
14/11/11 10:29:48.42 .net
文字列操作で構築、変数部分はエスケープって一昔前に戻った感じだね

327:Name_Not_Found
14/11/11 10:41:28.13 .net
DOMを壊すって曖昧な表現だな
innerHTMLを使ってもDOMがぶっ壊れたりしないから良く分からんよ

328:Name_Not_Found
14/11/11 10:58:54.87 .net
無知がinnerHTML使うなって言ってて笑える

329:Name_Not_Found
14/11/11 11:40:48.95 .net
ごちゃごちゃとエスケープ処理を作るよりも
こういう>>319ハックのほうが個人的には好きだな

330:Name_Not_Found
14/11/11 13:38:02.07 .net
>>319
>>325
escapeの為にinnerHTMLを使うことは本当の馬鹿だからやめとけ
innerHTML否定厨よりも頭悪いぞ

331:Name_Not_Found
14/11/11 13:46:47.72 .net
>>325
賢い方法だが、テキストノードのエスケープ処理しかない点に注意
属性値のエスケープ処理を追加する必要がある

332:Name_Not_Found
14/11/11 14:19:25.43 .net
>賢い方法だが

ブラウザの挙動すら理解できてない馬鹿が一匹沸いたな

333:Name_Not_Found
14/11/11 16:32:43.53 .net
DOMOすんません

334:Name_Not_Found
14/11/11 18:58:18.81 .net
まあ今日はポッキーでも喰って落ち着け
つ━━一

335:Name_Not_Found
14/11/11 19:15:54.23 .net
一人で回答頑張ってる奴がいるみたいだから、このスレの回答は全てそいつ一人に任せればいいんじゃない?
そいつの認める奴だけが回答する権利を持つと言わんばかりの有り様だし

336:Name_Not_Found
14/11/11 20:38:17.72 .net
>>318
> つまり自分でDOMで構築するよりもリスクが高い事を認めているってことだよね

DOMで構築するほうがリスクが高いよ。
DOMで構築するとコードが長くなる。
コードが長くなるということはバグを入れる可能性が高くなる。
つまりバグを入れるリスクが高い。

337:Name_Not_Found
14/11/11 20:51:19.05 .net
>>331
それ、いいね。

じゃあ、君の意見に賛成する俺と
君は回答しないことにしよう。

多分君の危険に賛成しない人はいるだろう。
そういう人は回答してもいいけど、
少なくとも俺と君、この二人はもう絶対回答しないよ

338:Name_Not_Found
14/11/11 21:10:30.10 .net
>>319
DOM使ってエスケープするのは、可能といえば可能で
意外と遅くないらしいんだけど、やり過ぎだと思うよ。

仕様も実装も簡単なのに、ブラックボックスにするのがね。
あとサーバーサイドで使う時も考えると、
純粋なJavaScript(ECMAScript)の範囲にしておきたいし。

もちろん、DOMベースでやるよりも、文字列ベースのほうが
少ないメモリで実行できるので速くなる。

339:Name_Not_Found
14/11/11 21:12:32.90 .net
>>318
> "<div onclick='alert(1);'>click</div>"こういうのは文字列じゃないとか抜かすなよ

あほじゃね? どこのアホがonclickなんて文字を書くんだよ。

そんなマヌケがいたとしたら、createElement使っても
onclick書くだろw

どんだけおっちょこちょいなんだw

340:Name_Not_Found
14/11/11 21:16:01.95 .net
論点がずれてる。

JavaScriptを文字列の中に書くのはXSSじゃない。
それは単にaddEventListnerした要素にすぎない。

問題なのは文字列の中にJavaScriptを埋め込むことではなく
文字列の中にXSSを埋め込むこと。

文字列の中にXSSを埋め込むのは相当難しい。

341:335
14/11/11 21:18:01.52 .net
>>336
そのとおりですね。

俺が言いたかったのは、文字列の中にXSSを埋め込むようなおっちょこちょいは、
createElement使ってもXSSを埋め込むおっちょこちょいだろだろってことです。

342:Name_Not_Found
14/11/11 21:49:16.66 .net
俺がいいたいのは>>289のようなアホなコードを書く奴は何を書いてもXSSを起こすだろだろってことです

343:Name_Not_Found
14/11/11 21:55:43.65 .net
じゃあアホの部分を修正すればいいだけじゃんかw

344:Name_Not_Found
14/11/11 22:30:13.66 .net
ここはジャイアンのスレですね

345:Name_Not_Found
14/11/11 22:47:42.34 .net
ジャイアンに失礼だろ

346:Name_Not_Found
14/11/11 23:48:14.58 .net
結局また始まってんじゃん

347:Name_Not_Found
14/11/12 00:15:37.45 .net
仕方ないよ。
innerHTMLなんて、サーバーサイドのechoや
document.writeと同じで、エスケープすればいいだけの話なのに、
エスケープしなかったらXSSになるかもしれないから使うなって
意味不明なことを言ってるようなやつだからね。
頭が悪い奴はいくら言っても理解できない。

348:Name_Not_Found
14/11/12 01:28:13.89 .net
ゼビウスの開発コードネーム?

349:Name_Not_Found
14/11/12 01:34:13.10 +zRlwvNM.net
いま面白いことを言った!

350:Name_Not_Found
14/11/12 03:16:46.81 .net
ORMでデータを保存する時、
hoge.save()
のようなメソッドを発行すると思います
それによりajaxのリクエストが投げられるでしょう
しかし複数のデータを保存した場合、たとえばオブジェクトが100個あると、
100回もリクエストが発行されるのでしょうか?

351:Name_Not_Found
14/11/12 03:30:45.96 .net
>>346
フレームワークによると思うが
複数のリクエストをまとめる仕組みがあるだろう。

そういうたぐいのフレームワークについて
俺は詳しくないが、そのような仕組みを考えたことはある。
俺程度が思いつくものなのだから、普通にあると思う。

352:Name_Not_Found
14/11/12 12:35:05.41 .net
そうですか
調べてみます
ありがとうございました

353:Name_Not_Found
14/11/12 17:11:47.77 .net
>>330
チョコの方持つなよ

354:Name_Not_Found
14/11/12 23:15:55.68 PMYoTTja.net
ポップアップ画面のClickイベントでAddClass()をしてもブラウザに反映されません、親のフォームでは反映されました
原因が解る方お願いします。

環境:Chome 38, JQuery 1.10.2

355:Name_Not_Found
14/11/12 23:21:51.01 .net
var Sidebar = Spine.Controller.create({
events: {
"click [data-name]": this.click
},
init: function(){
this.bind("change", this.change);
},
change: function(name){ /* ... */ },
click: function(e){
this.trigger("change", $(e.target).attr("data-name"));
}
// ...
});

というコードがステートフルJavaScriptにあるのですが
events:のthis.clickに違和感があります
clickハンドラをSidebarのclickメソッドにマップしているところですが
ここのthisはSidebarではなく、定義時のthisになりますよね
そして関数ではないので、bindでthisをSidebarにする方法もないですよね
つまりどう考えてもおかしいのではないと思うのですが
何か間違っているのでしょうか?

356:Name_Not_Found
14/11/13 00:55:55.36 .net
もしかしたらオブジェクト定義の中にthisを書いたらオブジェクトがthisになるのかと思って
たしかめたけどやはりそんなことはありませんでした
記述ミスですかね〜

357:Name_Not_Found
14/11/13 02:41:07.64 .net
winXPを久しぶりに起動したらwindows updateが来ていました
またXPのサポートが終わった時から
avg2014が使えなくなっていたのですが
avg2015を入れたら問題なく使えるようになりました
なんだかサポート期限なんてなかったみたいな雰囲気になってますが
ということはIE6が延命していくのでしょうか?

358:Name_Not_Found
14/11/13 03:44:59.71 .net
延命? 命を延ばすわけ無いだろ。
余命過ぎてもまだ生きてるぐらいの意味だ。

359:Name_Not_Found
14/11/13 04:00:55.93 OMP0ufSZ.net
>>351
コード見てないからわからないけど、
click関数が前後のどこかにあるんじゃないの?

360:Name_Not_Found
14/11/13 05:32:24.80 .net
thisは文脈で変わる
各インスタンスのメソッド内では、そのインスタンスを指すけど、
関数がグローバルスコープで呼び出されていたら、
thisはグローバルオブジェクトを指す

thisを出力して確かめて

ECMA Script 3 では、入れ子になった関数内で、thisを使うと、
グローバルオブジェクトを指すというバグがあったが、
ECMA Script 5 では、修正されるらしい

361:Name_Not_Found
14/11/13 07:40:29.75 .net
greasemonkeyスクリプトなんですが、
スクロールを一定回数止めるため以下のように書きました。

var count = 1;
var scrollY;
start();
function start(){
scrollY = document.body.scrollTop;
window.addEventListener('scroll', scrollStop,false);
}
function scrollStop(){
count++;
window.scrollTo(0, scrollY);
if(count > 20) window.removeEventListener('scroll', scrollStop,false);
}

firefoxでは正常に動くのにchromeだとremoveEventListenerがうまく動きません。
chromeに対応させるにはどうしたらいいのでしょうか?

362:Name_Not_Found
14/11/13 08:34:23.28 .net
>>351-352
Spine.Controller.create の中身が不明なので答えようがない

363:Name_Not_Found
14/11/13 10:14:00.68 .net
結構メモリを食うjavaプログラムをjs(+HTML)に移植しています。
メモリエラーが出る関係から、sshを使って他のスペックの高いマシンでjava実行を
していたのですが、jsを同様にスペックの高いマシンの方で実行する方法はあるのでしょうか?
Node.jsのサイトなどを見ていたのですがこれでいいのかよく分からず・・・。
スレチ、文が意味不明、だったらごめんなさい

364:Name_Not_Found
14/11/13 22:44:33.71 .net
>>359
多分nodeでいいよ。

hello.js というファイル名


365:ナconsole.log('hello') って書いて node hello.js とやるとちゃんとhelloって言ってくれる。 ただ、ブラウザで動かしているものをnodeで動かすとしたら ちゃんとJavaScript(ECMAScript)の仕様の範囲にしておかないとダメだけどね。 ブラウザで動かすJavaScriptは、純粋なJavaScriptではなくて DOMというブラウザ専用ライブラリが組み込まれた状態。 だからDOMを使わないコードにしておかないといけない。・・・原則的には。 NodeはNodeでその実行環境にはブラウザを超える能力があるから ライブラリ次第でDOMも使える。 話がそれたけど、別のマシンで動かすならNodeでOK そのコードの書き方はDOMを使わないように気をつけることだね。



366:Name_Not_Found
14/11/14 00:10:33.66 .net
>>360
周りに聞ける人がいないので本当に助かります。
DOMを使わず書けるならそれが望ましい(結果的に楽?)のですね
とりあえずnodeで良さそうなので、もう少し書籍等調べてみます。
ご丁寧にありがとうございました。

367:Name_Not_Found
14/11/14 12:00:00.85 .net
>>356
> ECMA Script 3 では、入れ子になった関数内で、thisを使うと、
> グローバルオブジェクトを指すというバグがあったが、
> ECMA Script 5 では、修正されるらしい
初耳ですが、具体的にはどのようなコードでバグが再現されるのでしょう?
ES3での該当箇所や参考URLがあれば、掲示していただけると助かります

368:Name_Not_Found
14/11/14 15:14:01.80 .net
ソースは2ちゃんです

369:Name_Not_Found
14/11/14 15:42:43.64 .net
バクじゃなくて仕様だよ
ES6のアロー関数では外のthisと同じものを指すらしいけど

370:362
14/11/14 16:04:47.03 .net
>>363
具体的な2chのURLはどこになるでしょう?
また、バグと判断できる根拠は?

>>364
ES3では this はグローバルオブジェクトを参照する仕様ですが、ES5 でも変わってはいません
Strict Mode でのみ this は undefined を参照します
このように理解しているのですが、>>356の勘違いのような気がしてきました

371:Name_Not_Found
14/11/16 07:22:51.19 .net
>>357ですが自己解決しました
あれこれ試した結果、案外単純にwindow.onscrollで一時停止と解除ができました。

結局なぜremove出来なかったのかわからずじまいでしたがお騒がせしました

372:Name_Not_Found
14/11/16 17:53:05.70 EXTL8bVR.net
子Windowで選択した要素を親Windowに追加がしたくて
子Windowで
window.opner.item = selectItem;
親Windowで
$('#itemList').append(item.cloneNode(true));
としてみたのですがIEだけappendの時にHierarchyRequestErrorと出ます
ぐぐってみると子Windowからappendするときはwindow.opnerをつけるという感じのものしか見つからず解決しませんでした
どうしたらいいのでしょうか?

373:Name_Not_Found
14/11/24 02:14:18.29 0uSHMMOL.net
>>367
ウインドウが違うのに要素って移動していいのかな?
子ウインドウであればセキュリティ的には問題ないはずなんだけど
仕様的にどうなんだろう。

興味があるので詳しい人お願い

374:Name_Not_Found
14/11/25 11:09:23.94 .net
配列a(a[3000][3000]くらい)の中身を関数(js)B,C,D・・・で書き換え操作するプログラムを作っています
HTMLでファイルを読み込み、ロードが終わり次第、関数Bを呼び出し、Bが終わり次第
B内でCを呼び出し・・・としています。

これで上手くいけばいいのですが、メモリエラーになってしまいます。
BやC内でもaと同サイズの配列を新たに生成しているためメモリを食うとは思うのですが
やり方としておかしなところがあったりしますでしょうか?
GCのために使わなくなった大きな配列データはnullで初期化してるつもりなのですが・・・

375:Name_Not_Found
14/11/25 19:44:39.66 .net
>>369
>GCのために使わなくなった

それだとGCのタイミングに依存するかも
js 側の処理を中断して一度制御をブラウザ側に返す必要があるかもしれない

可能なら作業用の配列を何度も使い回す方がいいだろう

376:369
14/11/26 08:06:28.71 .net
>>370
GCという機能があるというのは知っていましたが
タイミングを含めて、どのように実行しているか調べていなかったので
開発者ツール?でチェックしてみようかと思います。

どちらかというと、未だによく理解できていないクロージャーの方が
問題かと思っていたのですが、そうでもなかったのですかね。
ご返答ありがとうございました。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

536日前に更新/282 KB
担当:undef