rails安全问题

rails已经为我们防范了大部分的漏洞攻击。但是更具危险的漏洞, 大部分都是由于开发人员的代码问题导致的,讲几个由于代码问题导致的漏洞。

1.eval(可执行字符串) eval很强大,也很危险.

基本用法 文档

1
2
3
4
5
6
def get_binding(str)
return binding
end
str = "hello"
eval "str + ' Fred'" #=> "hello Fred"
eval "str + ' Fred'", get_binding("bye") #=> "bye Fred"

Unsafe

1
2
3
4
5
6
# xxx_controller.rb
def test_eavl
datas = (eval params[:model_name]).limit(10)
render :jons => datas
end

如果传参model_name = “rm -rf /“,后果是不可想像的

rails安全,CSRF和注入攻击(XSS,SQL注入)

Web安全在web开发中占有相当重要的地位,今天介绍下关于web安全方面的问题(CSRF,和注入攻击),以及rails是如何实现来防止这些攻击的。

首先介绍下什么是CSRF?中文名称:跨站请求伪造

  • 简介:

    跨站请求伪造的工作原理是,通过在页面中包含恶意代码或链接,访问已验证用户才能访问的 Web 应用。如果该 Web 应用的会话未超时,攻击者就能执行未经授权的操作。

  • 原理:

    大多数应用都使用基于 cookie 的会话。它们或者把会话 ID 储存在 cookie 中并在服务器端储存会话散列,或者把整个会话散列储存在客户端。不管是哪种情况,只要浏览器能够找到某个域名对应的 cookie,就会自动在发送请求时包含该 cookie。有争议的是,即便请求来源于另一个域名上的网站,浏览器在发送请求时也会包含客户端的 cookie。

  • 举例:

我们在本地分别起两个服务(修改/etc/hosts 将两个域名指向本地,然后通过nginx反向代理),来演示1. www.mubiao.com 为我们要攻击的网站,2. www.hacker.com 为我们自己的网站。假设我们已经猜测出目标网站的某些可用的url,比如:

1
2
http://www.mubiao.com/orders.html
http://www.mubiao.com/ancient/articles

然后我们在自己的网站上做一些陷阱,在某个页面加入

1
2
3
4
5
6
7
8
9
<img src='http://www.mubiao.com/orders.html' >
<a href="#" onclick="
var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'post';
f.action = 'http://www.mubiao.com/ancient/articles';
f.submit();
return false;">点我啊</a>

rails sunspot solr如何使用主从模式Master/Slave

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎.
随着solr索引数量量的增大,更新时间以及索引时间,都会增加。
关于solr的集群主要分为主从和SolrCloud两种。这里主要介绍一下主从的配置。它主要实现:在master节点进行数据写操作,在slave节点进行读操作。当并发量大些,可以通过扩展slave节点数来应对,多个slave做一个反向代理和负载均衡。
主节点配置:solr/conf/solrconfig.xml

1
2
3
4
5
6
7
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">commit</str>
<str name="replicateAfter">startup</str>
<str name="confFiles">schema.xml,stopwords.txt,spellings.txt,synonyms.txt</str>
</lst>
</requestHandler>

master 标志该core 为主节点。复制的行为发生在commit、startup之后。cofFiles表示,向从节点复制的配置文件(记住,主从的solrconfig.xml配置不一样,不要把solrconfig.xml也复制到从节点了)。  
再看下slave从节点的配置:solr/conf/solrconfig.xml

1
2
3
4
5
6
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://192.168.1.100:8983/solr/default</str>
<str name="pollInterval">00:00:20</str>
</lst>
</requestHandler>

pollInterval 表示多久向master同步一次数据,数据格式{时}:{分}:{秒}。这个要根据你的业务场景。如果更新比较频繁,就把这个值调小点,反之,就调大些。在同步数据时,根据网络和机器配置等不同,slave之间的数据会存在不同步的情况。如果,你对此有要求,需要注意了。总之,任何一种集群方案都不是万能的。

在rails里,sunspot.yml配置如下:

1
2
3
4
5
6
7
8
9
10
11
production:
solr:
hostname: slave-solr-server
port: 8983
master_hostname: master-solr-server
master_port: 8983
log_level: WARNING
master_solr:
hostname: master-solr-server
port: 8983
log_level: WARNING