为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
暮色呼如 2019-07-05 16:07:41
我什么时候应该使用准备好的报表?最初,我使用MySQL_CONNECT和MySQL_Query来做一些事情。然后我学到了SQL注入,所以我试着学习如何使用准备好的语句。我理解PDO类的准备和执行函数对于防止SQL注入是如何有用的。但是,只有当用户输入被存储到数据库中时,才需要准备好语句。仍然使用mysql_num_row可以吗?因为我并不真的会因为使用这个函数而冒被黑客攻击的风险吗?还是用预先准备好的语句来做这件事更安全?对于涉及使用MySQL的任何事情,我应该使用准备好的语句吗?为什么?我真的很感激你的回答和反馈。谢谢。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

一直都是。100%的时间,使用它。而且即使你不需要使用它。还是用吧。


mysql_*不推荐使用函数。(注意到那个红色的大盒子了吗?)

警告这个扩展在PHP5.5.0中被废弃,在PHP7.0.0中被删除。相反,MySQLiPDO_MySQL应该使用扩展。另见MySQL:选择API指南和相关常见问题想了解更多信息。这一职能的替代办法包括:

你最好用PDOMySQLi..任何一个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准备的报表


多读


查看完整回答
反对 回复 2019-07-05
?
炎炎设计

TA贡献1808条经验 获得超4个赞

如果应用程序接受任何用户输入,则100%使用预先准备的语句。


你好像有点困惑。首先,请不要用mysql_*mysql_*功能已经过时了,弃用,而且没有安全感。使用MySQLiPDO相反。第二,mysql_num_rows与准备好的语句无关,也不是PDO特性。您在运行查询之前准备语句,而不是在希望计数行时在语句之后进行准备。

至于准备发言的时间,@Mike‘Pomax’Kamerman在评论中指出了这一点。如果你曾经,甚至一次,使用任何用户曾经接触过的数据-即使是一个被信任的用户-或者是由任何类型的第三方或第三方应用程序生成的,包括浏览器,使用预先准备好的语句。只有当您的数据100%是硬编码或完全由您的代码生成(就像一个简单的计数器变量),您才能信任它。

例如,您不能信任:

  • 用户名
  • 密码
  • 电子邮件地址
  • 用户评论
  • 电话号码
  • 日期
  • 搜索字符串
  • 浏览器客户端字符串
  • 信用卡号码
  • 上传文件名
  • 任何

    由用户创建或用户可以操作的其他类型的输入。

当然,在将它们放入数据库之前,您应该验证所有这些(例如,检查电子邮件地址实际上是电子邮件地址)。但即便如此,使用预先准备好的语句也是安全的方法。


查看完整回答
反对 回复 2019-07-05
?
不负相思意

TA贡献1777条经验 获得超10个赞

Mysql_*已经被废弃了,所以更好的切换mysqli_*PDO

防止SQL注入(MySQL):-如何防止PHP中的SQL注入?.

以及准备好的语句(这些SQL语句被发送到数据库服务器,并由数据库服务器与任何参数分开解析)。)在您的每个用户生成的查询数据上使用。

就像在发布数据时一样,您可以通过查询将记录匹配/获取到数据库。也就是说,当您使用表单数据触发查询时。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 368 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信