如何制作一个 php 脚本,它接受一个参数并在它找到的每个字符串中转义一个引号,无论有多少级别的嵌套数组。
我尝试过这样的事情
$FileName = preg_replace("/'/", '', $UserInput);
但我不想替换字符串
如何制作一个 php 脚本,它接受一个参数并在它找到的每个字符串中转义一个引号,无论有多少级别的嵌套数组。
我尝试过这样的事情
$FileName = preg_replace("/'/", '', $UserInput);
但我不想替换字符串
function recAddslashes($var){
return is_array($var) ? array_map(__FUNCTION__, $var) : addcslashes($var, "'");
}
(见addcslashes
)
您需要创建一个递归函数,该函数循环认为每个数组并且它不是一个数组,它将替换'
它然后回显它然后再次循环到下一个数组
function traverseArray($array)
{
// Loops through each element. If element again is array, function is recalled. If not, result is echoed.
foreach($array as $key=>$value)
{
if(is_array($value))
{
traverseArray($value);
}else{
$FileName = preg_replace("/'/", '', $value);
echo $FileName;
}
}
}
如果您想让文件名安全,您可以采用白名单方法并且只允许某些字符:
$Filename = preg_replace('/[^A-Za-z0-9_\-]/', '_', $userInput);
上面的正则表达式将替换任何不是字母、数字、破折号或下划线的字符。任何不允许的字符都将替换为下划线。白名单(允许一小部分“安全”字符)比黑名单(不允许一长串“不安全”字符)安全得多。我的第一个假设是您允许用户在您的服务器上指定文件的名称。但是,如果您使用这种方法来防范 SQL 注入,那么您肯定走错了路。准备好的语句是保护数据库免受 SQL 注入的唯一推荐方法。
未经测试,但应该可以解决问题:
function escape_single_quotes( $arg ){
if( is_array( $arg ) ){
foreach( $arg as &$k ){
$k = escape_single_quotes( $k );
}
}else{
$arg = str_replace("'","\'", $arg);
}
return $arg;
}