PHP 的 stripslashes 函数有什么意义?

Jas*_*n12 5 php mysqli

假设您有以下内容:

<?php

    $connection = mysqli_connect("host", "root", "passwd", "dbname");

    $habits = mysqli_real_escape_string($connection, $_POST['habits']);

?>
Run Code Online (Sandbox Code Playgroud)

假设您在一个名为“习惯”的领域输入了“拔河比赛”的值。因此,mysqli_real_escape_string 函数将对第二个引号符号进行转义,并且数据库引擎不会误以为该值为“tug o”。相反,它会知道该价值实际上是“拉锯战”。我的问题是,为什么需要 stripslashes 函数?stripslashes 函数将简单地剥夺 mysqli_real_escape_string 函数所做的良好工作。去掉反斜杠只会让你回到原来的位置,数据库将再次被愚弄。我是否可以假设 stripslashes 函数不用于数据库目的?也就是说,这段代码会不会完全是无意义的?:

<?php

    $connection = mysqli_connect("host", "root", "passwd", "dbname");

    $habits = mysqli_real_escape_string($connection, $_POST['habits']);

    $undosomething = stripslashes($habits);

    echo '$undosomething';

?>
Run Code Online (Sandbox Code Playgroud)

如果 stripslashes 不用于数据库目的,那么它到底用于什么?

sle*_*vy1 2

根据手册,stripslashes() 的目的是取消引用带引号的字符串,这意味着删除引用字符的反斜杠。请注意,PHP 缺少字符数据类型,因此所有单个字符都是字符串。您可能希望仔细阅读此示例代码,它演示了此函数保留正斜杠以及涉及不可打印字符的转义序列不变。Stripslashes() 的出现是为了应对 PHP 以前支持的一项功能(魔术引号)引起的过度引用。

在 PHP 的早期,当 Rasmus Lerdorf 处理需要转义单引号字符的数据库时,他找到了一种方法来避免手动添加反斜杠来引用或转义该字符的繁琐工作;他创造了神奇的名言

    ... useful when mSQL or Postgres95 support is enabled
    since ... single quote has to be escaped when it is 
    part of [a] ... query ... 

                        (See php.h in PHP/FI [php-2.0.1] )
Run Code Online (Sandbox Code Playgroud)

虽然魔术引号使开发人员不必使用addslashes(),但此功能可能会自动不恰当地引用。值为 的表单输入O'Reilly将显示为O\'Reilly。应用 stripslashes() 解决了这个问题。尽管 stripslashes() 名副其实并去掉了反斜杠,但它不足以解决与魔术引号相关的所有问题,该功能最终将在 PHP5.3 中被弃用,然后从 PHP5.4 开始被删除(请参阅手册) 。

如果您仍在使用支持魔术引号的 PHP 版本,则可以查看引用的数据。例如,考虑 $_GET 变量源自包含 url 编码字符串的 JavaScript 的情况,如下所示:

location.href="next_page.php?name=O%27Riley"; // $_GET['name'] == O\'Riley 
Run Code Online (Sandbox Code Playgroud)

如果您要对 $_GET['name'] 应用addslashes() 或mysqli_real_escape_string(),则该变量的值将扩展,包含另外两个反斜杠,如下所示:

O\\\'Riley
Run Code Online (Sandbox Code Playgroud)

假设接下来在插入查询中使用该变量。通常,带引号的字符的反斜杠不会存储在数据库中。但是,在这种情况下,查询将导致数据存储为:

O\'Riley

如今,对 stripslashes() 的需求已经不大可能了,但仍然保留它是件好事。考虑以下 JavaScript,其中包含明显的拼写错误:

location.href="http://localhost/exp/mydog.php
?content=My%20dog%20doesn\\\\\\\\\\\\\%27t%20
like%20to%20stay%20indoors."
Run Code Online (Sandbox Code Playgroud)

使用 stripslashes(),可以动态更正代码,如下所示:

function removeslashes($string)
{
    while( strpos( $string, "\\" ) !== FALSE ) {
      $string = stripslashes( $string );
    }
    return $string;
}

$text = htmlentities($_GET['content']);
if (strpos($text,"\\") !== FALSE ) {
    echo removeslashes( $text );
}
Run Code Online (Sandbox Code Playgroud)

注意:stripslashes() 不是递归的。