Php SQL注入-将数据插入表

Php SQL注入-将数据插入表,php,mysql,sql,sql-injection,Php,Mysql,Sql,Sql Injection,所以我试图在本地托管的网页上练习SQL注入。我不熟悉SQL,尤其是SQL注入。我已经做了一些研究,将新条目注入到表中,但当我尝试执行时,它似乎不起作用 首先,我的网页是一个登录。我有用户名和密码(显然),可以登录而不附加任何SQL注入。但是,当我将注入代码添加到用户名框时,它不起作用。 例如: 在我的霍尔表中,我有3个条目:id、链接、目的地。 ID为整数,链接和目标为varchar 要成功地将此条目注入并添加到数据库,我需要做什么?我是否需要输入正确的用户名和密码,只需输入用户名或其他内容?不

所以我试图在本地托管的网页上练习SQL注入。我不熟悉SQL,尤其是SQL注入。我已经做了一些研究,将新条目注入到表中,但当我尝试执行时,它似乎不起作用

首先,我的网页是一个登录。我有用户名和密码(显然),可以登录而不附加任何SQL注入。但是,当我将注入代码添加到用户名框时,它不起作用。 例如:

在我的霍尔表中,我有3个条目:id、链接、目的地。 ID为整数,链接和目标为varchar


要成功地将此条目注入并添加到数据库,我需要做什么?我是否需要输入正确的用户名和密码,只需输入用户名或其他内容?

不,您不需要输入正确的用户名和密码。以下是步骤:

首先,确保在PHP中使用内联查询。大概是这样的:

sql = "SELECT * FROM accounts WHERE username = '$username' AND password = '$password'";
其次,确保
$username
$password
变量直接从username和password文本框获取其值

现在,您可以通过在用户名文本框中输入任何值以及在密码文本框中输入类似的内容来测试SQL注入攻击:

x';delete from accounts where '0'='0
这将从您的
账户
表中删除所有记录。如果您想进行更多测试,可以输入任何其他SQL

编辑只是为了说明一些观点,即只要使用参数化查询,就不需要了解SQL注入的工作原理

这是我在其他主题中看到的真实问题。对于任何一个“优秀”的程序员来说,了解事情是绝对必要的。仅仅知道应该如何做是不够的,如果你不知道为什么要这样做以及它们是如何工作的,你就不可能成为一个“好”的程序员。所以,知道SQL注入、XSS、CSRF等攻击是任何有经验的程序员必须做的事情

看到那些有经验的程序员告诉新手他们其实不需要理解,这真的很让人难过。为什么?他们想成为唯一知道的人吗?他们是否认为其他人不够聪明?我不知道,但至少可以说,这不是StackOverflow的精神,因此我认为应该标记和删除此类声明

此外,参数化查询不会阻止所有类型的SQL注入,因为并非所有内容都可以参数化(例如,列和表名、值数组等),但通过了解SQL注入的工作方式,您将知道在这些情况下该怎么做。以这个查询为例:

SELECT * FROM students WHERE status IN(,,,,)
如果数组具有已知数量的值,则可以将其作为参数发送,但如果确实必须具有未知数量的值,则需要知道如何保护查询。除非您了解自己面临的问题,否则无法保护您的查询。在这种情况下,您可以在循环中创建参数,但必须知道如何正确创建


这是一个很好的答案。

不,您不需要输入正确的用户名和密码。以下是步骤:

首先,确保在PHP中使用内联查询。大概是这样的:

sql = "SELECT * FROM accounts WHERE username = '$username' AND password = '$password'";
其次,确保
$username
$password
变量直接从username和password文本框获取其值

现在,您可以通过在用户名文本框中输入任何值以及在密码文本框中输入类似的内容来测试SQL注入攻击:

x';delete from accounts where '0'='0
这将从您的
账户
表中删除所有记录。如果您想进行更多测试,可以输入任何其他SQL

编辑只是为了说明一些观点,即只要使用参数化查询,就不需要了解SQL注入的工作原理

这是我在其他主题中看到的真实问题。对于任何一个“优秀”的程序员来说,了解事情是绝对必要的。仅仅知道应该如何做是不够的,如果你不知道为什么要这样做以及它们是如何工作的,你就不可能成为一个“好”的程序员。是的,任何有经验的程序员都必须知道SQL注入、XSS、CSRF等攻击是如何工作的

看到那些有经验的程序员告诉新手他们其实不需要理解,这真的很让人难过。为什么?他们想成为唯一知道的人吗?他们是否认为其他人不够聪明?我不知道,但至少可以说,这不是StackOverflow的精神,因此我认为应该标记和删除此类声明

此外,参数化查询不会阻止所有类型的SQL注入,因为并非所有内容都可以参数化(例如,列和表名、值数组等),但通过了解SQL注入的工作方式,您将知道在这些情况下该怎么做。以这个查询为例:

SELECT * FROM students WHERE status IN(,,,,)
如果数组具有已知数量的值,则可以将其作为参数发送,但如果确实必须具有未知数量的值,则需要知道如何保护查询。除非您了解自己面临的问题,否则无法保护您的查询。在这种情况下,您可以在循环中创建参数,但必须知道如何正确创建


这是一个很好的答案。

如果您的PHP代码(明智地)使用了预先准备好的语句,那么您的注入攻击理应失败。只需使用语句,忘记这一点。你最好花点时间在应用程序中创建新功能。我知道有现成的语句存在,但我这样做是为了更好地理解SQL注入的过程。我已经获得了该站点的实际版本。那么就没有什么需要进一步了解的了。从这个问题上不可能知道您使用的是预处理语句还是内联SQL。我们无法看到您尝试注入的代码是否能够实际工作。因此,你的问题无法回答(至少除了你以外的任何人都无法回答)。