【发布时间】:2018-11-17 04:52:45
【问题描述】:
所以我忙于 PHP,当我想知道时将数据插入 mysql:我遇到一些帖子说使用单引号将数据插入数据库是不好的做法。示例之一:Why are VALUES written between quotes when sent to a database? 这篇文章是关于为什么它们被写在引号之间,但有一点很清楚:插入它是不好的做法:
$sql = INSERT INTO example (example1, example2, example3) VALUES
('$example1', '$example2', '$example3');
为什么这是不好的做法?显然,如上面给出的链接中所述,注入是易受攻击的。 OP 他的问题与评论有关:我们为此使用mysqli_real_escape_string。给出的答案是:
@XX 在很大程度上,是的,它是解决问题的替代方案。它不会禁用任何东西,但它会转义一些东西,例如 SQL 字符串中的 ' 变成 '' 或 \' ,从而阻止攻击者结束字符串。在一些尴尬的情况下,这种转义很难,而且很容易错过许多转义调用,这就是为什么参数化查询被认为是最可靠的方法。
首先:脚本如何欺骗mysqli_real_escape_string 使其不转义某些内容?我发现了以下内容,如果我错了,请纠正我:mysqli_real_escape_string - example for 100% safety。如您所见,他指的是另一个页面,该页面有答案。然而,他随后声称应该使他的数据 100% 安全,而其他人则回应:
是的,这通常是安全的。正确使用时,Mysql 和 mysqli 是完全安全的(尽管在非常特定的编码中存在特定的错误)。准备好的语句的优点是更难以错误的方式做事。
我有下面的例子让我自己清楚:我有 2 扇门,1 扇门是开着的,但在一扇紧闭的门后面。你会如何攻击前面有一扇门关着的敞开的门?
这里有一个答案:SQL injection that gets around mysql_real_escape_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 会逃脱的范围,从而使其更容易受到攻击吗?
【问题讨论】:
-
请阅读此内容以获取更多信息:stackoverflow.com/questions/12859942/…
-
顺便说一句,我认为这个问题根本不是所引用的问题的重复。这个问题询问的是手动转义而不是参数化查询,这与一般不推荐使用的功能无关,所以我将其标记为重新打开。
-
确实,这不是为什么你不应该使用 mysql-functions 问题的重复。我附议重新开放。
标签: php mysql security sql-injection