RailsCasts中文版,#25 SQL Injection 谨防SQL注入

本文讨论了Rails框架中防止SQL注入的基本安全原则,包括小心处理用户输入、使用参数化查询等方法,以确保应用程序的安全性。

接下来的几篇,我们会讨论一些关于安全的话题,以免你的站点频频遭受黑客的攻击。其中第一个基本安全原则就是永远不要信赖来自用户的输入。在Rails中来讲就是说,从页面参数中传递进来的数据一定要小心对待。用户可以有意的设置参数值,甚至可以设置参数键,所以得谨慎的使用。这个原则对于cookie数据也同样适用。而会话数据中的内容是由我们的程序控制的,可以放心使用。

所有安全问题中,SQL注入是最最臭名昭著的了。当糟糕的代码实现将用户输入的SQL语句直接拼接在请求中提交至数据库,这悲剧的一切就发生了。通过一个例子来说明吧:

小例子:任务查询

在这个例子中,用户可以在输入框中写入查询条件,点击"Search"后系统会向数据库提交一个类似于SQL语句的查询并返回名称与输入匹配的所有任务。

用户输入被直接传递到了向数据库发送的请求中,这样实现是有安全风险的。

class TasksController < ApplicationController
 def index
  @tasks = Task.find(:all,:conditions=>"name LIKE ’%#{params[:query]}%’")
 end
end

TasksController 代码展示了一个不安全的SQL查询。

问题在于,如果用户在输入框中不是简单的输入一个任务的名称,而是一个单引号后面再随便写点什么比如他输入Task1 'test。查询下发后就会报错了。

Processing TasksController#index (for 127.0.0.1 at 2009-02-01 21:29:26) [GET]
  Parameters: {"query"=>"Task 1’TEST"}
  Task Load (0.0ms)   SQLite3::SQLException: near "TEST": syntax error: SELECT * FROM "tasks" WHERE (name like ’%Task 1’TEST%’) 

ActiveRecord::StatementInvalid (SQLite3::SQLException: near "TEST": syntax error: SELECT * FROM "tasks" WHERE (name like ’%Task 1’TEST%’) ):

如果用户输入单引号会导致SQL语句生成错误。

我们代码中的SQL语句中本来期待用户输入一个查询条件,可是没想到他却输入了一个单引号,一下子将SQL语句给结束了。单引号后面的部分又成了一个不完整的SQL语句,执行起来肯定就要报错了。如何做能避免这种情况发生呢?

解决方法是避免让查询条件中出现本应我们自己控制的单引号。Rails为我们提供了方便的手段完成这个工作。将SQL语句中的参数用一个?代替后放在一个数组的第一个元素。数组中后面的元素依次替换SQL语句中站位的?的值。如果语句中有三个地方需要通过参数传入,那么我们需要创建一个长度是四的数组,第二个到第四个元素分别代表三个参数。

