在 mysqli_real_escape_string() 的 PHP 文档中,写道
Caution Security: the default character set
The character set must be set either at the server level, or with the API function mysqli_set_charset() for it to affect mysqli_real_escape_string().
在关于字符集的进一步链接中,提到
The character set should be understood and defined, as it has an affect on every action, and includes security implications.
为什么为了安全需要设置字符集,它包含哪些安全隐患? 任何人都可以解释这些线条背后的概念吗?
提前致谢
最佳答案
SQL 查询的解析方式取决于连接字符集。如果您执行此查询:
$value = chr(0xE0) . chr(0x5C);
mysql_query("SELECT '$value'");
然后如果连接字符集是 Latin-1 MySQL 将看到无效的:
SELECT 'à\'
而如果字符集是 Shift-JIS,字节序列 0xE0,0x5C 将被解释为双字节字符:
SELECT '濬'
为安全添加字符串文字转义:
$value = mysql_real_escape_string($value);
mysql_query("SELECT '$value'");
现在,如果您使用 mysql_set_charset 将连接字符集正确设置为 Shift-JIS,MySQL 仍会看到:
SELECT '濬'
但是如果你没有设置连接字符集,MySQL的默认字符集是Shift-JIS而PHP的默认字符集是ASCII,PHP不知道尾随的0x5C字符是双字节序列的一部分,并转义它,认为它正在生成有效输出:
SELECT 'à\\'
当 MySQL 使用 Shift-JIS 读取它时:
SELECT '濬\'
尾随 ' 用反斜杠转义,这使字符串文字保持打开状态。查询中的下一个 ' 字符将结束字符串,留下原始 SQL 内容中的任何内容。如果您可以在那里注入(inject),则查询很容易受到攻击。
此问题仅适用于少数东亚编码,如 Shift-JIS,其中多字节序列可以包含字节,这些字节本身就是有效的 ASCII 字符,如反斜杠。如果不匹配的编码都将低字节始终视为 ASCII(严格的 ASCII 超集,例如 Latin-1 与 UTF-8 之间更常见的不匹配),就不可能出现这种混淆。
幸运的是,默认使用这些编码的服务器并不常见,因此在实践中这是一个很少被利用的问题。但是如果您必须使用mysql_real_escape_string,您应该正确地使用它。 (不过最好通过使用参数化查询来完全避免它。)
关于php - mysqli_real_escape_string() 中默认字符集的安全隐患是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608326/
对于作为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"
玩转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
每当我尝试运行该程序时,都会弹出一条错误消息“条件字符串文字(第10行)”。我做错了什么?puts"Welcometothebestcalculatorthereis.Wouldyouliketo(a)calculatetheareaofageometricshapeor(b)calculatetheequationofaparabola?Pleaseenteran'a'ora'b'togetstarted."response=gets.chompifresponse=="a"or"A"puts"ok."elsifresponse=="b"or"B"puts"awesome."else
我用这个错误搜索了jekyll。jekyll处理页面时似乎出现了ruby错误,但我根本不了解ruby。杰基尔版本1.3.1我什至重新安装了ruby和jekyll,但结果没有改变。更新:在我将jekyll从1.31降级到1.20后,这个错误消失了注意:我的网站是用jekyll1.20创建的,所以它不能用1.3.1构建?这是核心问题吗?E:\GitHub\sample>jekyll服务--trace:Configurationfile:E:/GitHub/sample/_config.ymlSource:E:/GitHub/sampleDestination:E:/GitHub
String#match和Regexp#match在匹配成功时返回一个MatchData:"".match(//)#=>#//.match("")#=>#//.match(:"")#=>#但是Symbol#match返回匹配位置(如String#=~)::"".match(//)#=>0为什么Symbol#match表现不同?有用例吗? 最佳答案 我将其报告为Ruby核心中的错误:https://bugs.ruby-lang.org/issues/11991.让我们看看他们会怎么说。更新被质疑的行为似乎是一个错误。似乎从Ruby2.