过滤用户输入
我已经阅读了很多关于过滤用户输入的文章,但大多数时候答案是,这取决于你在做什么。下面是我在做什么:过滤用户输入
function clean($field, $link)
{
return mysql_real_escape_string($field, $link);
}
通过将显示后面的HTML/PHP页面或在表单提交的数据:
通过,将在MySQL查询使用的形式提交的数据电子邮件:从数据库
function output_html($value)
{
return stripslashes(htmlspecialchars($value));
}
数据显示:
function output_db($value)
{
return stripslashes($value);
}
这是足以让我ñ电火工品?有什么我不考虑?
谢谢!
将字符串插入SQL查询时使用mysql_real_escape_string()
,无论输入来自何处。
使用htmlspecialchars()
或htmlentities()
将字符串插入HTML代码时,无论输入来自何处。
将值插入URL的查询字符串时使用urlencode()
,无论值来自哪里。
如果这个数据来自用户,那么你应该做这些事情,因为有可能用户试图做坏事。但除了安全性 - 如果你想插入一个合法的字符串到一个SQL查询和字符串恰好有一个单引号字符呢?你仍然必须逃避它。
如果你刚开始,我会真正考虑使用类似PDO的东西。你最终会希望以这种方式迁移,那么为什么不现在就开始。
PDO将自动清理您的输入,这很好。它也会使用prepare()语句,这样就保证了一个单一的查询,从而防止有人用“DROP TABLE xxx”进行攻击。或者这样。
如果你有能力,我会建议使用,而不是MySQL的库MySQLi,并利用准备好的语句:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$city = "Amersfoort";
/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
来源:http://php.net/manual/en/mysqli.prepare.php
这提供了基本的类型检查,确实为你逃跑。我不会对输出DB数据建议stripslashes
因为:
- DB数据可以有斜线以他们为你反正
htmlstriptags
这可以去掉那些试图用标签和类似东西变得可爱的人。
将数据插入到SQL数据库中时,需要将其转义以防止SQL注入,并且mysql_real_escape_string()
在mysql中适用。尽管如此,你必须记住把它用于所有事情,所以它很容易出错。您应该使用类似PDO的东西,它会自动转义每个传入的值。
从数据库中获取的数据通常不需要任何特殊处理(即避免失败)。我不知道您在那里用stripslashes()
做什么。如果是为了移除PHP插入的魔术引号,你应该在那里从GET/POST/etc中提取用户提供的值。 (或者完全禁用魔术引号,如果可以的话,并且没有任何其他依赖它的软件)
数据传出到html需要被转义以防止XSS。 htmlspecialchars()
是正确的功能。再次,我不知道你想用什么stripslashes()
。再次,你需要记住逃避每个值,这是容易出错的。您至少应该考虑使用模板引擎或其他能够自动转义所有html值的其他功能。
嗨,感谢您的这些信息:)我只是想澄清,是htmlspecialchars()唯一的安全措施,我需要做的变量输出到HTML?当你说错误倾向时,你的意思是它可能无法正常工作,因此不是100%安全的?你知道哪些模板引擎可用?谢谢,sarah – Sarah 2015-02-14 21:36:32
@Sarah:这是你内部数据元素唯一需要的东西。 (当然,如果你把任意的用户内容放在一个脚本元素中,你仍然被搞砸了)我的意思是容易出错是因为很容易忘记在任何地方使用它,如果你甚至在一个地方忘记它,你'被拧紧了。如果您需要将用户定义的内容放在属性中(例如.href),则需要做的不仅仅是这些,因为恶意用户可以输入例如。 '的JavaScript:whatever'。例如。对于href,你可能只想列出一些允许的协议,因为浏览器允许“javascript:”的各种变体工作。 – 2015-02-15 06:32:56
谢谢你的解释。我可以问你,在href属性方面..是只有在用户定义的情况下?..在我的项目中,我从facebook检索json数据并在php中使用该数据,将此数据插入到href属性和其他元素。但在这种情况下,它全部来自Facebook,没有任何来自用户。我需要在将这些数据插入到我的html之前对这些数据执行安全措施还是安全?谢谢... – Sarah 2015-02-15 15:37:01
你问的应用程序的安全性,即SQL注入? – 2011-05-11 15:42:54
@ robert-harvey SQL注入,并通过JS等将代码添加到我的页面 – NightHawk 2011-05-11 15:47:30
'output_db'表明你做错了。如果您正确地转义了您的内容,并且没有启用superflous magic_quotes,那么在数据库查询之后不需要stripslashes()。 http://php.net/manual/en/security.magicquotes.disabling.php – mario 2011-05-11 16:16:34