如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
如何在我的Linux服务器上跟踪MySQL查询?
例如,我喜欢设置某种侦听器,然后请求网页并查看引擎执行的所有查询,或者只查看在生产服务器上运行的所有查询.我怎样才能做到这一点?
我正在学习避免SQL注入,我有点困惑.
使用bind_param时,我不明白其目的.在手册页上,我找到了这个例子:
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
Run Code Online (Sandbox Code Playgroud)
现在,假设这4个变量是用户输入的,我不明白这是如何阻止SQL注入的.根据我的理解,他们仍然可以在那里输入任何他们想要的东西.
我也找不到'sssd'那里的解释.它有什么作用?这是什么使它安全?
最后一个问题:我读到了另一个mysqli_real_escape_string被弃用的问题,但它没有在手册中说明.它是如何弃用的?由于某种原因,它不能再逃避特殊角色吗?
注意:这个问题解释了bind_param的作用,但我仍然不明白为什么它更安全或更受保护. Bind_param解释