@tasks = Task.find(:all, :conditions=> [ "name LIKE ?", "%#{params[:query]}%" ]

这是更好更安全的实现方法。

接下来如果在界面中输入带有单引号的查询条件,Rails会将单引号转义为普通的字符,而不是被认为SQL格式中的一部分。还差一点儿,咱们希望进行的是LIKE操作的模糊查询,需要在查询条件两边带上百分号。需要注意的是,百分号需要添加在参数数组的元素两边而不是在SQL语句的问号两边。日志中可以看到查询是正确的。

Processing TasksController#index (for 127.0.0.1 at 2009-02-01 21:59:31) [GET]
  Parameters: {"query"=>"Task 1’TEST"}
  Task Load (0.5ms)   SELECT * FROM "tasks" WHERE (name like ’%Task 1’’TEST%’)

这样就完美解决了单引号的问题。

Note that as we’re using Sqlite the quote is escaped by using two single quotes. Other databases may use a backslash before the quote.

只有在使用find方法中使用:conditions参数进行查询是才需要考虑避免SQL注入。如果你使用的是更新的查询方法find_by可以参考《RailsCasts中文版,#2 Dynamic find_by Methods 使用动态的find_by方法进行查找操作》 Rails会自动处理这些问题防止SQL注入发生。


作者授权:You are welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.

原文链接:http://railscasts.com/episodes/25-sql-injection


内容概要:本文围绕“组稀疏信号去噪”展开,深入研究了基于非凸正则化与凸优化的信号处理方法,并提供了完整的Matlab代码实现。文章系统阐述了如何通过引入非凸正则项克服传统稀疏恢复方法的局限性,从而在语音增强等实际应用中实现更优的去噪性能。研究采用组稀疏建模范式,将信号按子带或时频块进行分组,以更好地保留信号的结构性特征。文中详细构建了相应的数学模型,将原始优化问题转化为可通过凸优化技术求解的形式,并设计了高效的求解算法。通过全面的仿真实验,验证了该方法在提升信噪比和改善语音主观质量方面的显著优势,尤其在强噪声环境下表现出更强的鲁棒性。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事语音增强、音频处理、通信工程等相关领域的技术研发人员。; 使用场景及目标:①应用于语音通信系统、智能助听设备、语音识别前端预处理等对语音清晰度要求高的场景,有效提升嘈杂环境下的语音可懂度;②为科研工作者提供一个将非凸正则化理论与凸优化算法相结合的完整研究范例,促进先进信号恢复算法在实际工程系统中的转化与应用。; 阅读建议:建议读者结合提供的Matlab代码,深入剖析算法实现的核心步骤,重点关注目标函数的设计理念、非凸正则项的选取依据以及优化求解器的具体实现;同时,鼓励通过调整算法参数或在不同类型的噪声环境中进行测试,以探究算法的性能边界和鲁棒性特征。
内容概要:本文档聚焦于三电平ANPC并网逆变器的先进控制策略研究,重点阐述了一种融合DPWMA(离散脉宽调制)调制、正负序电流分离控制与电网电压前馈补偿的复合控制方法,并基于Simulink平台完成了系统建模与仿真验证。该方法旨在提升逆变器在电网电压不平衡等复杂工况下的动态响应性能与运行稳定性,特别针对低电压穿越(LVRT)能力进行了优化设计。研究内容还涵盖了中点电位平衡控制、虚拟同步发电机(VSG)技术以及构网型逆变器的双闭环控制架构,体现了对高阶电力电子变换系统深层次的建模与控制探索。文档同时罗列了大量相关的MATLAB/Simulink仿真实例,覆盖电力电子、新能源并网、优化算法、机器学习、路径规划等多个前沿科研领域,强调了科研工作中“借力”现有成果与追求“创新”突破的双重重要性。; 适合人群:从事电力电子与电力传动、新能源发电系统、微电网与智能电网控制等相关领域的研究生、科研人员及工程技术人员,要求具备扎实的电力系统基础知识、现代控制理论背景以及熟练的MATLAB/Simulink仿真操作能力。; 使用场景及目标:①深入研究三电平ANPC逆变器在不平衡电网条件下的高性能控制策略;②实现DPWMA调制技术与正负序电流独立控制的协同仿真与性能评估;③设计并验证融合电网前馈补偿与中点电位平衡的复合控制算法;④作为高级电力电子系统仿真与构网型控制技术的学习范本与项目开发参考。; 阅读建议:建议读者结合文档指引,通过指定公众号或网盘获取完整的仿真模型资源,在Simulink环境中动手复现核心控制模块,重点关注正负序分离算法、DPWMA调制波生成逻辑与前馈控制环节的实现细节,同时参考文末列出的多样化研究方向,以拓宽技术视野并激发创新思维。
内容概要:本文针对间歇性光伏出力条件下48V直流母线电压的稳定控制问题,构建了一个包含光伏阵列、Boost升压电路、储能电池、双向DC-DC变换器及负载的独立直流微网系统,并基于Simulink平台建立了完整的系统仿真模型。研究核心在于设计一套分层协同控制策略,实现光伏最大功率点跟踪(MPPT)与储能系统双向充放电的协调调控,以应对光照强度波动引起的功率不平衡挑战,保障直流母线电压的稳定。通过引入闭环反馈控制机制,优化系统能量管理流程,有效提升了离网运行工况下系统的动态响应速度与运行可靠性,为解决可再生能源供电系统中的电压波动问题提供了可行的技术路径。; 适合人群:电气工程、新能源科学与工程、自动化等相关专业的研究生及科研人员,以及具备电力电子技术、自动控制理论基础和Simulink仿真操作经验的工程技术人员。; 使用场景及目标:①用于离网型光伏直流微网系统的建模仿真与稳定性分析;②开展储能系统参与功率调节的协同控制策略研究;③支撑科研项目中的电压稳定控制算法设计与验证; 阅读建议:建议结合文中提到的Simulink仿真模型进行实操演练,重点关注MPPT控制与储能双向DC-DC协同调控环节的设计逻辑,配合参数调试加深对系统动态特性的理解,同时可参考同类研究拓展多目标优化与鲁棒性提升方向。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值