使用Query而不是准备好的语句或大量的字符串操作会不安全和错误吗?

时间:2017-05-17 03:10:26

标签: php mysql pdo

想想bobby drop table,现在考虑以下内容:

$dbh = new PDO("mysql:host=...;dbname=mysql", ...);


$dbh->query("use newdatabase");

这似乎超级不安全。我为什么要这个?因为我已经构建了自己的数据库连接工具,最后一部分允许您指定要使用的数据库。无论您连接到哪种类型的数据库服务器,我的连接工具都会在一天结束时返回\PDO对象:pgsql,mysql或sqlite。

这个问题是,如果我创建setDatabase(string $database),那么你可能是恶意的。 通过连接字符串然后连接是否适当的方式? 或者有一种安全的方式可以连接,然后设置数据库吗?

2 个答案:

答案 0 :(得分:2)

我相信这是安全的。只要没有用户输入被送到setDatabase()。如果用户输入确实需要传递给setDatabase(),您可以使用某种形式的可用数据库白名单。

简单地说:它是安全的,因为没有用户输入,也没有注射机会。

答案 1 :(得分:-2)

无论查询是什么以及您是否使用预准备语句,都可以按照以下两个步骤保护脚本免受SQL注入:

<强> 1。始终逃避用户输入

list item

像这样逃避它将保护您免受SQL注入和XSS攻击。

<强> 2。始终用引号

包装值
<?php
    $user_input = htmlspecialchars($user_input, ENT_QUOTES | ENT_HTML5, "UTF-8", false);

如果您正在使用WHERE并比较整数,则没有义务用引号包装该值,但在这种情况下,有人并且很容易进行SQL注入,SELECT * FROM `table` WHERE `value` = "some value here"; 无法保护您。