最初,我使用mysql_connect
和mysql_query
做事情。然后我学习了SQL注入,因此我试图学习如何使用准备好的语句。我了解PDO类的准备和执行功能如何有助于防止SQL注入。
仅在用户输入存储到数据库中时才需要预准备语句吗?仍然可以使用mysql_num_rows
,因为使用该功能确实不会冒被黑客入侵的风险?还是使用准备好的语句执行此操作更安全?我应该为涉及MySQL的所有事情使用准备好的语句吗?为什么?
最佳答案
tl / dr
总是。 100%的时间使用它。总是;即使您不需要使用它。仍然使用它。mysql_*
函数已被弃用。 ()
警告此扩展在PHP 5.5.0中已弃用,已被删除。
在PHP 7.0.0中。相反,MySQLi或PDO_MySQL扩展名应为
用过的。另请参见MySQL: choosing an API指南和related FAQ
信息。此功能的替代方法包括:
mysqli_connect()
PDO::__construct()
使用PDO
或MySQLi
更好。使用准备好的语句时,这些2
都可以用作兼容库。
信任用户的输入而没有准备好的声明/对其进行消毒,就像将您的汽车放在不安全的地方,未锁定且钥匙在点火开关中一样。你基本上是在说,进来拿我的东西
您永远不应该,而且我的意思是永远不要信任用户输入。除非您要这样:
如注释中所述,在引用数据并将其存储时,您永远也不应信任任何与用户相关的输入。除非您有101%的把握将用于操纵所述数据库/值的数据硬编码到应用程序中,否则必须使用准备好的语句。
现在介绍为什么要使用准备好的语句。这很简单。防止SQL注入,但是以最直接的方式。准备好的语句的工作方式很简单,它将查询和数据一起发送,但是却分开(如果有意义的话哈哈)-我的意思是:
Prepared Statements
Query: SELECT foo FROM bar WHERE foo = ?
Data: [? = 'a value here']
与它的前一个版本相比,在前一个版本中您使用数据截断了一个查询,将其作为一个整体发送(反过来,这意味着它是作为一个事务执行的),从而导致SQL注入漏洞。
这是一个伪
PHP PDO
示例,向您展示预准备语句/绑定的简单性。$dbh = PDO(....); // dsn in there mmm yeahh
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
更多阅读
How can I prevent SQL-injection in php?
What is SQL-injection? ()
关于php - 什么时候应该使用准备好的语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42221826/