-1

不久前我开始建立一个网站,我不断听到越来越多的关于 using的消息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
4

2 回答 2

0

你几乎不应该使用它。请改用准备好的语句和绑定参数

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

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

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

于 2013-08-21T16:11:21.507 回答
-1

我不确定何时使用它。

两条规则解释它

  1. 此函数必须应用于作为字符串文字进入 SQL 查询的任何数据。一些后果:
    • 此功能与任何保护或注入绝对无关
    • 数据源完全不相关。唯一重要的是目的地 - SQL 字符串文字
    • 此函数对任何其他 SQL 文字完全无用
  2. 此函数不应该在应用程序代码中使用。唯一可以使用它的地方 - 在参数化查询的手动实现中(如果有的话)。否则根本不应该使用它,而是必须使用准备好的语句。

说到准备好的语句,mysqli 的实现是相当难用的。所以,我强烈推荐一个抽象库而不是原始的 mysqli 函数——比如PDOsafeMysql

于 2013-08-21T16:37:18.137 回答