mysqli\u real\u escape\u字符串易受攻击

yzuktlbb  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(275)

所以我正忙着用php,在我想知道的时候把数据插入mysql:我收到一些帖子说用单引号将数据插入数据库是不好的做法。其中一个例子是:当发送到数据库时,为什么在引号之间写值?这篇文章是关于为什么它们写在引号之间,但有一点很清楚:插入这样的内容是不好的做法:

$sql = INSERT INTO example (example1, example2, example3) VALUES 
('$example1', '$example2', '$example3');

为什么这是坏习惯?显然,这是无法注射如上述链接所述。他的问题与评论相关的评论是:我们使用 mysqli_real_escape_string 为了这个。得到的答复是:
@xx在很大程度上,是的,这是一个替代解决问题的办法。它不会禁用任何内容,但会转义某些内容,例如在sql字符串中“变成”或“\”,从而阻止攻击者结束该字符串。在有些尴尬的情况下,这种转义很困难,而且在许多转义调用中很容易漏掉一个,这就是为什么参数化查询被认为是最可靠的方法。
首先:剧本要怎么愚弄 mysqli_real_escape_string 不逃避某些东西?我发现了下面的内容,如果我错了就纠正我:mysqli\u real\u escape\u string-100%安全示例。如你所见,他提到了另一页,上面有答案。然而,他提出了一个声明,应该使他的数据100%安全,而其他人的回答是:
是的,一般来说是安全的。正确使用mysql和mysqli是非常安全的(尽管在非常特定的编码中有特定的bug)。准备好的陈述的好处是用错误的方式做事更困难。
我有下面的例子来说明我自己:我有两个门,一个门是开着的,但是后面一个门是关着的。你会如何用一扇紧闭的门来攻击一扇开着的门?
这里有一个答案:sql注入绕过mysql\u real\u escape\u string(),但他说作为一个安全的例子:

mysql_query('SET NAMES utf8');
$var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*");
mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");`

不是吗 mysqli_real_escape_string 已经这么做了?他只是在说明应该是什么角色 mysqli_real_escaped_string . 那么这怎么会突然变得安全呢?因为它和你说的完全一样:

$example = mysqli_real_escape_string ($conn, $_POST['exampleVariable']);

那么这是如何做到的:

mysql_query('SET NAMES utf8');
$var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*");
mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");

变得安全,这是:

$example = mysqli_real_escape_string ($conn, $_POST['exampleVariable']);

不是吗?他不是在缩小范围吗 mysqli_real_escape_string 会逃跑,从而使它更脆弱?

gijlo24d

gijlo24d1#

问题是,mysqli\u real\u escape\u string()或其他适当的转义实际上在技术上是安全的,最后,这也是参数化查询所做的。然而,总有一个问题。例如,只有在变量周围加引号时它才是安全的。没有引号就不是了。如果是一个1000行的项目,只有一个开发人员,那么在前3个月可能就可以了。最后,即使是一个开发人员也会忘记引号,因为它们在语法上并不总是需要的。想象一下,5年后,拥有200名开发人员的200万loc项目将会发生什么。
同样地,你永远不能忘记使用手动转义功能。首先可能很简单。然后有一个变量是经过验证的,它只能保存一个数字,所以您可以确定只将它放入而不转义。然后你改变主意,把它变成一个字符串,因为不管怎样查询都是可以的。或者其他人两年后就这么做了。等等。这不是技术问题。这是一个管理方面的问题,从长远来看,你的代码会受到某种程度的攻击。因此,这是不好的做法。
另一点,如果手动转义到位,自动扫描sql注入漏洞要困难得多。静态代码扫描器可以很容易地找到串联查询的所有示例,但是如果有任何示例,它们很难关联先前的转义。如果您使用参数化查询之类的查询,那么很容易找到sql注入,因为所有连接都是潜在的候选。

3lxsmp7m

3lxsmp7m2#

设置连接的字符集不会改变什么 mysqli_real_escape_string() 逃跑。但它避免了多字节字符错误,因为它控制插入反斜杠转义字符后如何解释字符串。
当然,您可以通过使用查询参数来避免任何不确定性。

相关问题