[英]Filtering User Input
我在这里阅读了很多关于过滤用户输入的问答,但大多数时候答案是它取决于你在做什么。 这是我正在做的事情:
通过将在MySQL查询中使用的表单提交的数据:
function clean($field, $link)
{
return mysql_real_escape_string($field, $link);
}
通过表格提交的数据将显示在HTML / PHP页面或电子邮件中:
function output_html($value)
{
return stripslashes(htmlspecialchars($value));
}
从数据库显示的数据:
function output_db($value)
{
return stripslashes($value);
}
这是否足以满足我的需求? 有什么我不考虑的吗?
谢谢!
在将字符串插入SQL查询时,无论输入来自何处,都使用mysql_real_escape_string()
。
将字符串插入HTML代码时,无论输入来自何处,都使用htmlspecialchars()
或htmlentities()
。
将值插入URL的查询字符串时,请使用urlencode()
,无论值来自何处。
如果这些数据来自用户,那么你肯定应该做这些事情,因为用户有可能尝试做坏事。 但是除了安全性之外 - 如果你想将一个合法的字符串插入一个SQL查询并且该字符串碰巧有一个单引号字符,该怎么办? 你仍然必须逃脱它。
如果你刚开始的话我真的会考虑使用像PDO这样的东西。 您最终希望以这种方式迁移,所以为什么不立即开始。
PDO会自动清理您的输入,这很棒。 它还将使用prepare()语句,因此您可以保证单个查询,从而防止某人使用“; DROP TABLE xxx;”进行攻击。 或者这样的。
当您将数据插入SQL数据库时,您需要转义它以防止SQL注入,并且mysql_real_escape_string()
是在mysql中使用它的正确方法。 但是,您必须记住将其用于所有内容,因此容易出错。 您应该使用类似PDO的东西,它会自动转义每个传入的值。
来自数据库的数据通常不需要任何特殊处理(即unescaping)。 我不知道你在尝试用stripslashes()
做什么。 如果它是为了删除PHP插入的魔术引号,那么你应该这样做,从GET / POST / etc中提取用户提供的值。 (或者完全禁用魔术引号,如果可以,并且没有任何其他依赖它的软件)
需要转发输出到html的数据以防止XSS。 htmlspecialchars()
是正确的功能。 再一次,我不知道你正在尝试使用stripslashes()
。 而且,你需要记住要逃避每个值,这很容易出错。 你至少应该考虑使用模板引擎或其他能自动逃避所有html值的东西的好处。
如果你有能力,我建议使用mysqli而不是mysql,并使用预备语句:
<?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
,因为:
关于显示HTML,还有htmlstriptags
可以剥离试图用标签等可爱的人。
我建议你使用php 5.2中介绍的过滤器它们很棒,并为你节省了大量的数据验证和保护。 检查一下
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.