我应该什么时候使用准备好的陈述

最初我使用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:选择API指南和相关FAQ以获取更多信息。 这个功能的替代方案包括:

  • mysqli_connect()
  • PDO :: __结构()
  • 你最好使用PDOMySQLi 。 无论是那些2使用预处理语句时,将足以作为兼容库。

    如果没有准备好的陈述/消毒它们,信任用户输入就像将你的汽车放在一个不好的邻居里,解锁并用点火钥匙。 你基本上是说,只要进来,拿走我的好东西

    永远也不应该信任用户的输入。 除非你想这样做:

    SQL注入

    参考数据并存储它,如评论中所述,您永远也不应该信任任何与用户相关的输入。 除非您确信将用于操纵所述数据库/值的数据硬编码到您的应用程序中,否则您必须使用预准备语句。

    现在说明为什么你应该使用准备好的语句 这很简单。 防止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();
    

    从PHP手册获取PDO预处理语句


    更多阅读

  • 我如何防止在SQL中注入SQL?
  • 什么是SQL注入? (简单条款)

  • TL; DR如果您的应用程序接受任何用户输入,则使用准备好的语句100%的时间


    你似乎有点困惑。 首先,请不要使用mysql_* ; mysql_*函数已过时,不推荐使用,并且不安全。 改用MySQLiPDO 。 其次, mysql_num_rows与预处理语句没有任何关系,并且不是PDO功能。 您在运行查询之前准备语句,而不是在您想要对行进行计数之后进行。

    至于何时准备报表,@ Mike'Pomax'Kamermans在评论中将其固定。 如果您曾经使用任何曾经被用户触摸过的数据 - 即使是被认为值得信赖的用户 - 或者由任何第三方或第三方应用程序(包括浏览器)生成的数据都使用预准备语句。 只有100%的数据是硬编码的或完全由您的代码生成(如简单的计数器变量),您是否可以信任它。

    例如,你不能相信:

  • 用户名
  • 密码
  • 电子邮件地址
  • 用户评论
  • 电话号码
  • 日期
  • 搜索字符串
  • 浏览器客户端字符
  • 信用卡号码
  • 上传的文件名
  • 以及由用户创建的或用户可以操纵的任何其他类型的输入。
  • 当然,在将它们放入数据库之前,您应该验证所有这些(例如,检查电子邮件地址是否为电子邮件地址)。 但即使如此,使用准备好的语句也是安全的选择。


    Mysql_*已被弃用,因此更好地切换mysqli_*PDO

    为防止SQL注入(mysql): - 我怎样才能防止SQL注入PHP?

    准备好的语句(这些是由数据库服务器发送并由数据库服务器解析的SQL语句,与任何参数分开)用于每个用户生成的查询数据。

    比如发布与查询匹配/将记录获取到数据库的数据。 所以当你用表单数据发起查询时意味着什么。

    链接地址: http://www.djcxy.com/p/93765.html

    上一篇: When should I use prepared statements?

    下一篇: Can I fully prevent SQL injection by PDO Prepared statement without bind