我想知道在SQL语句中使用Session变量是否安全。
我正在使用这段代码:
$req = $db->prepare('SELECT Name FROM Users WHERE Years = :Years');
$req->execute(array(
'Years' => $_SESSION['years']
));

用户是否能够修改会话变量?
谢谢!
答案 0 :(得分:-1)
更好的问题是你为什么不使用准备好的陈述,给我一个充分的理由......
我想知道在SQL语句中使用Session变量是否安全。
没有
用户是否能够修改会话变量?
不是直接但请考虑这个
$_SESSION['value'] = $_POST['value'];
用户是否修改了会话?不,这样安全吗?否。
所以你可能认为我永远不会这样做,但随着应用程序变得越来越复杂,你会知道你在会话中放入的每一个值都从未被用户数据触及。
考虑一下:
class foo{
function bar($value){
$db->query('select * from table where value ='.$value]);
}
}
$foo->bar($_SESSION['value']);
现在说一些其他文件做我上面提到的(有会话),你不能从baddy写的课程代码中看到。您也无法通过查看课程来查看会话代码。因此,只要看一个或另一个,你就无法知道你所做的事情是否安全。也许你写作时会保持警惕,几个月,几年后。你会记得吗?
准备好的陈述是有效的,因为你可以在失败时看到这一点,因为他们不依赖其他地方的良好编码来弥补他们的错误编码。
现在假设您希望将函数bar
直接与Post数组一起重用,因为将它存储在会话中是一种浪费。所以你改变了它,但你没有办法在不打开课程的情况下知道它是否安全,这是失败点的另一个例子。
如果我们在这些上使用准备好的陈述会怎样?我们失去了什么?几次按键。
没有人说有人设法利用你的书写课程我们失去了什么,这取决于你的网站你可能会失去很多。也许你没有有价值的数据,也许你有社会安全号码。谁知道,但它不会好。至少,您将失去用户对您的信任。
所以我再问一遍,为什么你不会在它们上面使用准备好的陈述。
我的意思是最好的方式。它不值得。
顺便说一句
$db->prepare('SELECT Name FROM Users WHERE Years = :Years')
是一个准备好的声明,这是正确的方法。虽然这个
$db->prepare("SELECT Name FROM Users WHERE Years = $Years")
无论你怎么做都不安全。
因此,如果您询问您在答案中使用的代码是否安全。那是的,它看起来那样。但如果你问这是否安全:
$db->query("SELECT Name FROM Users WHERE Years = {$_SESSION['Years']}")
然后我会说不,永远不会。
你可以在准备好的陈述中基本上放置任何你想要的东西并使其安全,这就是它的全部要点。因为你问,我很确定你还没有真正理解SQLInjection攻击的基础知识。因为SQL语句和准备语句之间存在很大差异。
网上有很多关于此视频的教程,但这里作为之前的答案解释了一下。