如何在不受XSS注入影响的情况下在HTML输入值属性中显示引号?

时间:2015-03-02 00:10:46

标签: php html xss

我的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:[[&#039;sarah&#039; said &quot;hello&quot;]]

其中[[]]表示输入框。

如何让输入框显示引号而不是html实体?我希望它显示以下内容

Question Title: [['sarah' said "hello"]]

如果我不使用htmlentities函数来清理输出,那么问题标题会显示为我想要的(带引号)。但从我的理解,不逃避我的HTML输出将使我容易受到XSS注入。请参阅:https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

如何在输入字段的value属性中显示这些引号,而不会受到XSS注入的影响?

1 个答案:

答案 0 :(得分:1)

看起来它们被作为html实体返回。从php手册:

string htmlspecialchars_decode ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ] )

你有很高的能力,所以这就是你回归的原因。尝试将_decode添加到那里,看看会发生什么(或完全取出)。所以你的行看起来像这样:

$questionTitle = $row["title"];