但是,只有在用户输入存储到数据库中时才需要准备语句.还是可以继续使用MysqL_num_rows,因为我真的没有冒这个功能被黑客入侵的风险吗?或者使用预准备语句来执行此操作更安全吗?我应该使用预准备语句来处理涉及使用MysqL的所有内容吗?为什么?
我非常感谢任何答案和反馈.谢谢.
总是. 100%的时间,使用它.总是;即使你不需要使用它.使用它仍然.
不推荐使用MysqL_ *函数. (Notice the big red box?)
Warning This extension was deprecated in PHP 5.5.0,and it was removed
in PHP 7.0.0. Instead,the 07001 or 07002 extension should be
used. See also 07003 guide and 07004 for more
information. Alternatives to this function include:
- 07005
- 07006
您最好使用PDO
或MySQLi
.使用预准备语句时,这两个中的任何一个都可以作为兼容库.
信任用户输入而没有预先准备好的声明/消毒它就像把车停在一个不好的邻居,解锁和点火钥匙.你基本上是在说,只是来吧,带走我的好东西
你永远不应该,我的意思是永远不要相信用户输入.除非你想要这个:
参考数据并存储它,如评论中所述,您永远也不应该信任任何与用户相关的输入.除非您确保用于操作所述数据库/值的数据被硬编码到您的应用程序中,否则您必须使用预准备语句.
现在说明为什么你应该使用预备语句.这很简单.要防止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();
Taken from PHP Manual for PDO Prepared Statements
更多阅读
> How can I prevent SQL-injection in php?
> What is SQL-injection? (Simple Terms)