我已经开始使用魔术引号,我遇到了一个小问题,这是一个容易出错的问题,我想我无法弄明白。
我不想使用条带线,当我在textarea中写东西时它不会被删除
代码:
<?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);
?>
但是现在我想根据安全原因使用我的网站输入
答案 0 :(得分:2)
我不能比cHao在manual page
上的评论更好魔术引号被弃用的原因是逃避/引用的一刀切方法是错误的并且非常危险。不同类型的内容具有不同的特殊字符和不同的方式来逃避它们,并且在一个中起作用的往往在其他地方具有副作用。任何样本代码,无论是在这里还是其他任何地方,假装像魔术引号一样工作 - 或者对HTML,SQL或其他任何事情进行类似的转换 - 同样是错误的并且同样危险。
魔术引号不是为了安全。他们从来没有。这是一个方便的东西 - 它们存在,所以PHP noob可以摸索并最终编写一些有用的mysql查询,而不必正确地学习转义/引用数据。它们可以防止一些意外的语法错误,就像他们的工作一样。但他们不会阻止恶意和半知识渊博的攻击者诋毁PHP noob的数据库。而那个可怜的菜鸟甚至可能都不知道他的数据库现在是怎样或为什么会消失,因为魔术引用(或者他那漂亮的“我将逃脱一切”的功能)给了他一种虚假的安全感。他从来不必学习如何真正处理不受信任的输入。
应该在需要转义数据的地方以及使用它的域中转义数据。 (mysql_real_escape_string - NOT addslashes! - 用于MySQL(除非你有线索和使用预备语句,否则这只是),htmlentities或htmlspecialchars for HTML等等。)其他任何事情都注定要失败。
真的,接受建议。不要使用它们,你不会通过尝试它们来学习任何有用的东西,只要忘记它们曾经存在过。
请查看此文章http://www.sitepoint.com/magic-quotes-headaches以及此http://econsultancy.com/us/blog/2663-web-app-security-basics-filtering-input-and-escaping-output以获取更多信息。
答案 1 :(得分:1)
它很容易受到攻击,但似乎更有助于提供帮助。所以,我的尝试是有帮助的。
因此,您要将数据发布回服务器,并且您希望确保用户回发的任何内容都不会以某种可能恶意行为的方式结束。
你采用它的天真策略说好,我会通过启用魔法引用来消除数据,这应该可以逃脱所有的恶意......
然而,它并没有。您的工作是确保在处理不受信任的数据时使用自定义的清洁策略,完全取决于您如何使用它。一个很好的学习资源哪里你应该允许不受信任的数据进入特定的位置,如何来逃避不受信任的数据可以在OWASP找到
您会注意到并非所有地点都适合不受信任的数据,转义或其他方式。这突出了这样一个事实,即要真正实施安全网站,您必须同时考虑哪里不受信任的数据以及 数据如何到达那里。
这个问题更直接地关注如何,因为我们正在考虑(并且攻击使用)一般的转义机制。你暗示打开魔术引号是一种合适的方法,用于转发发往不受信任数据的所有位置的数据。
最佳实践说,实际上,您需要使用适合您打算使用它的位置的转义机制。正如已经指出的那样,使用mysql_real_escape_string是一种流行的函数,它特定于转义用于MySQL查询的字符串。人们确实使用这种机制,但正确使用PHP Data Objects (PDO)取代了使用此机制手动转义数据的需要。 (将不受信任的数据绑定到参数而不是手动构建查询字符串)。
其他明显的转义机制包括使用htmlspecialchars或htmlentities编码html字符,以及更通用的引用转义机制addslashes和addcslashes。甚至还有针对命令行参数escapeshellarg和escapeshellcmd
的转义方法因此,您可以看到正确转发数据远不如将魔术引号应用于所有传入数据那么简单,并且通常有完善的机制可以根据您打算使用它的位置安全地转义数据。
答案 2 :(得分:-1)
轻松解决您的问题是创建一个简单的功能,如果它将触及您的数据库,您可以推送所有数据。可以这样建模:
function sanitizeString($var)
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}//end sanitizeString