我刚刚从7.3升级到了php8.1,并解决了一些失败的问题。弹出的一条消息是"PHP被弃用: addslashes()“。我们经常使用这个命令,这并不是为了防止mysql注入。我们必须处理的名字,可能有特殊的字符在他们的~等。
但是,当我查看https://www.php.net/manual/en/function.addslashes.php时,它说它在PHP8中是支持的。
抱歉,我想我的新鲜感.但我错过了什么?如果它出来了,好吧,现在支持的处理方法是什么?
更新以添加代码示例和问题澄清
现在我已经睡过它了,我看到它不是addslashes()上的弃用错误。这是一个错误,我们要传递给函数的值是NULL。我在文档中看到,这在8.1岁时就不再被允许了。
因此,基于这些信息,新的和改进的方法是如何处理下面的例子。
$(function () {
$('.adminheader').html('<?php addslashes(GetMainEventNames()); ?>');
$('.maineventbuttons').button().each(function () {
var MainEventCode = $(this).attr('data-code');
$(this).click(function () {
ChangeLocalActiveStatus(MainEventCode);
});
});
错误消息
PHP Deprecated: addslashes(): Passing null to parameter #1 ($string) of type string is deprecated in....
发布于 2022-03-02 15:03:32
因此,PHP函数GetMainEventNames()
至少有时会返回null
。这是预期的行为还是期望的行为?如果是的话,有两种可能的解决办法。一个是让您的函数检查返回值是否为null,然后返回一个空字符串。另一种方法是在您的零聚结算子函数中使用addslashes()
,如下所示:
<?php addslashes(GetMainEventNames() ?? ''); ?>
发布于 2022-03-02 15:38:19
地址斜杠永远不是正确的答案,
为了解决你的具体代码,
$('.adminheader').html('<?php addslashes(GetMainEventNames()); ?>');
应改为
$('.adminheader').html(<?php echo json_encode(htmlentities(GetMainEventNames(), ENT_QUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED),JSON_THROW_ON_ERROR); ?>);
一般说来,
如果您需要转义HTML,则(不幸的是)
echo htmlentities($html, ENT_QUOTES|ENT_SUBSTITUTE|ENT_DISALLOWED);
如果需要引用shell参数,则
$cmd.= " --file=" . escapeshellarg($arg);
如果需要引用SQL字符串,则
$sql.= "WHERE col = '".$mysqli->real_escape_string($str)."'";
或
$sql.= "WHERE col = " . $pdo->quote($str);
如果需要引用javascript/json字符串,则
let str = <?=json_encode($str, JSON_THROW_ON_ERROR);?>;
如果需要引用xpath中的字符串,则
//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中的字符串,则它的
// 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)使用它会导致安全漏洞。
https://stackoverflow.com/questions/71317443
复制相似问题