我一直在使用 CodeIgniter 版本 2.1.4 和 Ion Auth很长一段时间,一切都很好。昨天,我将 Ion Auth 更新到最新版本,现在每当我尝试“编辑”任何用户配置文件时都会收到 CSRF 错误。
"This form post did not pass our security checks."
我在修改 controllers/auth.php 文件后收到此错误,以便将各种 Ion Auth View 加载到我自己的模板中。毕竟,如果我不能将它集成到我的网站设计中,那又有什么用呢。 但是,即使 auth.php Controller 根本没有修改,我在旧版本的 Safari 中也会遇到此错误。
这是我对auth.php Controller 文件的简单修改。
替换了这一行:
$view_html = $this->load->view($view, $this->viewdata, $render);
用这一行:
$view_html = $this->template->load('default', $view, $this->viewdata, $render);
是的,我的load 函数(位于/libraries/ 的Template.php 文件中)从一开始就运行良好(很多个月前)。即使使用新版本的 Ion Auth,我的模板加载功能也能正常工作...但是,我只是不断收到如上所述的安全错误。
经过一番研究,错误的原因是 Ion Auth 的 CSRF 安全例程。这两个函数在整个 auth.php Controller 中被调用,并在 _valid_csrf_nonce() 函数返回 false 时显示上面的错误。
function _get_csrf_nonce()
{
$this->load->helper('string');
$key = random_string('alnum', 8);
$value = random_string('alnum', 20);
$this->session->set_flashdata('csrfkey', $key);
$this->session->set_flashdata('csrfvalue', $value);
return array($key => $value);
}
function _valid_csrf_nonce()
{
if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE &&
$this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue'))
{
return TRUE; // <-- no error
}
else
{
return FALSE; // <-- error
}
}
作为临时(或永久?)解决方法,我在 CodeIgniter config/config.php 文件的第 298 行启用了“CSRF 保护”选项。
$config['csrf_protection'] = TRUE; // enabled CSRF protection
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
然后我通过始终从函数返回 true 来抑制 Ion Auth 中的 CSRF 保护。
function _valid_csrf_nonce()
{
return TRUE;
}
但是,我真的很想了解这里的根本原因。为什么我仅仅通过使用旧版浏览器或尝试将 Ion Auth View 放入我自己的模板中就会收到所有这些 CSRF 错误?一切都在使用相同域的同一台服务器上。
(编辑:是的,CI session 库正在自动加载并且显然工作正常。毕竟我可以保持登录状态。)
最佳答案
我从来没有找到根本原因,但我有一个理论可以解释其中的一些原因:
Ion Auth CSRF 保护依赖于 flashdata,其中 flashdata 仅在对服务器的“下一次”调用中存在。我的自定义模板加载器可能会调用服务器两次,因为它首先调用构建页面的加载器函数,然后调用 CodeIgniter 的 View 函数。
但是,这个理论并不能真正解释为什么未经修改的 Ion Auth 版本在 Safari 中仍然失败。如果您可以对此添加任何实质性或结论性的内容,请随时发布另一个答案。
根据 Ion Auth 开发者 Ben Edmunds 的个人回应...
"We added CSRF protection to the Ion Auth examples before CI built them into the framework so you might be best just removing them from the Ion Auth example controller and views if you’re using a newer version of CI with that built in."
因为我已经在使用最新版本的 CodeIgniter (2.1.4),所以我决定走这条路。
我的 OP 的临时解决方法现在是永久性的:
我在 CodeIgniter config/config.php 文件的第 298 行启用了“CSRF 保护”选项。
$config['csrf_protection'] = TRUE; // enabled CSRF protection
然后我通过始终从此函数返回 true 来抑制 Ion Auth 中的 CSRF 保护。
function _valid_csrf_nonce()
{
return TRUE; // effectively disables Ion Auth's CSRF protection
}
最后,开发人员评论使用 CodeIgniter 的 CSRF 保护:
"Cool, that's really a better solution anyway since it's integrated throughout your application."
关于php - CodeIgniter 2,Ion Auth 在配置文件编辑时给出 CSRF 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713124/
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe
如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化