如果插入用户输入而不修改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)
可以采取哪些措施来防止这种情况发生?
两种准备好的陈述之间究竟有什么区别?
我认为真正准备好的语句需要服务器端支持,它在解析和编译sql代码的模式/模板之后接受参数,并且,我想,这就是保证我们防止sql注入的原因.
对于模拟准备好的语句,没有服务器支持,
它能保证我们不反对它吗?
使用 3.2 中引入的 ORM 更改调试 DB 查询变得更加困难。运行$dataList->sql()为您提供准备好的语句(形式为SELECT * FROM Table WHERE Title = ?),这是一个好的开始。?showqueriesURL 变量的作用相同。
如何获取语句的值或参数是我感兴趣的。我知道https://github.com/lekoala/silverstripe-debugbar但我想知道是否有办法在 XDebug 控制台中无需任何扩展即可获取它们(或仅通过var_dump:ing 某些东西)。
我快速浏览了silverstripe-debugbar的代码,但没有找到一个易于使用的解决方案。如果它在某个地方,请指点我:)