我什么时候应该使用准备好的报表?

我什么时候应该使用准备好的报表?

最初,我使用MySQL_CONNECT和MySQL_Query来做一些事情。然后我学到了SQL注入,所以我试着学习如何使用准备好的语句。我理解PDO类的准备和执行函数对于防止SQL注入是如何有用的。

但是,只有当用户输入被存储到数据库中时,才需要准备好语句。仍然使用mysql_num_row可以吗?因为我并不真的会因为使用这个函数而冒被黑客攻击的风险吗?还是用预先准备好的语句来做这件事更安全?对于涉及使用MySQL的任何事情,我应该使用准备好的语句吗?为什么?

我真的很感激你的回答和反馈。谢谢。


暮色呼如
浏览 369回答 3
3回答

呼唤远方

一直都是。100%的时间,使用它。而且即使你不需要使用它。还是用吧。mysql_*不推荐使用函数。(注意到那个红色的大盒子了吗?)警告这个扩展在PHP5.5.0中被废弃,在PHP7.0.0中被删除。相反,MySQLi或PDO_MySQL应该使用扩展。另见MySQL:选择API指南和相关常见问题想了解更多信息。这一职能的替代办法包括:mysqli_CONNECT()PDO:_struction()你最好用PDO或MySQLi..任何一个2在使用准备好的语句时,将足够作为兼容的库。信任用户的输入,没有准备好的声明/消毒-这就像把你的车丢在一个糟糕的街区,不上锁,钥匙在点火上。你基本上是说,进来拿我的糖果你应该绝不可能我的意思是永远不要相信用户的输入。除非你想这样在引用数据并存储数据时,如注释中所述,您可以绝不可能不应该信任任何与用户相关的输入。除非您101%确信用于操作上述数据库/值的数据是硬编码到您的应用程序中,否则您必须使用预先准备好的语句。现在开始讨论为什么要使用预先准备好的语句。很简单。以防止SQL注入,但以最直接的方式可能。准备好的语句的工作方式很简单,它将查询而数据一起,但分开(如果这有道理的话)-我的意思是:Prepared StatementsQuery: 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();摘自PHP手册为PDO准备的报表多读如何防止PHP中的SQL注入?什么是SQL注入?简单术语)

炎炎设计

如果应用程序接受任何用户输入,则100%使用预先准备的语句。你好像有点困惑。首先,请不要用mysql_*;mysql_*功能已经过时了,弃用,而且没有安全感。使用MySQLi或PDO相反。第二,mysql_num_rows与准备好的语句无关,也不是PDO特性。您在运行查询之前准备语句,而不是在希望计数行时在语句之后进行准备。至于准备发言的时间,@Mike‘Pomax’Kamerman在评论中指出了这一点。如果你曾经,甚至一次,使用任何用户曾经接触过的数据-即使是一个被信任的用户-或者是由任何类型的第三方或第三方应用程序生成的,包括浏览器,使用预先准备好的语句。只有当您的数据100%是硬编码或完全由您的代码生成(就像一个简单的计数器变量),您才能信任它。例如,您不能信任:用户名密码电子邮件地址用户评论电话号码日期搜索字符串浏览器客户端字符串信用卡号码上传文件名和任何由用户创建或用户可以操作的其他类型的输入。当然,在将它们放入数据库之前,您应该验证所有这些(例如,检查电子邮件地址实际上是电子邮件地址)。但即便如此,使用预先准备好的语句也是安全的方法。

不负相思意

Mysql_*已经被废弃了,所以更好的切换mysqli_*或PDO防止SQL注入(MySQL):-如何防止PHP中的SQL注入?.以及准备好的语句(这些SQL语句被发送到数据库服务器,并由数据库服务器与任何参数分开解析)。)在您的每个用户生成的查询数据上使用。就像在发布数据时一样,您可以通过查询将记录匹配/获取到数据库。也就是说,当您使用表单数据触发查询时。
打开App,查看更多内容
随时随地看视频慕课网APP