首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >升级到php 8.1,现在得到"PHP弃用: addslashes()“

升级到php 8.1,现在得到"PHP弃用: addslashes()“
EN

Stack Overflow用户
提问于 2022-03-02 04:22:41
回答 2查看 1.5K关注 0票数 2

我刚刚从7.3升级到了php8.1,并解决了一些失败的问题。弹出的一条消息是"PHP被弃用: addslashes()“。我们经常使用这个命令,这并不是为了防止mysql注入。我们必须处理的名字,可能有特殊的字符在他们的~等。

但是,当我查看https://www.php.net/manual/en/function.addslashes.php时,它说它在PHP8中是支持的。

抱歉,我想我的新鲜感.但我错过了什么?如果它出来了,好吧,现在支持的处理方法是什么?

更新以添加代码示例和问题澄清

现在我已经睡过它了,我看到它不是addslashes()上的弃用错误。这是一个错误,我们要传递给函数的值是NULL。我在文档中看到,这在8.1岁时就不再被允许了。

因此,基于这些信息,新的和改进的方法是如何处理下面的例子。

代码语言:javascript
运行
复制
$(function () {
$('.adminheader').html('<?php addslashes(GetMainEventNames()); ?>');
$('.maineventbuttons').button().each(function () {
  var MainEventCode = $(this).attr('data-code');
          $(this).click(function () {
            ChangeLocalActiveStatus(MainEventCode);
          });
      });

错误消息

代码语言:javascript
运行
复制
PHP Deprecated:  addslashes(): Passing null to parameter #1 ($string) of type string is deprecated in....
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-02 15:03:32

因此,PHP函数GetMainEventNames()至少有时会返回null。这是预期的行为还是期望的行为?如果是的话,有两种可能的解决办法。一个是让您的函数检查返回值是否为null,然后返回一个空字符串。另一种方法是在您的零聚结算子函数中使用addslashes(),如下所示:

代码语言:javascript
运行
复制
<?php addslashes(GetMainEventNames() ?? ''); ?>
票数 4
EN

Stack Overflow用户

发布于 2022-03-02 15:38:19

地址斜杠永远不是正确的答案,

为了解决你的具体代码,

代码语言:javascript
运行
复制
$('.adminheader').html('<?php addslashes(GetMainEventNames()); ?>');

应改为

代码语言:javascript
运行
复制
$('.adminheader').html(<?php echo json_encode(htmlentities(GetMainEventNames(), ENT_QUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED),JSON_THROW_ON_ERROR); ?>);

一般说来,

如果您需要转义HTML,则(不幸的是)

代码语言:javascript
运行
复制
echo htmlentities($html, ENT_QUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED);

如果需要引用shell参数,则

代码语言:javascript
运行
复制
$cmd.= " --file=" . escapeshellarg($arg);

如果需要引用SQL字符串,则

代码语言:javascript
运行
复制
$sql.= "WHERE col = '".$mysqli->real_escape_string($str)."'";

代码语言:javascript
运行
复制
$sql.= "WHERE col = " . $pdo->quote($str);

如果需要引用javascript/json字符串,则

代码语言:javascript
运行
复制
let str = <?=json_encode($str, JSON_THROW_ON_ERROR);?>;

如果需要引用xpath中的字符串,则

代码语言:javascript
运行
复制
//based on https://stackoverflow.com/a/1352556/1067003
function xpath_quote(string $value):string{
    if(false===strpos($value,'"')){
        return '"'.$value.'"';
    }
    if(false===strpos($value,'\'')){
        return '\''.$value.'\'';
    }
    // if the value contains both single and double quotes, construct an
    // expression that concatenates all non-double-quote substrings with
    // the quotes, e.g.:
    //
    //    concat("'foo'", '"', "bar")
    $sb='concat(';
    $substrings=explode('"',$value);
    for($i=0;$i<count($substrings);++$i){
        $needComma=($i>0);
        if($substrings[$i]!==''){
            if($i>0){
                $sb.=', ';
            }
            $sb.='"'.$substrings[$i].'"';
            $needComma=true;
        }
        if($i < (count($substrings) -1)){
            if($needComma){
                $sb.=', ';
            }
            $sb.="'\"'";
        }
    }
    $sb.=')';
    return $sb;
}
$xp->query('/catalog/items/item[title='.xpath_quote($var).']');

如果需要引用CSS中的字符串,则它的

代码语言:javascript
运行
复制
// CSS escape code ripped from Zend Framework ( https://github.com/zendframework/zf2/blob/master/library/Zend/Escaper/Escaper.php )
function css_escape_string($string)
{
    $cssMatcher = function ($matches) {
        $chr = $matches[0];
        if (strlen($chr) == 1) {
            $ord = ord($chr);
        } else {
            $chr = mb_convert_encoding($chr, 'UTF-16BE', 'UTF-8'); // $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8');
            $ord = hexdec(bin2hex($chr));
        }
        return sprintf('\\%X ', $ord);
    };
    $originalEncoding = mb_detect_encoding($string);
    if ($originalEncoding === false) {
        $originalEncoding = 'UTF-8';
    }
    ;
    $string = mb_convert_encoding($string, 'UTF-8', $originalEncoding); // $this->toUtf8($string);
                                                                        // throw new Exception('mb_convert_encoding(\''.$string.'\',\'UTF-8\',\''.$originalEncoding.'\');');
    if ($string === '' || ctype_digit($string)) {
        return $string;
    }
    $result = preg_replace_callback('/[^a-z0-9]/iSu', /*$this->*/$cssMatcher, $string);
    // var_dump($result);
    return mb_convert_encoding($result, $originalEncoding, 'UTF-8'); // $this->fromUtf8($result);
}

在任何时候都不是加法,永远都是正确的答案--,(Mis)使用它会导致安全漏洞。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71317443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档