【发布时间】:2018-05-02 12:19:28
【问题描述】:
大部分时间我都在做这样的 SQL:
$pdo = new PDO($dsn, $usr, $pass);
$qry = 'SELECT * FROM `my_table` WHERE `pk_id` = '. $id .';';
$res = $pdo->query($qry);
但最近我看到一些帖子表明,确保安全的唯一方法是使用准备好的语句 - 这对我来说真的不是问题,这可能有一个答案,只是我无法从谷歌搜索。
当然,如果我的所有语句都以 .';' 结尾,使用 concat 可以吗?
谢谢,
【问题讨论】:
-
@baao 我说它不是重复的唯一论据是因为我使用连接而不是在字符串中传递变量或在某些地方使用
? -
除了在字符串中传递变量还有什么
pk_id = '. $id .';? -
唯一确定的安全方法是使用准备好的语句。其他任何事情都是不专业的,并且忽略了您的应用程序的安全性。
-
如果我可以举个例子,那就是我可以使用
$id = " 00 OR 1 = 1"访问您的数据,这将导致SELECT * FROM my_table WHERE pk_id = 00 OR 1 = 1 ; -
如果是出于教育目的,让我举个例子。如果您要转义所有输入,您可能会考虑在散列密码之前也使用密码。这可能会更改哈希值,并且密码可能会有所不同。使用准备好的语句可以避免这种情况,因为不会以任何方式更改数据(转义会更改数据以使其“安全”插入)。准备好的语句发送两个请求;一个用于查询,一个用于值 - 因此在发送之前不会更改任何数据。
标签: php mysql pdo prepared-statement