我在这里看到一些人说使用 mysql_real_escape_string 连接查询不会(完全)保护您免受 SQL 注入(inject)攻击。
但是,我还没有看到说明 mysql_real_escape_string 无法保护您免受攻击的输入示例。大多数示例忘记了 mysql_query 仅限于一个查询并错误地使用了 mysql_real_escape_string。
我能想到的唯一例子如下:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
这不会保护您免受以下输入的影响:
5 OR 1=1
我认为这是对 mysql_real_escape_string 的错误使用,而不是缺点,它是为字符串而不是数值设计的。您应该转换为数字类型,或者如果您打算在清理时将输入视为字符串,您应该在查询中执行相同的操作并将引号括起来。
谁能提供一个可以绕过 mysql_real_escape_string 的输入示例,它不依赖于不正确处理数值或忘记 mysql_query 只能执行一个查询?
编辑:我对 mysql_real_escape_string 的局限性感兴趣,而不是将其与替代品进行比较,我意识到新项目有更好的选择,我对此没有异议。
最佳答案
mysql_real_escape_string 或一般的 mysql_ 扩展的主要缺点是它比其他更现代的 API 更难正确应用,尤其是预处理语句。 mysql_real_escape_string 应该只用于一种情况:转义文本内容,该文本内容在 SQL 语句中用作引号之间的值。例如:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string 确保上述上下文中的 $value 不会弄乱 SQL 语法。它不像你在这里想象的那样工作:
$sql = "... `foo` = $value ...";
或这里:
$sql = "... `$value` ...";
或这里:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
如果应用于除 SQL 语句中带引号的字符串以外的任何上下文中使用的值,它会被误用,并且可能会或可能不会弄乱结果语法和/或允许某人提交可能启用 SQL 注入(inject)攻击的值. mysql_real_escape_string 的用例非常狭窄,但很少被正确理解。
另一种使用mysql_real_escape_string 让自己陷入困境的方法是使用错误的方法设置数据库连接编码。你应该这样做:
mysql_set_charset('utf8', $link);
您也可以这样做:
mysql_query("SET NAMES 'utf8'", $link);
问题在于后者绕过了 mysql_ API,它仍然认为您正在使用 latin1(或其他东西)与数据库通信。现在使用 mysql_real_escape_string 时,它将假定错误的字符编码和转义字符串与数据库稍后解释它们的方式不同。通过运行 SET NAMES 查询,您在 mysql_ 客户端 API 如何处理字符串与数据库如何解释这些字符串之间产生了分歧。这可以用于某些多字节字符串情况下的注入(inject)攻击。
mysql_real_escape_string 中没有我知道的基本注入(inject)漏洞如果应用正确。同样,主要问题是它非常容易应用它不正确,这会导致漏洞。
关于php - mysql_real_escape_string 的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12703420/
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
文章目录一、概述简介原理模块二、配置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
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。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
玩转ruby,我已经:#!/usr/bin/ruby-w#WorldweatheronlineAPIurlformat:http://api.worldweatheronline.com/free/v1/weather.ashx?q={location}&format=json&num_of_days=1&date=today&key={api_key}require'net/http'require'json'@api_key='xxx'@location='city'@url="http://api.worldweatheronline.com/free/v1/weather.
我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'
我的Ruby代码中有一个看起来有点像这样的结构Parameter=Struct.new(:name,:id,:default_value,:minimum,:maximum)稍后,我使用创建了这个结构的一个实例freq=Parameter.new('frequency',15,1000.0,20.0,20000.0)在某些时候,我需要这个结构的精确副本,所以我调用newFreq=freq.clone然后,我更改newFreq的名称newFreq.name.sub!('f','newF')奇迹般地,它也改变了freq.name!像newFreq.name='newFrequency'这样
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我正在重构一个西洋跳棋程序,我正在尝试将玩家移动请求(例如以“3、3、5、5”的形式)处理到一个int数组中。我有以下方法,但感觉不像我所知道的那样像Ruby:deftranslate_move_request_to_coordinates(move_request)return_array=[]coords_array=move_request.chomp.split(',')coords_array.each_with_indexdo|i,x|return_array[x]=i.to_iendreturn_arrayend我用它进行了以下RSpec测试。it"translatesa