mysqli_real_escape_string澄清

时间:2013-08-21 16:07:21

标签: php mysqli escaping

我刚开始建立一个网站,我不断听到越来越多关于使用mysqli_real_escape_string的信息,但即使我知道如何使用它,我也不确定何时使用它。从我所看到的,当用户在我的网站上输入内容时,我真的只需要使用它吗?目前我正在使用大量的jquery.post在页面之间发送数据,其中一些已经从数据库中获取,一些来自用户输入,因此它是正确的,以逃避传递的所有内容或只是用户添加?

目前我的代码是:

$con = //Connection to Database

$time = time();
$id= time().'-'.mt_rand(1000, 9999);
$poster= mysqli_real_escape_string($con, $_REQUEST["poster"]);
$type= mysqli_real_escape_string($con, $_REQUEST["type"]);
$post= mysqli_real_escape_string($con, $_REQUEST["post"]);
$lat= mysqli_real_escape_string($con, $_REQUEST["lat"]);
$lon= mysqli_real_escape_string($con, $_REQUEST["lon"]);
etc
etc

2 个答案:

答案 0 :(得分:0)

你几乎不应该使用它。使用准备好的陈述和bound parameters代替。

无论您使用什么来保护数据库不被注入,都应该将它应用于所有非SQL显式的内容。这包括另一个查询从数据库中取出的数据(尽管您可能希望在这种情况下使用JOIN来减少查询数量。)

数据库中已经发出的数据,已被发送到浏览器然后被发回,必须被视为用户输入。它一直在用户手中,可以由他们修改。

(并且不允许用户将“显式SQL”数据传递到您的服务器,除非您正在编写需要自定义查询的内容(如phpMyAdmin)并且您信任用户很多

答案 1 :(得分:-1)

  

我不确定何时使用它。

两条规则解释了它

  1. 此函数必须应用于作为字符串文字进入SQL查询的任何数据。一些后果:
    • 此功能与任何保护或注射完全无关
    • 数据源完全不相关。它是唯一的目标 - 一个SQL字符串文字 - 重要
    • 此函数对任何其他SQL文字
    • 完全无用
  2. 永远不要在应用程序代码中使用此函数。唯一可以使用它的地方 - 手动实现参数化查询(如果有的话)。否则就不应该使用它,但必须使用准备好的语句。
  3. 说到准备好的陈述,mysqli实现很难使用。所以,我强烈建议使用抽象库而不是原始的mysqli函数 - 例如PDOsafeMysql