同源访问与cookie

起因:


  组件采用很常见的无刷新上传文件 方式,但在某处应用一直抛出异常:permission denied 以及 domain 相关的错误,仔细排查原来是调用页面设置了 document.domain ,借此机会总结下。



同源策略:


  每个页面都包含两个概念:origin(源)以及 effective script origin


   origin:


有三个组成部分约束,协议scheme,host,port,形成三元组,两个不同源比较正是比较这三个部分。( host 间是完全比较,子域名间相互包含也认为不相同而不能互相访问)


   effective script origin:


默认和 origin 一样,但是可以经由 document.domain 设置 host 与 port 部分,并且一旦设置, port 部分会变成特殊值:"manual override" ,这个值除了和"manual override"相同外不和其他任何值相同。但是要注意的是


1. domain 只能设宽泛,比如页面 xx.iteye.com 的domain可设置为 iteye.com ,但是不能互逆,并且设置只能越来越宽泛,一旦页面 y.xx.com 设置了 xx.com 那么这个页面就再也不能重新设置 domain 为 y.xx.com.

 

2. 对于国际化域名,domain 不能设置太宽泛,比如 xx.javaeye.co.us 的最多可设 javaeye.co.us,而不能是 co.us

 

3. 共享域名的情况要特别注意,最好不要设置domain,否则xx.com 可能会被 xx.com:8080 的页面访问,引发同源保护失效(设置了domain,port就变成"manual override"!).


页面互访规则:


两页面能够互相访问正是比较两个 effective script origin 是否相同,相同的话则可以互相访问,比如 主页面嵌入了一个同一个域名下的子页面,那么如果主页面设置了 document.domain ,那么子页面也必须设置相同的值,否则两者就不能互相通信了,这也正是开头场景遇到的问题。

 

demo @ google code

解决:


对于开头的错误,原先可能 server 端只需返回:

 

{"url":"http://xx/y.jpg"}
 

我们只需访问 iframe.contentDocument.body.innerHTML 来访问浏览器 parse 好的内容,而如果主页面设置了 domain :

 

document.domain='xx.com';
 

那么server 现在需要返回的 iframe 内容需要加入对应的设置相同 domain 脚本:

 

<html>
<head>
<script>
    document.domain="xx.com";    
</script>
</head>
<body>
{ "url":"http://xx.com/sns_album/i3/y.jpg"}
</body>
</html>
 

将脚本单独放在 head 中和 body 分开,则仍然可以取 body 内容,否则脚本会和 body 混合在一起。


延伸:


由于 XHR 也会受到同源策略的影响:

 

y.xx.com 页面不可以发送 xhr 请求给 xx.com ,但是如果在 y.xx.com 设置 domain=xx.com ,就可以发了 (当然仍然可以给 y.xx.com 发送接收 xhr),但是无论怎么设都不可以往 z.xx.com 发送请求,因为 domain 只能设置当前页面 hostname 的后缀!

 

 

另一方面 XHR 作为数据传输技术,没法执行 domain 设置脚本,不过有人已经实现了通过设置 domain 的iframe作为中转层进行通信 , KISSY io 也对此进行了支持。推荐比较简单的替代方案为:JSONP

 

Cookie

 

但是同源策略却和 cookie 完全没有关系, cookie 是自己独立的一套规则 (甚至和访问的 port 端口都没有关系):


0. 注意 cookie 总大小(4k)以及个数(20) 的所有浏览器支持的极端限制


1. 通过服务器 Set-Cookie 或客户端 document.cookie= 进行添加,如果添加后,


 1.1 当前页面的cookie(本host以及host后缀域)总大小 (name=value;串)大于 4096 byte 则添加无效。


 1.2 当前添加域的cookie个数超过上限,添加无效 


通过设置 expire 小于当前事件来控制 cookie 删除.如果不设置 expire,则该 cookie 为 session cookie,浏览器关闭后自动删除。


2. 访问一个页面前,首先列出当前 host 下以及当前 host 的后缀系列下设置的 cookie 列表


3. 对 2 的列表进行循环过滤


   3.1 path 是当前页面的 path 的前缀,进入 3.2 ,否则不发

   3.2 secure == true 并且 页面不是 https ,不发,否则进入 3.3

   3.3 按照 host 以及 path,越特殊的越靠前,(选取个数上限的cookie ? 不确定 !),以name=value;拼成字符串,发送往服务器,(根据 1.1 这个串不大于 4096 byte)

 

reference :


same origin w3 规范


document.domain @ MDC


Same_origin_policy_for_JavaScript @ MDC


Same-origin policy for file: URIs @ MDC


About Cross-Frame Scripting and Security @ MSDN


How to make XMLHttpRequest calls to another server in your domain @ ajaxian

 

 

 

 

 

### 正向差分放大器电流采样实现方式与原理 正向差分放大器是一种能够有效放大两个输入端之间的电压差异并抑制共同模式信号的电路设计。其核心功能在于通过特定的电路配置来提取目标信号,同时减少噪声和其他干扰因素的影响。 #### 差分放大器的工作机制 差分放大器的核心特性是它能放大两路输入信号间的差值(即差模信号),同时显著降低由环境或其他源引入的公共部分(即共模信号)。这种能力使得差分放大器特别适合用于高精度电流检测应用中[^1]。具体来说: - **差模信号增强**:对于理想差分放大器而言,仅会放大大于零的差模成分。 - **共模抑制比 (CMRR)**:衡量差分放大器对共模信号的抑制程度的能力,通常以分贝表示。较高的 CMRR 表明更强的抗干扰性能。 #### 电流采样的基本概念 在工业控制、电力电子以及汽车电子等领域,精确地监控负载上的瞬态电流至关重要。为了完成这一任务,常采用分流电阻法或者磁感应技术来进行电流转换为易于处理的小幅电信号的过程称为电流采样。 ##### 方法一:基于分流电阻的方法 这是最直接的一种形式,其中一个小阻值串联到主回路里作为传感元件。流经此电阻产生的降被送入差动放大级进行进一步处理前先经过滤波等预调理阶段。由于这种方法简单可靠且成本低廉,因此广泛应用于各种场合下中小规模直流/交流电流量测之中[^4]。 ```python # Python模拟简单的I-V转换过程 R_sense = 0.1 # 分流电阻大小, 单位欧姆 current_measured = lambda V_diff: V_diff / R_sense print(f"Measured Current:{current_measured(0.05)}A") # 输出测量得到的电流值 ``` ##### 方法二:利用霍尔效应传感器或互感器间接获取信息 相比前者更复杂一些但具备非接触式的优点尤其适用于高压环境下操作安全考量较多的情况之下。例如INA系列集成芯片内部集成了精密匹配的电阻网络从而实现了非常高的增益准确性达到±1%以内水平并且拥有较低的输入偏置电流有助于提高整体系统的稳定性表现[^2]。 另外还有一种叫做罗氏线圈的技术方案尽管也有不错的表现不过相较于传统CT型产品存在一定的局限性比如需要额外配备缓冲放大环节才能满足ADC接口需求等问题所以并不总是首选项除非特殊应用场景确实需要用到动态范围更大的解决方案时才会考虑选用[^3]。 综上所述无论是哪种类别的硬件设施最终目的都是围绕着如何准确无误地捕捉原始物理量并将之转化为可供后续数字化分析使用的标准格式数据点序列而已!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值