0

我想剥离 SQL 可执行语句的用户输入,但代码库的方式是我不想建立 mysqli_real_escape_string(connection, string) 需要的数据库连接。

什么是优雅的正则表达式/替换单线来清理字符串?

<?php
$naughty = array("\\", "{", "}", ")", "(", "[", "]", "\"", ";", ":", ">", "&");
$sanitized = str_replace($naughty, " ", $input_string);
?> 

---更新----示例解决方案。感谢您的输入。

<?PHP 
      $testsql = "';\"\\ bork bork bork %A 0x33\n";
      echo $testsql;
     /* $translate = array("0x" => "[HEX]",  ";" => "[SEMICOLON]", "'" => "[QUOTE]", "%" => "[PERCENT]","\"" => "[DOUBLEQUOTE]",
      "\\" => "[BACKSLASH]" ); */
      $translate = array("0x" => " ",  ";" => " ", "'" => " ", "%" => " ","\"" => " ", "\\" => " ");
      echo "<br>";
      $testsql=strtr($testsql, $translate);
      echo $testsql;
?>
4

2 回答 2

3

虽然我绝对同意评论和回答,即使用准备好的语句,而不是自己这样做既更聪明,在很多方面也更好,并且总是推荐你在可以使用它们时。虽然您现在可能没有安全问题,但将来可能会突然出现;准备好的陈述的风险要低得多。如果你能找到解决方法,那就去做吧!

我觉得我必须给出免责声明,才能在这里得到认真对待。

因为,我也相信完全可以手动进行所有转义;鉴于环境是可控的。这与转义其他格式(例如 javascript)没有什么不同。有时这是需要的。一方面,我曾经需要创建一个没有可用数据库的 SQL 导出脚本。

要正确执行此操作,必须假设以下内容:

  • 输入字符串是 UTF-8。你验证了这一点。
  • 当您稍后执行 mysql 字符串时,完整的 sql 语句是 UTF-8 格式的,连接也是如此。
  • php 的mbstring 函数重载不会发生任何疯狂的事情。
  • 你不相信我未经测试的代码,并验证我在说什么;)

为什么 UTF-8 如此重要?阅读这篇文章

鉴于这两点,要模拟 mysql_real_escape_string,您必须转义以下字符:

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z. 

来源:php.net

为此,这应该足够了:

$translate = array(
  "\x00" => '\\0',
  "\n"   => '\\n',
  "\r"   => '\\r',
  "'"    => '\\\'',
  "\""   => '\\"',
  "\x1a" => '\\Z',
);

$output = "'" . strtr($input, $translate) . "'";

如您所见,我仍然确保我的输出被引号包围。没有它,这种转义技术 (nor mysqli::real_escape_string) 是不够的。

我见过的替代技术:

  • 拆分每个字节,并用 MySQL 的CHAR函数包围它。
  • 在 PHP 中对字符串进行 Base64 编码,并使用 MySQL 5.6 的FROM_BASE64函数对其进行 base64 解码。
于 2012-11-14T22:02:18.747 回答
2

如果没有连接,则无法正确转义查询数据,因此不了解字符集。

不要自己尝试这样做。您的实现必然是不安全的。无论如何,您应该使用准备好的查询将数据与查询分开。

于 2012-11-14T21:25:57.897 回答