在SQL语句中使用Session变量

时间:2018-04-09 02:26:32

标签: php mysql session pdo

我想知道在SQL语句中使用Session变量是否安全。

我正在使用这段代码:



$req = $db->prepare('SELECT Name FROM Users WHERE Years = :Years');
                $req->execute(array(
                'Years' => $_SESSION['years']
                ));




用户是否能够修改会话变量?

谢谢!

1 个答案:

答案 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语句和准备语句之间存在很大差异。

网上有很多关于此视频的教程,但这里作为之前的答案解释了一下。

How does SQL-injection work and how do I protect against it