mysqli_real_escape_string-100%安全的示例

问题描述 投票:2回答:1

我知道关于此主题已经有很多问题。我也知道,要走的路是准备好的陈述。但是,我仍然不完全了解以下内容是否或如何可能成为安全问题:

$mysqli = new mysqli("localhost", "root", "", "myDatabase");
$mysqli->set_charset("utf8");
$pw = mysqli_real_escape_string($mysqli,$_POST['pw']);
$username = mysqli_real_escape_string($mysqli,$_POST['username']);

$str = "SELECT * FROM users WHERE id='".$id."' AND username='".$username."'";
$result = $this -> mysqli -> query($qstr);

if($result->num_rows > 0){
    //user logged in
}

我尝试了注射备忘单中的许多不同输入,但找不到通过查询的任何内容。例如。如果我输入的任何内容都带有“;”然后$ result变为false,因为据我所知一个查询不能包含两个单独的语句。任何带有'或'的输入都会被mysqli_real_escape_string。

[能否请您向我解释,如何利用以上代码?如果您有一个可以解释它的链接,我也非常高兴阅读它!

欢呼声

编辑:这已经在这个答案中得到回答:

SQL injection that gets around mysql_real_escape_string()

然而,这个问题是关于较旧版本的mysql,而不是mysqli。其次,得票最多的答案指出了以下可以解决的示例:

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

但是,我对此并不完全了解。第一行

mysql_query('SET NAMES gbk');

无法从外面设置,对吗?这只是一个例子,如果有人在程序中设置了“ gbk”。所以如果我用

$mysqli->set_charset("utf8");

也使用

id='".$id."' (single quotes around $id) 

那我将是100%安全的,对吗?

php mysqli sql-injection
1个回答
0
投票

您孤立和简化的示例在技术上是安全的。

但是,仍然有两个问题:

  • 假设:问题的陈述是基于mysqli_real_escape_string()与任何安全问题有关的假设。这不过是一个严重的幻想。这是一个字符串格式设置功能,仅作为副作用,可防止SQL注入。但是,这种保护既不是功能的目的也不是目的。因此,切勿将其用于此目的。
  • 您固有的代码的内在separability”。保护由三个部分组成:
    • 设置正确的编码
    • 转义特殊字符
    • 将转义的值用引号引起来

不仅是其中一些强制性措施could be forgotten的事实,而且,问题的陈述只强调了一个部分-转义。总是着重于逃避,而几乎没有提及其他两个措施。只是看您的问题-您的意思是code,但被问到有关[[function。因此,对您提出的问题的任何字面回答都会给人致命的错误印象,即mysqli_real_escape_string()没问题。

简而言之,问题陈述有助于促进与PHP有关的错觉中最危险的事情:该函数可以防止SQL注入。

与这个复杂的三部分方程式不同,准备好的语句构成了

不可分度量。您不能滥用它。尝试使用mysqli_real_escape_string()保护一个标识符,它会被忽略,直到实际注入发生为止。尝试使用标识符准备好的语句-并收到错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.