我有许多 MySQL 表,描述了诸如“用户”、“业务”等模型。这些表的主键是否应该暴露给客户端?我主要是从安全角度提问,但还有其他我没有想到的考虑因素吗?
最佳答案
暴露您的主键(特别是如果它们是可预测的)是一个称为不安全直接对象引用的漏洞。
通过这样的 URL(或任何其他客户端提供的参数):
http://www.domain.com/myaccount?userid=12
您让您的最终用户有机会处理这些变量并传递他们喜欢的任何数据。缓解此漏洞的对策是改为创建间接对象引用。这听起来像是一个很大的变化,但不一定非得如此。您不必去重新键入所有表或任何其他内容,只需通过使用间接引用 map 巧妙地处理数据即可做到这一点。
考虑一下:您有一位用户正在您的网站上进行购买。当需要付款时,他们会看到您“存档”的信用卡号码的下拉列表。如果您查看下拉列表的代码,您会发现信用卡号与 key 8055、9044 和 10099 相关联。
用户可能会看到这个并认为它们看起来很像自动递增的主键(用户可能是对的)。因此,他开始尝试使用其他 key ,看看是否可以使用其他人的卡进行支付。
现在从技术上讲,您应该在服务器端有代码来确保所选卡是用户帐户的一部分并且他们可以使用它。这是一个人为的例子。现在我们假设情况并非如此,或者这是另一种可能没有那种服务器端控制的表单。
那么我们如何防止最终用户选择他们不应该使用的 key ?
与其向他们显示对数据库中记录的直接引用,不如向他们提供间接引用。
我们将在服务器上创建一个数组并将其填充到用户的 session 中,而不是将数据库键放入下拉列表中。
Array cards = new Array(3);
cards[0] = 8055;
cards[1] = 9044;
cards[2] = 10099;
在下拉列表中,我们现在提供对存储卡片的数组索引的引用。因此,如果最终用户查看源代码,他们将看到值 0、1 和 2,而不是实际的键。
当提交表单时,这些值之一将被传递。然后我们从用户的 session 中获取数组并使用索引获取值。实际 key 从未离开过服务器。
如果用户愿意,他可以全天传递不同的值,但他永远不会得到除他自己的卡片以外的结果,无论服务器端访问控制是否到位。
请记住,当使用传入的索引获取值时,如果用户确实弄乱了它,您可能会遇到一些异常(ArrayOutOfBounds、InvalidIndex 等)。因此,将这些东西包装在 try/catch 中,这样您就可以抑制这些错误并记录失败以寻找破解尝试。
希望这对您有所帮助。
要了解有关不安全直接对象引用的更多信息,请查看 OWASP 前 10 名。风险编号为 A4。 https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References
关于mysql - MySQL表的主键应该暴露吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451348/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我有1.8.6附带的VanillaMacOSXLeopard。我是RoR的新手,所以会学习网上的教程。在使用更高版本的Ruby时,我是否可能会发现遵循它们的问题?我目前正在查看提到1.8.6和1.8.7的这个-http://www.railstutorial.org/book 最佳答案 RoR教程对两者都适用,但如果您正在学习Ruby,则应该学习1.9。Rails3将不支持1.8.6,所以我会选择1.8.7或1.9。我还推荐使用RVM在Ruby版本之间切换。 关于ruby-on-rail
假设我的Rails项目中有一个设置实例变量的Ruby类。classSomethingdefself.objects@objects||=begin#somelogicthatbuildsanarray,whichisultimatelystoredin@objectsendendend是否可以多次设置@objects?是否有可能在一个请求期间,在上面的begin/end之间执行代码时,可以在第二个请求期间调用此方法?我想这实际上归结为Rails服务器实例如何fork的问题。我应该改用Mutex还是线程同步?例如:classSomethingdefself.objectsreturn@o
构建一个深度优先的网络蜘蛛,这意味着它将访问第一页上的所有链接,然后转到每个链接,并访问所有第二页上的链接...你应该使用递归吗?我发现这是CPU密集型的。defrecursion()linkz_on_first_page.eachdo|link|recursion(link)endendrecursion(firstpage) 最佳答案 绝对不是,由于万维网的实际性质,您很快就会遇到问题。当您访问带有主导航部分的网站时,每个页面都链接到其他页面,您就进入了一个无限循环。您可以跟踪您处理了哪些链接,但即便如此,递归循环并不真正适合万