小编rov*_*ver的帖子

Rails引擎中的迁移?

我有多个rails应用程序与同一个后端交谈,我希望他们分享一些迁移.
我设置了一个rails引擎(带有enginex),我可以共享任何东西(控制器,视图,模型......)但没有迁移.我做不到!

我尝试创建一个文件db/migrate/my_migration.rb,但在我的主应用程序中,如果我这样做:

  rake db:migrate
Run Code Online (Sandbox Code Playgroud)

它不加载它们.

经过一番Google上搜寻它似乎有一些最近的工作在这,似乎已经合并轨主.我用rails 3.0.3你有没有办法让这个工作?

谢谢 !

ruby-on-rails rails-engines ruby-on-rails-3

37
推荐指数
6
解决办法
2万
查看次数

检查特定的活动记录对象是否在特定的"范围"中

目前正在保存中我试图查看录制的内容是否属于特定的"范围".这个"范围"实际上只是.where调用的一些保存参数.此外,对于这个"范围",我只检查对象的值,而不是它与数据库中其他对象的关系,因此如果有意义的话,查询数据库将永远被过度杀死.

我只能提出以下解决方案

begin
   result = self.class.where(scope).find(self.id)
rescue
  result = false
end
Run Code Online (Sandbox Code Playgroud)

这个问题是我必须查询数据库,即使我已经有了记录,我不仅要在保存之前运行它,而是在保存后检查它的值以及保存后的值,因为那里如果尚未保存更新版本,则无法查询数据库.

可以有很多这样的检查,所以我想避免不得不两次,并且还要多次查询数据库,即使最终我只是通过id查找内容.

我能够想到的唯一其他解决方案是有一个方法,一些如何将where调用转换为proc,在传递一个对象时返回一个布尔值.唯一的问题是翻译它将如何使用正在使用的活动记录适配器,这似乎是一个完整的项目.那么有谁知道这样做的一些方法,或者有助于它的宝石?

PS我从缓存中获取"范围",因此我无法将其保存为proc,因为您无法使用Rails将procs放入缓存中.

activerecord ruby-on-rails

8
推荐指数
1
解决办法
3680
查看次数

正则表达式检测基本SQL注入,但不是防止SQL注入的手段

首先,我要说的是,我采取了一些措施来确保SQL注入攻击失败.所有SQL查询值都是通过活动记录预处理语句完成的,所有运算符(如果不是硬编码的)都是通过数字白名单系统完成的.意思是如果有人想通过"ILIKE"进行搜索,他们会传递6,如果他们想通过"="进行搜索,他们会传递1,等等.

我还定期使用BrakemanRails SQL Injection指南来查看代码.

因此,我希望阻止尝试的SQL注入器有三个原因.

  1. 我们得到了很多脚本小子试图破解我们.其中大部分已被阻止至少一次,因为我们有一个文件扩展名白名单系统,当他们尝试请求php文件时阻止其中的大多数.虽然他们第一次被列入黑名单,但在第二轮他们通常会尝试将SQL注入书扔给我们.所以我想提前标记这些小孩来节省带宽,如果一个真正的演员在哪里攻击我们,很容易从所有的脚本小子中排除它们.
  2. 减慢任何探索我们防御的企图.这不会真正影响复杂的分布式攻击,但可能会减慢脚本小子和超级黑客之间的角色.
  3. 标记所有被阻止的请求并设置日志通知,然后我们将通过日志服务通知我们以提高我们的安全意识.

目前我的想法是针对请求路径和参数运行一个简单的正则表达式匹配,以便标记最明目张胆的SQL注入尝试并将这些ips列入黑名单,所以使用机架攻击.

injection_regex = /SOMEREGEXHERE/

Rack::Attack.blacklist('sql injection blacklist') do |req|
  Rack::Attack::Fail2Ban.filter(req.ip, :maxretry => 5, :findtime => 10.minutes, :bantime => 24.hours) do
    CGI.unescape(req.query_string).match(injection_regex) || req.path.match(injection_regex)
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是创建一个正确的标记一个简单的SQL注入尝试的正则表达式,但不会导致常规用户的任何问题.我认为一些误报是可以的,这就是为什么上面的黑名单系统在第一场比赛后没有列入黑名单的原因.

在我的搜索中,我发现了很多关于这个问题的问题,但是它们似乎都是这样的,人们提出使用正则表达式来检测SQL注入的问题,另一个人回答你不应该以这种方式停止SQL注入,问这些问题的人回答他们不会使用正则表达式来停止,而只是为了检测,然后是一堆无用的评论.

那么,这样的正则表达式是否有可能仅仅作为一种检测手段,最小的误报,或者这样的兔子整体是否值得努力?

regex sql-injection ruby-on-rails rackattack

5
推荐指数
1
解决办法
2602
查看次数

Postgresql Hstore 和 Toast Bloat

我使用 hstore(Postgresql 9.3.4)来存储给定日期内每次发生事件的计数,更新如下。

days_count = days_count || hstore('x', (coalesce((days_count -> 'x')::integer, 0) + 1)::text)
Run Code Online (Sandbox Code Playgroud)

其中 x 是一年中的第几天。在运行生产预期行为的模拟之后,在分析和真空之后,我最终得到了一个150MB + 2GB Toast + 25-30MB 索引的表。

我现在将上面的列分成每个月的一列,如下所示

y_month_days_count = y_month_days_count || hstore('x', (coalesce((y_month_days_count -> 'x')::integer, 0) + 1)::text)
Run Code Online (Sandbox Code Playgroud)

其中 x 是该月中的第几天,y 是一年中的月份。 我现在仍在运行模拟,但到目前为止,已经完成了三分之一,我的内存为 60MB + 相当稳定的 20-30MB Toast + 25-30MB 索引。这意味着最终我应该得到大约180MB + 30-40MB 用于 Toast + 25MB-30MB 用于分析和真空之后的索引

那么首先,Hstore 和 Toast 膨胀是否存在任何已知问题可以解释我的第一次设置问题?

其次,我当前的分解列的解决方案是否会因为一张表上的 hstore 列数量而导致未来的 hstore 和性能出现任何类型的问题?现在似乎很稳定,行数达到数十万,虽然我知道更多的列会使速度变慢,但我不确定 hstore 列的情况是否会更糟。

最后我确实发现了一些东西。我有一个 hstore 列,最终代表一天中的每一个小时,因此它有 24 个不同的键。当我仅针对此列运行模拟时,我最终几乎没有以 KB 为单位的 toast,但是当我运行整个模拟时,将天数分解为月份列,我最大的 hstore …

postgresql hstore postgresql-9.3

2
推荐指数
1
解决办法
855
查看次数