最初,我使用mysql_connectmysql_query做事情。然后我学习了SQL注入,因此我试图学习如何使用准备好的语句。我了解PDO类的准备和执行功能如何有助于防止SQL注入。

仅在用户输入存储到数据库中时才需要预准备语句吗?仍然可以使用mysql_num_rows,因为使用该功能确实不会冒被黑客入侵的风险?还是使用准备好的语句执行此操作更安全?我应该为涉及MySQL的所有事情使用准备好的语句吗?为什么?

最佳答案

tl / dr

总是。 100%的时间使用它。总是;即使您不需要使用它。仍然使用它。



mysql_*函数已被弃用。 (


  警告此扩展在PHP 5.5.0中已弃用,已被删除。
  在PHP 7.0.0中。相反,MySQLiPDO_MySQL扩展名应为
  用过的。另请参见MySQL: choosing an API指南和related FAQ
  信息。此功能的替代方法包括:
  
  
  mysqli_connect()
  PDO::__construct()
  


使用PDOMySQLi更好。使用准备好的语句时,这些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/

10-12 00:22
查看更多