Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在SQL语句中使用会话变量_Php_Mysql_Session_Pdo - Fatal编程技术网

Php 在SQL语句中使用会话变量

Php 在SQL语句中使用会话变量,php,mysql,session,pdo,Php,Mysql,Session,Pdo,我想知道在SQL语句中使用会话变量是否安全 我正在使用这段代码: $req=$db->prepare('SELECT Name FROM Users WHERE Years=:Years'); $req->执行(数组)( “年”=>$\u会话[“年”] ));更好的问题是为什么不使用预先准备好的语句,给我一个好的理由 我想知道在SQL语句中使用会话变量是否安全 没有 用户是否能够修改会话变量 不直接考虑这个 $_SESSION['value'] = $_POST['value']; 用户是否

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

我正在使用这段代码:

$req=$db->prepare('SELECT Name FROM Users WHERE Years=:Years');
$req->执行(数组)(
“年”=>$\u会话[“年”]

));更好的问题是为什么不使用预先准备好的语句,给我一个好的理由

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

没有

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

<>不直接考虑这个

$_SESSION['value'] = $_POST['value'];
用户是否修改了会话?不,安全吗。没有

因此,您可能认为我永远不会这样做,但随着应用程序变得越来越复杂,您会知道,您在会话中输入的每个值从未被用户数据触及

考虑这一点:

 class foo{
       function bar($value){
             $db->query('select * from table where value ='.$value]);
       }

 }

  $foo->bar($_SESSION['value']);
现在假设另一个文件实现了我上面提到的(会话),您无法从编写的糟糕类的代码中看到这一点。您也无法通过查看类来查看会话代码。因此,仅仅通过观察其中一个,你无法知道你所做的是否安全。也许你在写的时候会保持警惕,几个月后,几年后呢。你还记得吗

准备好的语句之所以有效,是因为您可以在出现故障时正确地看到这一点,因为它们不依赖其他地方的良好编码来弥补其糟糕的编码

现在假设您希望直接使用Post数组中的数据重用函数
bar
,因为在会话中存储它是一种浪费。所以你改变了它,但是如果不打开类,你就无法知道它是否安全,这是另一个失败点的例子

如果我们在这些问题上使用事先准备好的陈述,会发生什么?我们失去了什么?几下键盘

不要说有人利用了你的不良写作类,我们会损失什么,取决于你的网站做了什么,你可能会损失很多。也许你没有有价值的数据,也许你有社会保险号码。谁知道呢,但这不会好的。至少你会失去用户对你的信任

所以我再问一次,你为什么不在他们身上使用事先准备好的陈述呢

我用最美好的方式来表达我的意思。这不值得

对了,这个

 $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语句和预处理语句之间有很大的区别

网上有很多关于这方面的视频教程,但这里有一个先前的答案可以解释一下


什么设置了
$\u SESSION['years']
?更好的问题是你为什么不使用事先准备好的声明,给我一个好的理由…
$db->prepare
在我看来有点像
prepare
是的,仅仅因为海报被弄糊涂并不意味着我不应该解释差异,现在是这样了。谁投了反对票,您是说在SQL语句中使用会话变量是可以的。
这毕竟是个问题,只是因为用户碰巧使用了他们不理解的东西,这并不会降低我的答案的有效性。