Php 在不使用mysqli_real_escape_string()的情况下输入sanitizaton
我想剥离用户输入的SQL可执行语句,但代码库的方式是,我不想建立mysqli_real_escape_string(connection,string)所需的DB连接 什么是优雅的regex/replace-one-liner来净化字符串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,
<?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解码
- 输入字符串是UTF-8。你验证了这一点
- 稍后执行mysql字符串时,完整的sql语句是UTF-8,连接也是如此
- php没有什么疯狂的事情发生
- 您不信任我未经测试的代码,请验证我所说的;)李>
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解码