最近在实际开发过程中,需要对项目的http响应头做一些配置,以防止各类XSS攻击、点击劫持等。这些HTTP响应头在我们部署 Nginx 的时候经常会被忽略掉,个人感觉这是一个比较严重的“疏忽”,加上还是很有必要的,现把用到的一些配置记录一下。
Strict-Transport-Security (通常简称为 HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是 HTTP。
语法:
1.strict-transport-security: max-age=<expire-time>
2.strict-transport-security: max-age=<expire-time>; includeSubDomains
3.strict-transport-security: max-age=<expire-time>; includeSubDomains; preload
示例:
#add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
释义:
max-age=<expire-time> 设置在浏览器收到这个请求后的 秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
includeSubDomains 可选,如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
preload 可选,加入预加载列表
CSP 是一个计算机的安全标志,主要用来防止 XSS、点击劫持、SQL 注入等攻击;CSP 通过定义运行加载脚本的位置和内容防止恶意代码的加载。
作用:用于定义页面可以加载哪些资源,减少和上报 XSS 的攻击,防止数据包嗅探攻击。
使用方法:
#add_header Content-Security-Policy "default-src 'self'"
元素也可以用于配置 CSP:

指令值可以由下面内容组成:

用来监管哪些访问来源信息——会在 Referer 中发送——应该被包含在生成的请求当中。(注意 Referer 实际上是单词 “referrer” 的错误拼写。Referrer-Policy 这个首部并没有延续这个错误拼写。)
作用:增加隐私保护。
语法:
1.Referrer-Policy: no-referrer
2.Referrer-Policy: no-referrer-when-downgrade
3.Referrer-Policy: origin
4.Referrer-Policy: origin-when-cross-origin
5.Referrer-Policy: same-origin
6.Referrer-Policy: strict-origin
7.Referrer-Policy: strict-origin-when-cross-origin
8.Referrer-Policy: unsafe-url
可配置值:
no-referrer:不允许被记录。
origin:只记录 origin,即域名。
strict-origin:只有在 HTTPS -> HTTPS 之间才会被记录下来。
strict-origin-when-cross-origin:同源请求会发送完整的 URL;HTTPS->HTTPS,发送源;降级下不发送此首部。
no-referrer-when-downgrade(default):同 strict-origin。
origin-when-cross-origin:对于同源的请求,会发送完整的 URL 作为引用地址,但是对于非同源请求仅发送文件的源。
same-origin:对于同源请求会发送完整 URL,非同源请求则不发送 referer。
unsafe-url:无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(可能会泄漏敏感信息)。
使用方法:
#add_header Referrer-Policy "no-referrer-when-downgrade";#大多数浏览器的默认值
是否允许一个页面可在 < frame >、< iframe >、< embed > 或者 < object > 中展现的标记。(备注:<> 之间没有空格,这里写入 HTML 中会导致文章内容变形)
frame 标签:框架标签,放置一个 HTML 文档(页面)iframe 标签:内联框架标签,在一个 HTML 页面中显示(插入)另一个 HTML 页面embed 标签:音频元素标签,插入一个音频元素object 标签:定义外部内容的容器标签作用:减少/避免点击劫持 (clickjacking) 的攻击。
语法:
X-Frame-Options: DENYX-Frame-Options: SAMEORIGINX-Frame-Options: ALLOW-FROM https://example.com/响应头支持三种配置:
DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。ALLOW-FROM uri:表示该页面可以在指定来源的 frame 中展示。使用方法:
#add_header X-Frame-Options "SAMEORIGIN";
X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为。
作用:禁用浏览器的 Content-Type 猜测行为。
背景:浏览器通常会根据响应头 Content-Type 字段来分辨资源类型。有些资源的 Content-Type 是错的或者未定义。这时,浏览器会启用 MIME-sniffing 来猜测该资源的类型,解析内容并执行。利用这个特性,攻击者可以让原本应该解析为图片的请求被解析为 JavaScript。
使用方法:
# add_header X-Content-Type-Options "nosniff";
Permissions Policy由之前的Feature Policy更名而来,用法也做了相应的变动。Feature Policy 是一个新的 http 响应头属性,允许一个站点开启或者禁止一些浏览器属性和 API,来更好的确保站点的安全性和隐私性。有点类似内容安全策略,但是它控制的是浏览器的特征而不是安全行为。
语法:
Feature-Policy: <feature> <allowlist>
允许开启或者禁止的浏览器属性和API列表
许开启或者禁止的浏览器属性和API列表还没有完全敲定,具体可参考Features list
示例
禁用摄像头和定位 API,则可以在返回的 response 中传递以下定义 feature policy 的 HTTP 的头部信息:
add-header: “Feature-Policy: camera ‘none’; geolocation ‘none’”
# add_header Feature-Policy "camera 'none'; geolocation 'none'f";
语法变更:
原有 Feature-Policy 示例:
"Feature-Policy": "camera 'none'; microphone 'none'"
Permissions-Policy 语法变更为:
"Permissions-Policy": "camera=(),microphonee=()"
使用方法:
#反谷歌追踪FLoC
#add_header Permissions-Policy "interest-cohort=()"
上面只列举了我所用到的HTTP安全标头,实际应用中还有其他一些HTTP安全表头配置,感兴趣的可以参考这篇文章 https://blog.csdn.net/netgc/article/details/110928141
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg