【问题标题】:mysqli_real_escape_string Clarificationmysqli_real_escape_string 澄清
【发布时间】:2013-08-21 16:07:21
【问题描述】:

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

【问题讨论】:

    标签: php mysqli escaping


    【解决方案1】:

    您几乎不应该使用它。请改用准备好的语句和bound parameters

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

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

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

    【讨论】:

      【解决方案2】:

      我不确定何时使用它。

      两条规则解释它

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

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

      【讨论】:

      • 谢谢,我只关心我为所有已通过的数据库建立的连接数。有没有办法在不每次都连接到数据库的情况下做到这一点? $post_message = mysqli_real_escape_string($con, $post_message); >> $post_message = mysqli_real_escape_string($post_message);
      • 为什么你关心连接数?为什么你的意思是“每次”?为什么你的意思是在“连接”下?
      • 我已经编辑了我的原始消息以显示我的代码连接是什么样的
      • 您的担心是没有根据的,而您对该功能的使用是错误的。
      • 任何答案中都没有显示代码 - 我真的很难理解这一点,因为它对我来说是新的。如何编辑我必须使其工作的代码?
      猜你喜欢
      • 2015-12-20
      • 2019-11-15
      • 2013-06-05
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2020-07-30
      相关资源
      最近更新 更多