【问题标题】:writing data into mysql with mysqli_real_escape_string() but without &使用 mysqli_real_escape_string() 但没有 & 将数据写入 mysql
【发布时间】:2016-10-19 21:29:51
【问题描述】:

我在下面使用此代码,但字符“&”不会插入到数据库中,当我从其他页面复制/粘贴一些文本并将其放入数据库时​​,文本会在例如中间结束文本,不知道为什么,我也尝试过 addlashes() 和 htmlspecialchars() 或 htmlentities()。

我读到 mysqli_real_escape_string() 是针对 SQL 注入攻击和针对 XSS 附加的 htmlspecialchars(),我是否也应该将它们结合起来?

$beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']);   

【问题讨论】:

  • “未插入”如何?如果它存在,你会得到一个错误?它变成了其他字符?不,escape_string 不足以防止所有形式的 sql 注入,而且 htmlspecialchars 与 sql 完全没有关系
  • 您不想将“&”存储在数据库中,或者您想知道如何保护您的脚本免受 sql 注入或 xss 的影响
  • @MarcB 我的猜测是查询字符串在预期之前被终止。也就是说,当& 符号弹出时,它不会被视为字符串,而是and 的命令
  • 当然,我想把像 thomsen & thomsen 这样的公司名称放入数据库

标签: php mysqli


【解决方案1】:

SQL 注入只是格式不正确的查询。你做的还不够,现在停下来。进入使用准备好的语句的实践..

$Connection = new mysqli("server","user","password","db");
$Query = $Connection->prepare("SELECT Email FROM test_tbl WHERE username=?");
$Query->bind_param('s',$_POST['ObjectContainingUsernameFromPost']);
$Query->execute();
$Query->bind_result($Email);
$Query->fetch();
$Query->close();

以上是使用预准备语句的一个非常基本的示例。它将快速轻松地格式化您的查询。

我对正在发生的事情的最佳猜测,我假设您只是使用标准:

$Query = mysqli_query("SELECT * FROM test_tbl WHERE Username=".$_POST['User']);

由于此查询的格式不正确,您的文本块中可能包含引号,从而关闭了查询字符串。然后 PHP 会将所有内容解释为发送到 SQL 服务器的命令

【讨论】:

    【解决方案2】:

    如果你知道自己在做什么,你可以自己对indata进行转义,并将转义的数据添加到查询中,只要在sql中用单引号将数据括起来即可。一个例子:

    $db = mysqli_connect("localhost","my_user","my_password","my_db");
    $beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']);
    $results = mysqli_query(
        $db,
        sprintf("INSERT INTO foo (beschreibung) VALUES ('%s')", $beschreibung)
    );
    

    为了获得可预测的结果,我建议您在整个应用程序中始终使用相同的字符编码,例如 UTF-8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      相关资源
      最近更新 更多