But I called SetSecurityToken to set different token for each context. I 
commented out the SetAccessCheckCallback calls to let access to be 
controlled only by SetSecurityToken. Even if I add 
"SetAccessCheckCallback(AccessAlwaysBlocked);" statement, the cross access 
are still allowed in Modification Three and Four.

在 2018年6月1日星期五 UTC+8下午3:46:29,Ben Noordhuis写道:
>
> On Thu, May 31, 2018 at 3:52 AM,  <fengx...@gmail.com <javascript:>> 
> wrote: 
> > ur... I still can not get it.  In the following modification, I changed 
> > object x by scripts. 
> > 
> > Modification Three: 
> > 
> > TEST(EvalInAccessCheckedContext) { 
> >   v8::Isolate* isolate = CcTest::isolate(); 
> >   v8::HandleScope scope(isolate); 
> > 
> >   v8::Local<v8::ObjectTemplate> obj_template = 
> > v8::ObjectTemplate::New(isolate); 
> > 
> >   //obj_template->SetAccessCheckCallback(AccessAlwaysAllowed); 
> > 
> >   v8::Local<Context> context0 = Context::New(isolate, NULL, 
> obj_template); 
> >   v8::Local<Context> context1 = Context::New(isolate, NULL, 
> obj_template); 
> > 
> >   Local<Value> foo = v8_str("foo"); 
> >   Local<Value> bar = v8_str("bar"); 
> > 
> >   // Set to different domains. 
> >   context0->SetSecurityToken(foo); 
> >   context1->SetSecurityToken(bar); 
> > 
> >   // Set up function in context0 that uses eval from context0. 
> >   context0->Enter(); 
> >   v8::Local<v8::Value> fun = CompileRun( 
> >       "var x = {a:42};" 
> >       "(function() {" 
> >       "  var e = eval;" 
> >       "  return function(s) { return x; }" 
> >       "})()"); 
> >   context0->Exit(); 
> > 
> >   // Put the function into context1 and call it. Since the access check 
> >   // callback always returns true, the call succeeds even though the 
> tokens 
> >   // are different. 
> >   context1->Enter(); 
> >   context1->Global()->Set(context1, v8_str("fun"), fun).FromJust(); 
> >   v8::Local<v8::Value> x_value = CompileRun("var c = fun('x'); c.a = 43; 
> c.b 
> > = 45;"); //change x object by scripts 
> >   CHECK_EQ(45, x_value->Int32Value(context1).FromJust()); 
> >   context1->Exit(); 
> > 
> >   context0->Enter(); 
> >   x_value = CompileRun("x.a"); 
> >   CHECK_EQ(43, x_value->Int32Value(context0).FromJust()); // change is 
> > allowed 
> > 
> >   x_value = CompileRun("x.b"); 
> >   CHECK_EQ(45, x_value->Int32Value(context0).FromJust()); // change is 
> > allowed 
> >   context0->Exit(); 
> > } 
> > 
> > Modification Four : 
> > 
> > TEST(EvalInAccessCheckedContext) { 
> >   v8::Isolate* isolate = CcTest::isolate(); 
> >   v8::HandleScope scope(isolate); 
> > 
> >   v8::Local<v8::ObjectTemplate> obj_template = 
> > v8::ObjectTemplate::New(isolate); 
> > 
> >   //obj_template->SetAccessCheckCallback(AccessAlwaysAllowed); 
> > 
> >   v8::Local<Context> context0 = Context::New(isolate, NULL, 
> obj_template); 
> >   v8::Local<Context> context1 = Context::New(isolate, NULL, 
> obj_template); 
> > 
> >   Local<Value> foo = v8_str("foo"); 
> >   Local<Value> bar = v8_str("bar"); 
> > 
> >   // Set to different domains. 
> >   context0->SetSecurityToken(foo); 
> >   context1->SetSecurityToken(bar); 
> > 
> >   // Set up function in context0 that uses eval from context0. 
> >   context0->Enter(); 
> >   v8::Local<v8::Value> fun = CompileRun( 
> >       "var x = 42;" 
> >       "var y = function() {return x;};" // y is a function which is set 
> up 
> > in context0. 
> >       "(function() {" 
> >       //"  var e = eval;" // this line will fail test 
> >       "  var e = y;"  // this line will pass test 
> >       "  return function(s) { return e(s); }" 
> >       "})()"); 
> >   context0->Exit(); 
> > 
> >   // Put the function into context1 and call it. Since the access check 
> >   // callback always returns true, the call succeeds even though the 
> tokens 
> >   // are different. 
> >   context1->Enter(); 
> >   context1->Global()->Set(context1, v8_str("fun"), fun).FromJust(); 
> >   v8::Local<v8::Value> x_value = CompileRun("fun('x');"); 
> >   CHECK_EQ(42, x_value->Int32Value(context1).FromJust()); 
> >   context1->Exit(); 
> > } 
> > 
> > I also find another test case. In the test case, all operations are 
> write by 
> > c++ code, and SetSecurityToken can control access. 
> > 
> > Another test case: 
> > 
> > THREADED_TEST(MultiContexts) { 
> >   v8::Isolate* isolate = CcTest::isolate(); 
> >   v8::HandleScope scope(isolate); 
> >   v8::Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 
> >   templ->Set(v8_str("dummy"), 
> >              v8::FunctionTemplate::New(isolate, DummyCallHandler)); 
> > 
> >   Local<String> password = v8_str("Password"); 
> >   Local<String> password2 = v8_str("Password2"); // another token 
> >   // Create an environment 
> >   LocalContext context0(0, templ); 
> >   context0->SetSecurityToken(password); 
> >   v8::Local<v8::Object> global0 = context0->Global(); 
> >   CHECK(global0->Set(context0.local(), v8_str("custom"), v8_num(1234)) 
> >             .FromJust()); 
> >   CHECK_EQ(1234, global0->Get(context0.local(), v8_str("custom")) 
> >                      .ToLocalChecked() 
> >                      ->Int32Value(context0.local()) 
> >                      .FromJust()); 
> > 
> >   // Create an independent environment 
> >   LocalContext context1(0, templ); 
> >   context1->SetSecurityToken(password2);// set another token 
> >   v8::Local<v8::Object> global1 = context1->Global(); 
> >   CHECK(global1->Set(context1.local(), v8_str("custom"), v8_num(1234)) 
> >             .FromJust()); 
> >   CHECK(!global0->Equals(context1.local(), global1).FromJust()); 
> >   CHECK_EQ(1234, global0->Get(context1.local(), v8_str("custom")) // 
> this 
> > line will fail if tokens are not matched 
> >                      .ToLocalChecked() 
> >                      ->Int32Value(context0.local()) 
> >                      .FromJust()); 
> > 
> > //skip some codes below 
> > ... 
> > } 
>
> Note that you need to set an access check callback to enable access 
> checks.  Since you commented out the SetAccessCheckCallback calls, 
> they aren't enabled. 
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to