我要让用户使用此代码更新他们的名字。
$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的选项?
答案 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)攻击。