PHP的striplashes功能有什么意义?

时间:2014-12-25 19:46:22

标签: php mysqli

假设您有以下内容:

<?php

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

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

?>

让我们说,你进入了一个名为“习惯”的领域,这个价值就是&#39; tug o&#39;战争&#39 ;.因此,mysqli_real_escape_string函数将转义第二个引号符号,并且数据库引擎不会被认为该值是“tug o&#39;”。相反,它会知道这个价值实际上已经超过了战争&#39 ;.我的问题是,为什么你需要一个striplashes函数? striplashes函数将简单地去除mysqli_real_escape_string函数所做的好工作。剥离反斜杠只会让你回到原来的位置,数据库将再次被愚弄。我是否认为striplashes函数不用于数据库目的?也就是说,这段代码是否完全没有意义?:

<?php

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

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

    $undosomething = stripslashes($habits);

    echo '$undosomething';

?>

如果striplashes不用于数据库目的,它究竟用于什么?

5 个答案:

答案 0 :(得分:2)

它仍然有它的用途。它并不真正用于数据库,但即便如此,也有用例。我们假设,或者使用JavaScript从表单发送数据,并且您有一个带有引号的字符串,例如“It's”。通过$_GET超变量获得值,你将获得值“它是”。如果您使用mysqli_real_escape_string()或类似的(您必须使用它来保证安全性),则引号将被双重编码,反斜杠将保存到数据库中。对于此类方案,您将使用此功能。但它不是为了安全,也不一定与数据库一起使用。

答案 1 :(得分:1)

根据Manual,stripslashes()的目的是取消引用带引号的字符串,这意味着删除引用字符的反斜杠。注意,PHP缺少字符数据类型,因此所有单个字符都是字符串。您可能希望仔细阅读此example code,这表明此函数会保留正斜杠以及escape sequences涉及不可打印字符的不可打印字符。 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] )

虽然魔术引号使开发人员不必使用addslashes(),但此功能可能会自动引用不当。值为O'Reilly的表单输入将显示为O\'Reilly。应用stripslashes()修复了这个问题。虽然stripslashes()符合其名称并剥离了反斜杠,但它不足以解决与魔术引号相关的所有问题,这一功能最终将在PHP5.3中弃用,然后从PHP5.4开始删除(参见{{ 3}})。

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

location.href="next_page.php?name=O%27Riley"; // $_GET['name'] == O\'Riley 

如果你要申请$ _GET [&#39; name&#39;] addslashes()或mysqli_real_escape_string(),这个变量的值会扩展,包含两个反斜杠,如下所示:

O\\\'Riley

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

O\'Riley

现在对striplashes()的需求不太可能,但保留它仍然是好事。请考虑以下JavaScript,其中包含一个明显的拼写错误:

location.href="http://localhost/exp/mydog.php
?content=My%20dog%20doesn\\\\\\\\\\\\\%27t%20
like%20to%20stay%20indoors."

使用stripslashes(),可以按如下方式动态更正代码:

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

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

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

答案 2 :(得分:1)

<强>和addslashes()

w3schools.com - function returns a string with backslashes in front of predefined characters.
php.net - Quote string with slashes

<强> stripslashes()函数

w3schools.com - function removes backslashes added by the addslashes() function.
php.net - Un-quotes a quoted string

<?php

  $str = "Who's Peter Griffin?";

  echo $str . " This is original string." . PHP_EOL;

  echo addslashes($str) . " This is addslashes string." . PHP_EOL;

  echo stripslashes(addslashes($str)) . " This is stripslashes string."  . PHP_EOL;

?>

在线嵌入PHP:

&#13;
&#13;
body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
&#13;
<iframe src="https://ideone.com/2DNzNJ"></iframe>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

stripslashes()没有意义。

有些人过去认为这为他们提供了安全保障,但正如你所看到的那样。它应该完全从PHP中删除,但它还没有。

答案 4 :(得分:0)

mysqli_real_escape_string和stripslashes没有sql注入提供保护。 使用准备好的陈述。 示例代码。

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

$id = 1;
if (!$stmt->bind_param("i", $id)) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
?>