我在这里阅读了很多关于过滤用户输入的问答,但大部分时间答案都取决于你在做什么。这就是我正在做的事情:
通过将在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);
}
这是否足以满足我的需求?有什么我不考虑的吗?
谢谢!
答案 0 :(得分:6)
在将字符串插入SQL查询时使用mysql_real_escape_string()
,无论输入来自何处。
在将字符串插入HTML代码时使用htmlspecialchars()
或htmlentities()
,无论输入来自何处。
在将值插入URL的查询字符串时使用urlencode()
,无论值来自何处。
如果这些数据来自用户,那么你肯定应该做这些事情,因为用户可能会尝试做坏事。但是除了安全性之外 - 如果你想将一个合法的字符串插入一个SQL查询并且该字符串碰巧有一个单引号字符,该怎么办?你仍然必须逃脱它。
答案 1 :(得分:2)
如果你刚开始的话,我真的会考虑使用像PDO这样的东西。您最终希望以这种方式迁移,所以为什么不立即开始。
PDO会自动清理您的输入,这很棒。它还将使用prepare()语句,因此您可以保证单个查询,从而防止某人使用“; DROP TABLE xxx;”进行攻击。或者这样的。
答案 2 :(得分:2)
当您将数据插入SQL数据库时,您需要对其进行转义以防止SQL注入,并且mysql_real_escape_string()
在mysql中使用stripslashes()
是正确的。但是,您必须记住将其用于所有内容,因此容易出错。您应该使用类似PDO的东西,它会自动转义每个传入的值。
来自数据库的数据通常不需要任何特殊处理(即unescaping)。我不知道你在htmlspecialchars()
尝试做什么。如果它是为了删除PHP插入的魔术引号,那么你应该这样做,从GET / POST / etc中提取用户提供的值。 (或完全禁用魔术引号,如果可以,并且没有任何其他依赖它的软件)
需要转发输出到html的数据以防止XSS。 stripslashes()
是正确的功能。同样,我不知道您正在尝试使用{{1}}。而且,你需要记住要逃避每个值,这很容易出错。您至少应该考虑使用模板引擎或其他能够自动转义所有html值的内容的好处。
答案 3 :(得分:1)
如果你有能力,我建议使用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
可以删除那些试图用标签等可爱的人。
答案 4 :(得分:0)
我建议你使用php 5.2中介绍的过滤器,它们很棒,为你节省了大量的数据验证和保护。点击这里