我应该什么时候使用准备好的陈述
最初我使用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以获取更多信息。 这个功能的替代方案包括:
你最好使用PDO
或MySQLi
。 无论是那些2
使用预处理语句时,将足以作为兼容库。
如果没有准备好的陈述/消毒它们,信任用户输入就像将你的汽车放在一个不好的邻居里,解锁并用点火钥匙。 你基本上是说,只要进来,拿走我的好东西
你永远也不应该信任用户的输入。 除非你想这样做:
参考数据并存储它,如评论中所述,您永远也不应该信任任何与用户相关的输入。 除非您确信将用于操纵所述数据库/值的数据硬编码到您的应用程序中,否则您必须使用预准备语句。
现在说明为什么你应该使用准备好的语句 这很简单。 防止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预处理语句
更多阅读
TL; DR如果您的应用程序接受任何用户输入,则使用准备好的语句100%的时间
你似乎有点困惑。 首先,请不要使用mysql_*
; mysql_*
函数已过时,不推荐使用,并且不安全。 改用MySQLi
或PDO
。 其次, 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