开发者社区> 问答> 正文

函数mysql_real_escape_string的PDO等效项是什么??mysql

我使用修改我的代码mysql_*来PDO。在我的代码中,我有mysql_real_escape_string()。在PDO中这相当于什么?

展开
收起
保持可爱mmm 2020-05-17 21:38:12 1170 0
1 条回答
写回答
取消 提交回答
  • 好吧,没有!

    从技术上讲,PDO::quote()它是存在的,但很少使用,并且不等同于mysql_real_escape_string()

    那就对了!如果您已经按照准备好的语句记录的方式正确地使用了PDO ,那么它将保护您免受MySQL注入。

    # Example: 以下是使用准备好的语句(pdo)进行安全数据库查询 的示例

    try { // first connect to database with the PDO object. $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]); } catch(\PDOException $e){ // if connection fails, show PDO error. echo "Error connecting to mysql: " . $e->getMessage(); } 并且,现在假设已建立连接,您可以像这样执行查询。

    if($_POST && isset($_POST['color'])){

    // preparing a statement
    $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
    
    // execute/run the statement. 
    $stmt->execute(array($_POST['color']));
    
    // fetch the result. 
    $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($cars); 
    

    } 现在,您可能已经知道,我还没有使用任何东西来转义/消毒的值$_POST["color"]。借助PDO和预准备语句的强大功能,此代码可安全地防止myql注入。

    值得注意的是,出于安全原因,应该charset=utf8在您DSN上面看到的那样传递as属性,并始终使PDO能够以异常形式显示错误。

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 因此,来自数据库查询的错误将不会显示敏感数据,例如目录结构,数据库用户名等。

    最后但并非最不重要的,还有时候,你不应该相信PDO 100%,并且将必然会采取一些额外措施,以防止SQL注入,是,如果你使用的是MySQL的一个过时版本的那些情形之一[ mysql =< 5.3.6 ]的描述,在此回答

    但是,使用上述所示的预处理语句总是比使用以开头的任何功能更安全。 mysql_

    来源:stack overflow

    2020-05-17 21:40:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像