- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有很多关于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/
我已阅读有关依赖注入(inject)的信息。然后来了 构造函数注入(inject), setter/getter 注入(inject) 二传手注入(inject) 接口(interface)注入(in
我正在研究依赖注入(inject)模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepositor
我开始使用 Google Guice。 我有一个简单的问题: javax.inject 的 @Inject 注释和 com.google.inject 的 有什么区别@Inject 一个 ? 谢谢。
当使用构造函数注入(inject)工厂方法时,依赖的属性不会得到解析。但是,如果在解析依赖的组件之前解析了工厂方法,则一切都会按预期工作。此外,当仅使用属性注入(inject)或构造函数注入(inje
我有这样的事情: class Root { public Root(IDependency dep) {} } class Dependency:IDependency { p
听完Clean Code Talks ,我开始明白我们应该使用工厂来组合对象。因此,例如,如果 House有一个 Door和 Door有一个 DoorKnob , 在 HouseFactory我们创建
情况:我需要在一些 FooClass 中进行惰性依赖实例化,所以我通过 Injector类作为构造函数参数。 private final Injector m_injector; public Foo
在编写代码时,我们应该能够识别两大类对象: 注入(inject)剂 新品 http://www.loosecouplings.com/2011/01/how-to-write-testable-cod
这个问题是关于 Unity Container 的,但我想它适用于任何依赖容器。 我有两个具有循环依赖关系的类: class FirstClass { [Dependency] pub
如果我有 10 个依赖项我需要注入(inject)并且不想在构造函数中有 10 个参数,我应该使用哪种注入(inject)模式? public class SomeClass { privat
我在使用 Angular2 DI 时遇到了问题。我尝试将一个类注入(inject)另一个类,它引发了以下错误: 留言:"Cannot resolve all parameters for 'Produ
对依赖注入(inject)还很陌生,我想弄清楚这是否是一种反模式。 假设我有 3 个程序集: Foo.Shared - this has all the interfaces Foo.Users -
我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。 我正在尝试创建一些静态函数来使用包 ng
希望这个问题不是太愚蠢,我试图掌握更高级的编程原理,因此试图习惯使用 Ninject 进行依赖注入(inject)。 因此,我的模型分为几个不同的 .dll 项目。一个项目定义了模型规范(接口(int
我最近一直在大量使用依赖注入(inject)、测试驱动开发和单元测试,并且开始喜欢上它。 我在类中使用构造函数依赖,这样我就可以为单元测试注入(inject)模拟依赖。 但是,当您实际需要生产环境中的
我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject。这两种方式有什么区别吗? Guice官网似乎推荐
这个问题在这里已经有了答案: Angular2 Beta dependency injection (3 个答案) 关闭 7 年前。 我正在使用 angular2 测试版。并在使用 @Inject
有没有可能做这样的事情? (因为我尝试过,但没有成功): @Injectable() class A { constructor(private http: Http){ // <-- Injec
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有这个: SomePage.razor: @inject Something something @page "/somepage" My Page @code { // Using
我是一名优秀的程序员,十分优秀!