首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助理解MySQL注入

问需要帮助理解MySQL注入
EN

Stack Overflow用户
提问于 2010-10-17 00:01:54
回答 7查看 566关注 0票数 9

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

是指有人在您不知情的情况下插入要在数据库上运行的MySQL语句的行为。注入通常发生在您要求用户输入时,比如他们的名字,而不是名称,而是给您一个MySQL语句,您将在不知情的情况下运行您的数据库。

我读了整篇文章,但我仍然有一些主要的问题,理解它是什么,以及如何做到这一点。

在第一个例子中,他们会看到什么?

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

我不明白的另一件事是,MySQL注入问题是否用mysql_real_escape_string()解决了,还需要更多。

我真正不明白的是,mysql_real_escape_string()是用来解决这个问题的,为什么这不是自动完成的,我的意思是,为什么每次mysql_real_escape_string()都必须添加,有什么情况需要使用它,这就是为什么它们不能自动完成这个任务吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-17 01:24:33

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

代码语言:javascript
复制
$query = 'SELECT * FROM users WHERE name="' . $name . '"';

您只需传递存储在$query中的原始字符串,该字符串对SQL注入是开放的。例如,如果$name是“或"1=1,则查询字符串最终为:

代码语言:javascript
复制
$query = 'SELECT * FROM users WHERE name="something" OR "1=1"

它将从user表返回每个用户。这就是为什么你需要转义值。但是,如果您使用PDO,如果您使用绑定功能,它将为您完成。这是一个2步的过程,准备查询,然后“绑定”数据/变量到占位符。在PDO中,查询字符串如下所示:

代码语言:javascript
复制
$query = 'SELECT * FROM users WHERE name=":name"';
$bindings = array('name'=>'something');
prepare($query);
execute($bindings);

那么,事情就会自动为你逃脱。

票数 10
EN

Stack Overflow用户

发布于 2010-10-17 00:08:12

鲍比桌对SQL的工作方式有了很好的总结。它用几种语言(C#、Java、Perl、PHP等)给出的例子有很多好处。

在PHP的例子中,这在很大程度上取决于您如何访问数据库。您可以使用数据库提取层(如ADODB )进行参数化查询。

票数 5
EN

Stack Overflow用户

发布于 2010-10-17 00:19:18

在Tizag链接的第一个示例中,该查询看起来像是脚本作者期望最多只获取一行的查询。因此,考虑到每一行都将被获取,最有可能的结果可能是对返回的第一行的信息进行操作;由于被篡改的查询中没有ORDER BY子句,所以这可能是首先存储在表中的用户,但是当ORDER BY子句丢失时,当然没有在ORDER BY中定义顺序,所以谁能说呢?您可以说的是,只要表不是空的,它就会获取有效用户的详细信息。

我不知道您所说的“如果我回送$name”是什么意思;$name变量在代码中被赋值为"timmy"。所以他们会看到timmy,我想。如果您的意思是,如果您试图回显通过查询获得的用户信息,那么他们会看到什么--这取决于您正在使用的代码。如果您正在循环一个结果集,并且使用SQL注入来获取您不希望它们获取的行,那么它们可能会看到所有的行,包括您不希望它们看到的行。如果您的代码只是从一行中获取和执行信息,那么他们仍然会看到一行,尽管同样,这可能是一个您并不想让他们能够到达的行。

至于为什么mysql_real_escape_string()提供的功能不是自动的,这是因为要使其自动化,它将依赖于计算机能够从您的SQL代码中计算出您想要做的事情,而不是只做您说要做的事情。这既是困难的,也是不可取的,因为没有人想让计算机事后猜测他们想做什么(特别是程序员)。

如果您希望能够避免使用mysql_real_escape_string()等,您可能需要考虑使用参数化查询,这使您可以采取一种稍微轻松一些的方法。但是,您仍然需要向计算机说明查询的哪些部分是您想要转义的变量,因为这只是向计算机传递您想要发生的事情的一部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3951366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档