假设您有以下内容:
<?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不用于数据库目的,它究竟用于什么?
答案 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:
body, html, iframe {
width: 100% ;
height: 100% ;
overflow: hidden ;
}
&#13;
<iframe src="https://ideone.com/2DNzNJ"></iframe>
&#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;
}
?>