我的html没有在输入字段的值属性中正确显示引号。我有一个表单,显示存储在数据库中的字段的当前值,并允许用户编辑该字段。
下面是我存储在mysql数据库中的内容
'sarah' said "hello"
下面是我使用PDO和htmlentities从数据库中检索和解码:
$questionId = intval($_GET['questionID']);
...
$sql = 'SELECT title from questions q WHERE q.id = :questionId';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':questionId' => $questionId));
...
$row = $stmt->fetch();
$questionTitle = htmlentities($row["title"], ENT_NOQUOTES);
...
echo <<<END
Question Title: <input type="text" id="questionTitle" name="questionTitle" placeholder="Enter question title here" maxlength="74" value="$questionTitle" required>
END;
页面显示的内容如下:
Question Title:[['sarah' said "hello"]]
其中[[]]表示输入框。
如何让输入框显示引号而不是html实体?我希望它显示以下内容
Question Title: [['sarah' said "hello"]]
如果我不使用htmlentities函数来清理输出,那么问题标题会显示为我想要的(带引号)。但从我的理解,不逃避我的HTML输出将使我容易受到XSS注入。请参阅:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
如何在输入字段的value属性中显示这些引号,而不会受到XSS注入的影响?
答案 0 :(得分:1)
看起来它们被作为html实体返回。从php手册:
string htmlspecialchars_decode ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ] )
你有很高的能力,所以这就是你回归的原因。尝试将_decode添加到那里,看看会发生什么(或完全取出)。所以你的行看起来像这样:
$questionTitle = $row["title"];