有很多关于addslashes 和mysql_real_escape 函数如何不安全地防止注入(inject)的讨论。事实是,甚至像 Wordpress 这样的大型框架或 CMS 也在使用这些功能,并且到目前为止它们做得很好。
我知道在使用GBK字符集时有一些特定的场景,或者可以使用utf8_decode来注入(inject)一些sql代码,或者一些简单的例子,比如1' OR 1 --当涉及一个简单的地方时可以使用它。
然而,经过一些研究,如果字符集是 UTF-8,那么似乎很难将一些东西注入(inject)到一个简单的查询中,使用 addslashes 或 mysql_real_escape,让我们承认,这是最常见的情况。
所以,鉴于这个新手脚本,请提供一个 sql 注入(inject) POC(记住 UTF-8 字符集)
$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST['password']);
$sql = "SELECT *
FROM users
WHERE username = '{$mysql['username']}'
AND password = '{$mysql['password']}'";
最佳答案
更新 2 :
After further research , 之前的 MySQL 版本5.0.77 与 SET NAMES 结合使用时可能容易受到 GBK 问题的影响独自的。早先人们认为只有 5.0.22 及更早版本是易受攻击的。
这意味着如果您使用的是 5.2 之前的 PHP 版本,其中 mysql_set_charset/mysqli_set_charset被引入,您的代码在特定的、精心设计的条件下可能容易受到攻击。
如果您坚持使用 PHP 5.1,请确保您使用的是 MySQL 5.0.77 或更高版本。 5.0.77“只有”两年的时间,但已被推送到 RHEL/CentOS 5.x 的存储库中,这是更流行的发行版,坚持 5.0.x 系列的 MySQL 和 5.1.x 系列的 PHP。
升级吧,伙计们!
更新 1:Another recent question已揭开GBK东西的来源:A bugfix in MySQL 5.0.22 .当使用除 mysql_real_escape_string 以外的任何东西时,早于此的版本都非常容易受到攻击。结合 mysql_set_charset 而不仅仅是 SET NAMES . mysqli 等效项名为 mysqli_set_charset .
似乎没有 mysql_set_charset 的等效项在 PDO 中。这可能是因为它可以使用 MySQL 原生的预准备语句,这可能是免疫问题,或者是 SET NAMES足以使其底层转义机制按预期工作。
无论如何,如果您使用任何 MySQL 5.0.22 5.0.77 之前的版本并没有特别注意确保您只传递已知字符集中的字符串 ,您可能会发现自己容易受到攻击。
我将保留原始帖子的其余部分未修改,但我已经更新了 tldr。
There is a lot of talk about how addslashes and mysql_real_escape function are not safe to prevent injections
addslashes用于防止 SQL 注入(inject)是完全错误的,因为它不能保证为所有数据库提供正确的转义方法,主要是因为它添加了反斜杠,有时转义机制完全不同。mysql_real_escape_string当您需要将某些 SQL 连接在一起时,这是您获得的最佳保护之一。I know there are some particular scenarios when using GBK charset, or utf8_decode can be used to inject some sql code
iconv 运行字符串与 //IGNORE//TRANSLIT应该是足够好的保护(通常通过在错误序列点截断字符串,当您受到攻击时这是一种可接受的失败模式 - 格式错误的序列不应该出现在合法请求中)。addslashes完全不知道字符集,只处理原始字节。它会在序列中间粘贴一个反斜杠,然后将其炸毁。但是,这应该只会导致有关不良字符集信息的提示。mysql_real_escape_string另一方面,它是根据内置的连接字符集知识设计的,因此如果它看到序列而不是引号,它就不会转义序列。然而,因为它会将它识别为一个序列而不是一个引用,所以根本没有危险。关于Php 和 Sql 注入(inject) - UTF8 POC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5139127/
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我今天看到了一个ruby代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject
我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
在此处阅读有关SO的各种解释,它们是这样描述的:map:Themapmethodtakesanenumerableobjectandablock,andrunstheblockforeachelement注入(inject):Injecttakesavalueandablock,anditrunsthatblockonceforeachelementofthelist.希望你明白为什么我觉得它们表面上看起来很相似。我什么时候会选择一个而不是另一个,它们之间有什么明显的区别吗? 最佳答案 如果您认为inject也别名为reduce,这