gpt4 book ai didi

php - mysqli_real_escape_string - 100% 安全示例

转载 作者:行者123 更新时间:2023-12-03 21:27:37 25 4
gpt4 key购买 nike

我知道已经有很多关于这个话题的问题被问到了。而且我也知道要走的路是准备好的陈述。但是,我仍然不完全了解以下是否或如何成为安全问题:

$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
}

我从注入(inject)备忘单尝试了许多不同的输入,但找不到通过查询的任何内容。例如。如果我输入任何带有“;”的内容然后 $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% 安全,对吗?

最佳答案

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

但是,它仍然存在两个问题:

  • 假设:问题的陈述是基于 mysqli_real_escape_string() 的假设。与任何安全问题有关。这只是一个严重的错觉。这是 字符串格式化函数 ,这只是作为副作用保护您免受 SQL 注入(inject)。但这样的保护既不是功能的目标也不是目的。因此,它永远不应该用于此目的。
  • 您提出的代码的固有可分离性。保护包括部分:
  • 设置正确的编码
  • 转义特殊字符
  • 将转义值括在引号中

  • 这些强制性措施中的一些不仅是事实 could be forgotten但同样,问题的陈述只强调一个部分——逃避。只是逃避总是被强调,而其他两个措施几乎没有被提及。看看你的问题 - 你的意思是代码,但询问了一个函数。因此,对您提出的问题的任何字面回答都会给人一种致命的错误印象,即 mysqli_real_escape_string()没事儿。

    In short, the statement of question helps to promote the most dangerous of PHP related delusions: that this function protects from SQL injection.



    与这个复杂的三部分方程不同,准备好的语句构成 形影不离措施。你不能忘记一个部分。你不能滥用它。试试 mysqli_real_escape_string()保护标识符,它会默默地被忽视,直到实际注入(inject)发生。为标识符尝试准备好的语句 - 并得到一个错误。

    关于php - mysqli_real_escape_string - 100% 安全示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34052328/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com