gpt4 book ai didi

php - 需要帮助理解 MySQL 注入(inject)

转载 作者:可可西里 更新时间:2023-11-01 06:27:40 25 4
gpt4 key购买 nike

来自 http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php我得到了:

SQL injection refers to the act of someone inserting a MySQL statement to be run on your database without your knowledge. Injection usually occurs when you ask a user for input, like their name, and instead of a name they give you a MySQL statement that you will unknowingly run on your database.

我阅读了整篇文章,但我仍然有一些主要问题无法理解它是什么以及如何完成。

在第一个示例中,他们实际会看到什么?

据我所知,如果我真的回显 $name,将会看到所有的名字,因为它永远是“真实的”,对吗?

我不明白的另一件事是 MySQL 注入(inject)问题是否已通过 mysql_real_escape_string() 解决,必须有更多。

我真正不明白的是 mysql_real_escape_string() 是用来解决这个问题的,为什么这不是自动完成的,我的意思是你每次都必须添加 mysql_real_escape_string() 的原因是什么你应该使用它,这就是为什么他们不让它自动进行?

最佳答案

MySQL 不会自动转义,因为您自己构建了查询字符串。例如:

$query = 'SELECT * FROM users WHERE name="' . $name . '"';

您只需传递存储在 $query 中的原始字符串,这对 SQL 注入(inject)是开放的。例如,如果 $name 是 [something"OR "1=1] 你的查询字符串最终是:

$query = 'SELECT * FROM users WHERE name="something" OR "1=1"

这将从用户表中返回每个用户。这就是为什么您需要转义值。但是,如果您使用 PDO,如果您使用绑定(bind)功能,它会为您完成。这是一个两步过程,准备查询,然后将数据/变量“绑定(bind)”到占位符。在 PDO 中,您的查询字符串看起来像这样:

$query = 'SELECT * FROM users WHERE name=":name"';
$bindings = array('name'=>'something');
prepare($query);
execute($bindings);

然后,东西自动为你转义。

关于php - 需要帮助理解 MySQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3951366/

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