0

我正在数据库中查询从表单获得的 userInput 文本,并将在 HTML 页面中显示该文本。为了防止 XSS,我需要遍历结果并应用 htmlspecialchars(),当然,我将 fetchAll() 更改为 fetch() 并在其中应用 htmlspecialchars(),但使用原生 MySQL 函数并包括它在我的查询中。我搜索但找不到一个。一个存在吗?我可以创建自己的吗?谢谢

$sql ='SELECT userInput FROM table WHERE fk_id=123';
$stmt = db::db()->query($sql);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
4

5 回答 5

1

这一切都取决于您要保存的数据。如果您要保存数据以直接显示在您的网站上,那么显然您需要 htmlspecialchars() 之类的。PDO 通过使用准备好的语句废弃了 mysql_real_escape() 等的使用。

作为铁律,每个字符串都必须转义到正确的目的地:HTML 字符串经历 HTML 转义,MySQL 字符串经历 MySQL 转义等。

编辑 :

当您将其从数据库中取出(或将其中的任何内容作为 html 显示给用户)然后您再次将其转义,以便使用 htmlentities() 等来保护您的用户免受 XSS 攻击。

于 2012-12-01T17:52:56.150 回答
0

6 years later and I think the answer to the first part is still "no, there isn't"... but to the second, "yes": you can create your own, if you wish, using MySQL stored procedures.

Anyway, probably the best way to handle the situation of a cross-site scripting attack is to remove any script tags or inline script before the html is stored into the database, whether as a MySQL stored procedure (tricky!) or in the script before you send the html to the database.

于 2018-08-16T10:49:06.750 回答
0
UPDATE messages SET message = REPLACE(REPLACE(REPLACE(message,'&','&amp;'),'<', '&lt;'), '>', '&gt;')
于 2019-06-02T08:54:43.307 回答
-2

转义数据不应在数据库中完成,而应在 PHP 应用程序中完成。此外,它应该始终在视图而不是模型中完成。

于 2012-12-01T19:52:51.417 回答
-3

我的建议:使用对象。使用 setter/getter 创建您自己的类,并定义它将如何存储/返回您的数据。

前任:

class UserRow{
    public $id;
    public $email;
    protected $bio;

    public function getBio(){
        return htmlspecialchars($this->bio);
    }

    public function __set($property, $value){
        $this->$property = $value;
    }

    public function __get($property){
        $getter = 'get'.$property;
        if(is_callable(array($this,$getter))){
            return $this->$getter();
        }else{
            return $this->$property;
        }
    }
}

$stmt = $pdo->query("SELECT * FROM user");
$stmt->fetchAll(PDO::FETCH_CLASS, 'UserRow');
于 2012-12-01T17:31:39.070 回答