真正的转义字符串和PDO

Joh*_*ohn 83 php mysql pdo

迁移远离mysql库后我正在使用PDO.我用什么代替旧mysql功能?

我需要转义单引号,以便它们进入我的数据库,我认为可能有更好的方法来处理这个,而不添加(斜)所有字符串的斜杠.有人可以告诉我应该使用的是什么吗?

Ste*_*teD 43

您应该使用PDO准备

从链接:

对于将使用不同参数值多次发出的语句调用PDO :: prepare()和PDOStatement :: execute(),通过允许驱动程序协商查询计划的客户端和/或服务器端缓存来优化应用程序的性能,元信息,通过消除手动引用参数的需要,有助于防止SQL注入攻击.

  • 任何数据库层都无法保护您免受XSS攻击,因为这是页面输出时间转义的问题,而与数据库没有任何关系.虽然许多误入歧途的作者确实在SQL转义或输入值的同时尝试HTML转义,但这是解决它的错误时间,并且通常会导致不完整的保护以及其他令人讨厌的错误. (8认同)
  • PDO可以防止SQL注入.(它无助于阻止xss vunerabilities,但mysql_real_escape也没有) (4认同)
  • 约翰:是的,如果你正确使用它,比尔在这篇文章中有一个很好的解释 - > http://stackoverflow.com/questions/1314521/how-safe-are-pdo-prepared-statements (4认同)

Pow*_*tar 37

PDO提供了一种替代方案,旨在用PDO :: quote()方法替换mysql_escape_string().

以下是PHP网站的摘录:

<?php
    $conn = new PDO('sqlite:/home/lynn/music.sql3');

    /* Simple string */
    $string = 'Nice';
    print "Unquoted string: $string\n";
    print "Quoted string: " . $conn->quote($string) . "\n";
?>
Run Code Online (Sandbox Code Playgroud)

上面的代码将输出:

Unquoted string: Nice
Quoted string: 'Nice'
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案可能是推荐的方式,也是最佳实践,但这个答案是对实际问题的正确答案.有时您实际上需要旧的mysql_escape_string函数,例如,如果您要构建一个稍后要执行的文件.你不能用准备好的声明做到这一点. (9认同)
  • 我目前正在迁移旧代码以使用PDO,虽然解决方案很好,但人们需要意识到它会在字符串周围放置引号.因此,如果人们正在构建已经有引号的查询,例如"SELECT*FROM users WHERE username ='".$ conn-> quote($ username)."'";`,查询将不可避免地失败. (8认同)

Pis*_*3.0 5

使用准备好的语句。这些使数据和语法分开,从而消除了转义MySQL数据的需要。参见本教程