假设我有这样的代码:
$dbh = new PDO("blahblah");
$stmt = $dbh->prepare('SELECT * FROM users where username = :username');
$stmt->execute( array(':username' => $_REQUEST['username']) );
Run Code Online (Sandbox Code Playgroud)
PDO文件说:
准备语句的参数不需要引用; 司机为你处理.
这真的是我需要做的就是避免SQL注入吗?这真的很容易吗?
如果它有所作为,你可以假设MySQL.另外,我真的只是对使用针对SQL注入的预处理语句感到好奇.在这种情况下,我不关心XSS或其他可能的漏洞.
我正在努力学习在PHP中使用mysqli的预处理语句,通常,如果我遇到查询问题,我只需将它回显到屏幕上,看看它的第一步看起来是什么样子.
如何用准备好的声明做到这一点?
我希望在替换变量后看到SQL语句.
昨晚我正在阅读防止SQL注入的内容,我跑过这个答案:
来自"你的常识"的评论听起来像是功能失调/不安全.然而,在我的(尽管有限的)测试中,我发现php的"bin2hex($ var)"适用于我投入的任何内容 - 文字数字,数字字符串,文本字符串 - 即使匹配数字(tinyint)列.
我的问题是:当通过对其进行清理来清理每个用户输入时,有没有办法注入SQL?从本质上讲,无论何时进行查询,它看起来都是这样的:
$query="SELECT * FROM table WHERE someidentifier=UNHEX('".bin2hex($unsafe_user_input)."') LIMIT 1"
Run Code Online (Sandbox Code Playgroud)
基本上翻译为:
SELECT * FROM table WHERE someidentifier=UNHEX('0b99f') LIMIT 1
Run Code Online (Sandbox Code Playgroud)
这种安全性有漏洞吗?
PS - 我不只是在寻找像"为什么不在预先准备的语句中使用PDO或MySQLi"这样的答案?它可能属于抢先优化的巨大罪恶,但我宁愿不加倍我的查询开销(是的,我确实理解它可以更快与多个相同的查询,但这不是我经常遇到的情况).