Php PDO&;清理日期/删除HTML

Php PDO&;清理日期/删除HTML,php,pdo,Php,Pdo,我让用户用这个代码更新他们的名字 $dbh = connect(); $q = $dbh->prepare('UPDATE Users SET username=:name WHERE User_ID=:id LIMIT 1'); $q->bindParam(":id", $loggedInUser->user_id, PDO::PARAM_INT); $q->bindParam(":name", $_GET['name'], PDO::

我让用户用这个代码更新他们的名字

    $dbh = connect();
    $q = $dbh->prepare('UPDATE Users SET username=:name WHERE User_ID=:id LIMIT 1'); 
    $q->bindParam(":id", $loggedInUser->user_id, PDO::PARAM_INT);
    $q->bindParam(":name", $_GET['name'], PDO::PARAM_STR);
    $q->execute();
A) 这足以清理信息吗?
b) 当我把HTML标签放在那里时,比如
name
,它实际上以粗体显示在我的网站上!有没有一个选项可以让PDO去掉所有HTML?

永远不要相信用户输入!至少,将
$\u GET['name']
包装在清理函数中,以防止SQL注入攻击。然后,当您输出用户提供的数据时,请确保将其包装起来,以防止跨站点脚本(XSS)攻击。

看起来合理。我建议使用POST而不是GET进行破坏性/操纵性操作。如果您坚持使用POST数据,那么您遭受CSRF攻击的可能性要小得多,尽管这并不能使您完全免疫

如果您实际上不希望用户在name字段中输入HTML,那么不要担心在进入数据库的过程中过滤数据。通过
htmlspecialchars()
htmlentities()
在退出时将其转义

我一直主张数据应该尽可能原始地进入数据库

编辑:差点忘了,在尝试使用它们之前,请确保
$\u GET
/
$\u POST
中的预期值确实存在,例如

if (isset($_POST['name'])) {
    // now use it
A) 阅读:

准备好的语句的参数 不需要被引用;司机 自动处理这个问题。如果 应用程序仅使用准备好的 语句,开发人员可以肯定 不会发生SQL注入 (但是,如果 查询正在使用 未切换的输入,SQL注入是 仍然可能

B) 永远不要信任用户的数据。在输出中使用
htmlspecialchars


C) 使用$_POST和令牌进行查询,这将更改任何数据,以避免出现错误。

我以为PDO会像上面那样在准备语句时处理数据转义。htmlspecialchars是否足以针对所有XS进行清理?-1对于
mysql\u real\u escape\u string()
,使用绑定参数要好得多+1用于
htmlspecialchars()
though@Nikki-是的,准备好的语句和绑定参数比任何清理文本的尝试都要好。我同意菲尔关于-1/+1的看法,哪一个更安全?(不在乎速度/资源)@Nikki哪个“什么”更安全
htmlspecialchars()
vs
htmlentities()
?我建议您阅读手册并确定哪一个最适合您的目的。谢谢-htmlentities是我将使用的,因为它适用于所有html,而不仅仅是特殊字符。使用POST不会避免CSRF。@Alix Axel使用POST可以避免大多数CSRF攻击。使用POST和令牌将有助于避免所有这些攻击:)使用GET和令牌也将避免任何CSRF攻击。使用POST(不带令牌)只能帮助避免来自不知道如何发布的人的CSRF攻击。我认为你应该重新表述你的最后一点,因为这是一个关键问题。