-1

我已经开始使用魔术引号,但遇到了一个小问题,我想这是一个我想不通的简单问题。

我不想使用当我在我的文本区域中写东西时它不会删除的条纹

代码:

<?php
echo "Removed Slashes: ";
// Remove those slashes
if(get_magic_quotes_gpc())
    echo stripslashes($_POST['question']);
else
    echo $_POST['question'];

?>

<form method='post'>
Question: <input type='text' name='question'/><br />
<input type='submit'>

</form>

我也试过这个真的有效!:

<?php
$str = "Is your name O\'reilly?";

// Outputs: Is your name O'reilly?
echo stripslashes($str);
?>

但现在出于安全原因,我想将我的输入用于网站

4

3 回答 3

2

我不能说它比 cHao 在手册页上的评论更好

不推荐使用魔术引号的原因是,一种千篇一律的转义/引用方法是错误的,而且非常危险。不同类型的内容具有不同的特殊字符和不同的转义方式,并且在一个内容中起作用的内容往往会在其他地方产生副作用。任何示例代码,在这里或其他任何地方,假装像魔术引号一样工作——或者对 HTML、SQL 或其他任何东西进行类似的转换——同样是错误的,同样是危险的。

魔术引号不是为了安全。他们从来没有。这是一件很方便的事情——它们的存在使得 PHP 新手可以摸索并最终编写一些有点工作的 mysql 查询,而无需了解如何正确转义/引用数据。他们防止一些意外的语法错误,就像他们的工作一样。但它们不会阻止恶意和半知识的攻击者破坏 PHP noob 的数据库。而那个可怜的菜鸟甚至可能永远不知道他的数据库现在是如何消失或为什么消失了,因为魔术引号(或他那漂亮的“我要逃避一切”功能)给了他一种虚假的安全感。他不必学习如何真正处理不受信任的输入。

数据应该在您需要转义的地方以及将要使用的域中转义。(mysql_real_escape_string -- 不是添加斜杠! -- 用于 MySQL(除非你有线索并使用准备好的语句),用于 HTML 的 htmlentities 或 htmlspecialchars 等)其他任何事情都注定要失败。

真的,接受建议。不要使用它们,通过尝试它们不会学到任何有用的东西,只是忘记它们曾经存在过。

看看这篇文章http://www.sitepoint.com/magic-quotes-headaches和这篇文章http://econsultancy.com/us/blog/2663-web-app-security-basics-filtering-input- and-escaping-output以获取更多信息。

于 2012-04-26T18:46:51.210 回答
1

好吧,它很容易攻击,但似乎需要更多的帮助。所以这是我试图提供帮助的尝试。

因此,您正在将数据发回服务器,并且您希望确保用户发回的任何内容都不会最终出现在它可以进行恶意操作的地方。

您采用的天真的策略是说好的,我将通过打开魔术引用来一般地清理数据,这应该可以避免所有的讨厌......

然而,事实并非如此。您的工作是确保在处理不受信任的数据时使用自定义的清理策略,这完全取决于您如何使用它。可以在OWASP上找到一个很好的资源,用于了解应该允许不受信任的数据在哪里进入特定位置,以及如何逃避不受信任的数据

您会注意到并非所有位置都适合不受信任的数据、转义或其他情况。这突出了一个事实,即要真正实施安全网站,您必须考虑不受信任的数据的去向以及数据如何到达那里。

这个问题更直接地集中在how上,因为我们正在考虑(并攻击使用)一个通用的转义机制。您的意思是打开魔术引号是一种合适的方法来转义注定要发送到您的不受信任数据可能最终到达的所有位置的数据。

最佳实践表明,实际上,您需要使用适合您打算使用它的位置的转义机制。正如已经指出的,mysql_real_escape_string的使用是一个流行的函数,它专门用于在 MySQL 查询中转义字符串。人们确实使用这种机制,但是使用这种机制手动转义数据的需要被正确使用PHP 数据对象 (PDO)所取代。(将不受信任的数据绑定到参数,而不是手动构建查询字符串)。

其他明显的转义机制包括使用htmlspecialcharshtmlentities对 html 字符进行编码,以及更通用的引号转义机制addlashesaddcslashes甚至还有命令行参数escapeshellargescapeshellcmd的转义方法

因此,您可以看到正确转义数据远没有将魔术引号应用于所有传入数据那么简单,并且通常有完善的机制可以根据您打算使用它的位置安全地转义数据。

于 2012-04-26T23:44:15.417 回答
-1

解决您的问题的简单方法是创建一个简单的函数,如果它要触及您的数据库,您可以通过它推送所有数据。可以这样建模:

function sanitizeString($var)
{

    $var = strip_tags($var);
    $var = htmlentities($var);
    $var = stripslashes($var);

    return mysql_real_escape_string($var);

}//end sanitizeString
于 2012-04-26T19:20:29.203 回答