2016-09-22 53 views
0

可以说,我取得与PDO数据用htmlspecialchars()的值的数组提取

$stmt = $this->dbh->prepare("SELECT * FROM posts"); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    return $result; 

我应该如何使用显示使用回声视图页上的结果之前,用htmlspecialchars()?是否可以在fetchall()后立即转义结果数组,或者我应该在视图页面中逐个转义所有结果?

如果我在获取后立即使用htmlspecialchars(),那么下面的工作会是什么?

$stmt = $this->dbh->prepare("SELECT * FROM posts"); 
    $stmt->execute(); 
    $result = $stmt->fetchAll(); 
    $results= implode(',', $results); 
    $results= htmlspecialchars($results); 
    $results= explode(',', $results); 
    return $results; 
+0

在视图页面上执行 –

+0

这是演示文稿的一部分,因此应该在您的Model,View,Controller应用程序框架视图中进行处理。你正在使用MVC框架吗?如果没有,为什么要努力工作,得到Symfony并让框架处理这些细节。在Symfony中有无数种方法来解决这个问题。 – Halfstop

+0

是的好我创建我自己的CMS,我想学习,所以我自己做的MVC,但一旦我理解完美的概念,我绝对会使用一个框架。 –

回答

1

不管你问题中的解决方案是否真正起作用(它不像Marc B指出的那样),从技术上讲,其中只要在写入页面之前对它们进行编码就没有问题。所以这几乎是你的设计决定。

让我注意,虽然htmlspecialchars()不是反对XSS的圣杯。它仅在输出写入HTML上下文时保护您,而不会在将其写入Javascript时保护您。

考虑一下:

...your html content... 
<script type="text/javascript"> 
    var myvar = <?= myVar ?>; 
</script> 
... 

在这种情况下,myVar的调用用htmlspecialchars()是不够的,如果它可能包含用户输入。在上面的例子中,你并不需要任何特殊的字符来利用XSS。这同样适用于像<div onclick="myFun('something', <?=myVar?>)">之类的东西 - 因为它仍然是一个Javascript上下文,您需要一个不同的编码。

关于XSS的完整教程不适合(我相信不属于)在这里的答案,只是想提请注意HTML编码并不总是足够的事实。

话虽如此,从数据库中读取数据之后立即应用htmlspecialchars()我认为是错误的,因为那时您可能不关心数据将用于何处(将写入哪个上下文)。它也可能是代码中关注事物的分离。

因此,我将备用编码数据,直到它实际上被写入页面,因为那么你知道使用什么编码。

1

fetchAll返回数组数组。你仅仅破坏了OUTER数组(行),这意味着你试图将内部数组(字段/值)转换为字符串,你会得到字符串Array,Array,Array,etc...

所以,不,它不会工作。

+0

会使用array_walk做的工作呢? –

+0

你为什么不尝试呢?我们很乐意提供帮助。我们不在这里为您执行/调试您的代码。特别是当你在黑暗中徘徊时。 –

+0

因为我不明白htmlspecialchars()100%,我想确保它是安全的,我无法知道它是否是,我仍然是PHP新手,我想有人会指出我在正确的方向。我没有说我想要任何人给我的代码,我只是问是否可以用array_walk完成,那是....... –