PDO&清理日期/删除HTML

时间:2011-05-23 23:34:50

标签: 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::PARAM_STR);
    $q->execute();

A)这足以消毒信息吗? b)当我在其中放置HTML标签时<b>name</b>,它实际上在我的网站上以粗体显示!有没有我可以让PDO删除所有HTML的选项?

3 个答案:

答案 0 :(得分:2)

听起来合理。我建议使用POST代替GET进行破坏性/操纵性操作。如果你坚持使用POST数据,你就不太可能遭受CSRF攻击,尽管它不会让你完全免疫。

如果您实际上不希望用户在名称字段中输入HTML,请不要担心在进入数据库的过程中过滤数据。通过htmlspecialchars()htmlentities()

退出途中

我一直坚持认为数据应该尽可能原始地进入数据库。

修改:几乎忘了,在尝试使用它们之前,请确保$_GET / $_POST中的预期值确实存在,例如

if (isset($_POST['name'])) {
    // now use it

答案 1 :(得分:1)

A)阅读manual

  

准备语句的参数   不需要引用;司机   自动处理这个。如果   应用程序专用于准备   声明,开发人员可以肯定   不会发生SQL注入   (然而,如果其他部分   查询正在建立   未转义的输入,SQL注入是   仍然可能)。

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

C)使用$ _POST和令牌进行查询,这将改变任何数据,以避免CSRF

答案 2 :(得分:0)

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