Php 在不使用mysqli_real_escape_string()的情况下输入sanitizaton

Php 在不使用mysqli_real_escape_string()的情况下输入sanitizaton,php,sql,regex,Php,Sql,Regex,我想剥离用户输入的SQL可执行语句,但代码库的方式是,我不想建立mysqli_real_escape_string(connection,string)所需的DB连接 什么是优雅的regex/replace-one-liner来净化字符串 <?php $naughty = array("\\", "{", "}", ")", "(", "[", "]", "\"", ";", ":", ">", "&"); $sanitized = str_replace($naughty,

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

什么是优雅的regex/replace-one-liner来净化字符串

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

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


不要试图自己做这件事。您的实现肯定是不安全的。您应该使用准备好的查询将数据从查询中分离出来。

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


不要试图自己做这件事。您的实现肯定是不安全的。无论如何,您都应该使用准备好的查询来将数据与查询分开。

虽然我完全同意这些评论和回答,但使用准备好的语句,而不是自己做,在许多方面都更聪明、更好,并且在您可以使用它们的时候,总是建议您这样做。虽然您现在可能没有安全问题,但将来可能会突然出现安全问题;而准备好的报表的风险要低得多。如果你能找到解决办法,那就去做吧

我觉得我必须给出免责声明,以便在这里被认真对待

因为,我也相信,所有的逃逸都是可以人工完成的;鉴于环境受到控制。这与其他格式(如javascript)的转义没有什么不同。有时这是必要的。一、 例如,once需要创建一个没有可用数据库的SQL导出脚本

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

  • 输入字符串是UTF-8。你验证了这一点
  • 稍后执行mysql字符串时,完整的sql语句是UTF-8,连接也是如此
  • php没有什么疯狂的事情发生
  • 您不信任我未经测试的代码,请验证我所说的;)
为什么UTF-8如此重要

鉴于这两点,要模拟mysql\u real\u escape\u字符串,必须对以下字符进行转义:

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z. 
资料来源:

为此,这应足够:

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

$output = "'" . strtr($input, $translate) . "'";
如您所见,我仍然确保我的输出被引号包围。如果没有这一点,这种转义技术(也不是mysqli::real_escape_string
)将是不够的

我见过的其他技术:

  • 拆分每个字节,并使用MySQL函数将其包围
  • Base64在PHP中对字符串进行编码,并使用MySQL 5.6的函数对其进行Base64解码

虽然我绝对同意这些评论和回答,但使用事先准备好的语句,而不是自己这样做,在许多方面都是更聪明、更好的,而且当您可以使用它们时,总是建议您这样做。虽然您现在可能没有安全问题,但将来可能会突然出现安全问题;而准备好的报表的风险要低得多。如果你能找到解决办法,那就去做吧

我觉得我必须给出免责声明,以便在这里被认真对待

因为,我也相信,所有的逃逸都是可以人工完成的;鉴于环境受到控制。这与其他格式(如javascript)的转义没有什么不同。有时这是必要的。一、 例如,once需要创建一个没有可用数据库的SQL导出脚本

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

  • 输入字符串是UTF-8。你验证了这一点
  • 稍后执行mysql字符串时,完整的sql语句是UTF-8,连接也是如此
  • php没有什么疯狂的事情发生
  • 您不信任我未经测试的代码,请验证我所说的;)
为什么UTF-8如此重要

鉴于这两点,要模拟mysql\u real\u escape\u字符串,必须对以下字符进行转义:

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z. 
资料来源:

为此,这应足够:

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

$output = "'" . strtr($input, $translate) . "'";
如您所见,我仍然确保我的输出被引号包围。如果没有这一点,这种转义技术(也不是mysqli::real_escape_string)将是不够的

我见过的其他技术:

  • 拆分每个字节,并使用MySQL函数将其包围
  • Base64在PHP中对字符串进行编码,并使用MySQL 5.6的函数对其进行Base64解码

使用带有绑定参数的预处理语句,您就不必再担心它了。如果您想这样做,请使用白名单,而不是黑名单<代码>[^\w\s\pL]等。准备好的语句在我的用例中不起作用。由于项目范围的原因,我无法更改应用程序中实际执行查询并建立与数据库连接的其他部分中的代码。使用带有绑定参数的准备好的语句,您就不必再担心它了。如果您想这样做,请使用白名单,而不是黑名单<代码>[^\w\s\pL]等。准备好的语句在我的用例中不起作用。由于项目范围,我无法更改应用程序其他部分中的代码,该部分实际执行查询并建立与DB的连接。+1为了提及字符集,这些内容非常重要!我不希望它被转义,我只希望它不可执行。另外,假设我在代码中需要做一些卫生工作的地方没有DB连接。一个独立于字符集的解决方案会很好(假设一个正常的标准字符集)。@ChadBrewbaker,你低估了你需要做的事情。没有独立于字符集的解决方案。在一种情况下可能是非常有效的数据,在另一种情况下可能不是。实际上也没有一个健全的标准字符集。你必须选择一个。+1提到角色集,这个东西很重要!我不希望它被转义,我只希望它不可执行。另外,假设我没有DB连接a