【问题标题】:Escaping quotes in PHP from MySQL result (PDO)从 MySQL 结果 (PDO) 中转义 PHP 中的引号
【发布时间】:2016-05-13 09:17:29
【问题描述】:

要显示的字符串来自 MySQL 表。我使用 PDO 查询。该字符串包含双引号:

较旧的拼写(来自法语)。现在首选现代化的“小偷小摸”。

这是一个字典条目的定义,如果可用则显示:

$search_results .= (!empty($english_definition)? "<a class=\"definition\" href=\"#\" data-toggle=\"popover\" rel=\"popover\"
data-content=\"".$english_definition."\">".$english."*</a>" : $english);

由于引号,定义被删减到“现代化”一词之后。

我尝试使用addslashes(),但结果是显示了一个斜杠,之后没有任何内容。

我还尝试在表格字段中添加斜杠,例如

较旧的拼写(来自法语)。现代化的“小偷小摸”现在是首选。

PHP 代码中如果没有stripslashes(),则只显示第一个反斜杠,其后不显示任何内容。

当我添加stripslashes() 时,“现代化”一词后没有显示任何内容。

所以,这就是我卡住的地方。

附加代码: 这就是我插入新术语和定义的方式。我添加了htmlspecialchars() 用于可能存在引号的输入:

        if(isset($_POST['submit'])) {

        $english                = htmlspecialchars($_POST['english']);
        $english_abbr           = $_POST['english_abbr'];
        $variant                = $_POST['variant'];
        $bulgarian              = htmlspecialchars($_POST['bulgarian']);
        $bulgarian_abbr         = $_POST['bulgarian_abbr'];
        $theme_id               = $_POST['theme_id'];
        $english_definition     = htmlspecialchars($_POST['english_definition']);
        $bulgarian_definition   = htmlspecialchars($_POST['bulgarian_definition']);

        // Check if an entry already exists
        $exists = $db->prepare("SELECT * FROM ".DICTIONARY_TABLE." WHERE english = :english AND theme_id = :theme_id ");
        $exists->execute(array(':english' => $english, ':theme_id' => $theme_id));
        $count = $exists->rowCount();
        if($count > 0) {
            echo "<h3 style=\"color:navy; background:transparent;\">&#8658; An entry in the same theme already exists.</h3>";
        }
        else {
            $insert = $db->prepare("INSERT INTO ".DICTIONARY_TABLE." 
                                    (english, english_abbr, variant, bulgarian, bulgarian_abbr, theme_id)
                                    VALUES
                                    (:english, :english_abbr, :variant, :bulgarian, :bulgarian_abbr, :theme_id)");
            $insert->execute(array(':english'           => $english, 
                                    ':english_abbr'     => $english_abbr,
                                    ':variant'          => $variant,
                                    ':bulgarian'        => $bulgarian,
                                    ':bulgarian_abbr'   => $bulgarian_abbr,
                                    ':theme_id'         => $theme_id));

            if($insert) {
                echo "<h4 style=\"color:green; background:transparent;\">&#8658; Term \"$english\" inserted successfully.</h4>";

                if(!empty($english_definition) || !empty($bulgarian_definition)) {      
                    $insert_id = $db->lastInsertId();
                    $insert_def = $db->prepare(
                            "INSERT INTO ".DICTIONARY_DEFINITIONS." 
                            (term_id, english_definition, bulgarian_definition)
                            VALUES
                            (:term_id, :english_definition, :bulgarian_definition)");
                    $insert_def->execute(array(
                            ':term_id' => $insert_id, 
                            ':english_definition'   => $english_definition,
                            ':bulgarian_definition' => $bulgarian_definition));

                    if($insert_def) {
                        echo "<h4 style=\"color:green; background:transparent;\">&#8658; Definition(s) inserted successfully.</h4>";
                    }
                    else {
                        echo "<h4 style=\"color:red; background:transparent;\">&#8658; There was a problem inserting the definition(s)!</h4>";
                    }
                }

                unset($_POST); $_POST = array();
            }
            else { 
                echo "<h4 style=\"color:red; background:transparent;\">&#8658; There was a problem executing the query: </h4>";
            }
        }
        include("insert_form.php");
    }
    else {
        include("insert_form.php");
    }

【问题讨论】:

  • 您是否使用带有占位符值的预准备语句?这就是你的答案。
  • 是的,我是。但在我将$english_definition = $_POST['english_definition']; 更改为$english_definition = htmlspecialchars($_POST['english_definition']); 之前,我遇到了上述问题。
  • 您在这里使用了错误的方法,这仅与在页面上显示有关。您应该使用prepared statements。它们旨在安全地插入您的数据而不会破坏它。您正在那里进行一些双重转义,这会导致问题。您使用的是什么版本的 PHP?尝试检查您绑定到语句的值,以查看双重转义的来源。也许还有其他涉及这些的代码,甚至可能是 JavaScript。
  • @tadman,您能否看一下我添加到问题中的完整插入查询,如果这真的是错误的方法,请告诉我?我已经关注了 PHP.net 和这里的资源 - 当然,不是专家,我可能会做一些不应该做的事情。谢谢!

标签: php mysql stripslashes addslashes


【解决方案1】:

当你将它保存到数据库时使用htmlspecialchars()函数,当你想再次回显它时使用htmlspecialchars_decode()函数。

Link to htmlspecialchars() function

Link to htmlspecialchars_decode() function

【讨论】:

  • 我需要对这个已经写入数据库的特定字符串进行哪些更改才能对此进行测试?我应该添加斜杠吗?我直接从 PhpMyAdmin 进行编辑。
  • 谢谢!刚刚尝试过(htmlspecialchars())。引号被转换为&amp;quot;。然后使用htmlspecialchars_decode() 回显结果——但仍然得到相同的结果——字符串在“现代化”之后被剪切。
  • 但是...当我回显结果而不添加htmlspecialchars_decode() 时,完整的字符串会正确显示!因此,解决方案是在写入数据库时​​使用htmlspecialchars(),但不解码就直接回显它。谢谢!
  • 您应该以中性格式保存到数据库并仅在显示时使用htmlspecialchars() 转义。在您的数据库中使用 HTML 转义会带来很大的麻烦,因为您必须显示这些原始的或有双重转义的风险,从而将自己暴露在 XSS 问题中。
  • @tadman,您能否详细说明一下,因为我不确定我是否理解“中性格式”的含义?
【解决方案2】:

这是一个有点模糊的问题,如果您正确使用 pdo,我什至认为您不必处理斜杠,但如果您不想在没有斜杠的情况下显示数据,您是否尝试过使用字符串替换?

$search_result = str_replace ("/", "", $search_result);

如果我理解你的问题正确,这应该可以达到你想要的效果

【讨论】:

  • 对不起,如果我的问题不是很清楚。我是 PDO 的新手,所以有可能我做的不对,但话又说回来,这是一个简单的插入然后获取查询......这是插入部分:$insert_def = $db-&gt;prepare( "INSERT INTO ".DICTIONARY_DEFINITIONS." (term_id, english_definition, bulgarian_definition) VALUES (:term_id, :english_definition, :bulgarian_definition)"); $insert_def-&gt;execute(array( ':term_id' =&gt; $insert_id, ':english_definition' =&gt; $english_definition, ':bulgarian_definition' =&gt; $bulgarian_definition)); 我现在添加了htmlspecialchars() 和它有效!
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 2016-10-06
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2015-09-16
  • 2017-12-21
相关资源
最近更新 更多