这个查询对sql注入安全吗?

Bak*_*yor 10 php mysql sql-injection

该脚本使用PHP,而DB则使用MySQL.这是脚本本身.

$unsafe_variable = $_GET["user-input"];
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)

有人说如果用户将;DROP TABLE blah;字符串分配给变量$ unsafe_variable,则会删除该表.

但我试过这个例子,

http://localhost/test.php?user-input=DROP%20TABLE%20my_table 
Run Code Online (Sandbox Code Playgroud)

但它没有删除表,而是在表中插入了一个新行(;DROP TABLE blah;).

有人可以解释一下如何用sql注入来攻击这个脚本吗?

Ric*_*ões 13

由于PHP的mysql_query函数每次调用只允许一个查询,因此该特定注入不起作用.但是,如果column具有主键或唯一键,则以下内容可能有效:

$unsafe_variable = "admin') ON DUPLICATE KEY UPDATE password=MD5(CONCAT('knownsalt', 'newpassword'))#";
Run Code Online (Sandbox Code Playgroud)

最好使用冗长的mysql_real_escape_string功能:

$sql=sprintf("INSERT INTO table (column) VALUES(%s)",
             mysql_real_escape_string($unsafe_variable));
mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)