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()
vshtmlentities()
?我建议您阅读手册并确定哪一个最适合您的目的。谢谢-htmlentities是我将使用的,因为它适用于所有html,而不仅仅是特殊字符。使用POST不会避免CSRF。@Alix Axel使用POST可以避免大多数CSRF攻击。使用POST和令牌将有助于避免所有这些攻击:)使用GET和令牌也将避免任何CSRF攻击。使用POST(不带令牌)只能帮助避免来自不知道如何发布的人的CSRF攻击。我认为你应该重新表述你的最后一点,因为这是一个关键问题。