什么应用程序在SQL查询中的PHP标记周围插入html注释标记?

时间:2014-10-07 18:46:20

标签: php mysql pdo

我使用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注释?

1 个答案:

答案 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中。