我使用PDO和预处理语句将条目插入MySQL数据库。到目前为止效果很好。我意识到如果输入也使用像htmlentities()
之类的函数进行消毒,我的问题基本上没有实际意义,但是出于好奇,将被注入数据库的php代码执行到了回来的路?
例如:
$connection = new PDO(//some database info);
$query = $connection->prepare("INSERT INTO House (Rooms) VALUES (:newroom);");
$query->bindValue(':newroom', $_POST['newroom'], PDO::PARAM_STR);
$query->execute();
现在让我们说用户输入$ _POST [' newroom']的值为:
<?php var_dump($connection); ?>
这按原样进入数据库,因为虽然PDO阻止了SQL代码的执行,但它并不一定会逃避PHP标记(或者它是否会这样做?这基本上是我的问题。)
现在让我们说用户访问另一个执行此查询的页面:
$connection = new PDO(//some database info);
$query = $connection->prepare("SELECT * FROM Rooms;");
$query->execute();
然后它循环结果,将它们作为html表单中的选择输入中的选项回显如下:
<select>
<option value = 1>Kitchen</option>
<option value = 2>Bathroom</option>
<option value = 3><?php var_dump($connection); ?></option>
</select>
我已经尝试过这样做了,数据库中的php标签用HTML注释标签回显,导致select输入中出现空白条目,如下所示:
<option value = 3><!--?php var_dump($connection) ?--></option>
显然,php没有被执行。这很棒,但我很好奇是什么决定逃避标签。 MySQL的? PHP本身?我是否可以始终依赖此行为,即从数据库返回的PHP代码将解析为html注释?
答案 0 :(得分:2)
没有。 PHP代码只是纯文本。除非该文本被放入可执行的上下文中,否则它将永远不会被执行。例如。你需要像
这样的东西$php_code_from_db = $db->fetchRow('php_code');
eval($php_code_from_db);
将你的代码片段中的原始PHP代码发送到客户端的浏览器中。其中一些将被解释为无效的HTML,例如
<?php
echo "Hello"
?>
World
会在浏览器中呈现为World
,因为<? ... ?>
会被视为无效/未知的HTML标记。
此外,PHP代码对于浏览器来说毫无意义。全世界99.9999%的网络冲浪者都不会在他们的计算机上安装PHP。即使他们这样做,浏览器也不会执行从网站收到的任何PHP代码,嵌入在某些HTML中。