我是否需要在所有表单输入上使用mysql_real_escape_string?

时间:2011-04-11 20:04:41

标签: php security

我知道我需要在用户输入字段(例如用户名输入字段)上使用它们,但是对于单选按钮(例如性别选项)呢?

8 个答案:

答案 0 :(得分:5)

停止!

您似乎将转义数据验证数据清理混淆。

您需要验证任何进入的数据。是的,这意味着确保单选按钮包含合法值。

您需要清理任何数据。该文本字段是否应包含HTML?没有? strip_tags。这个字段应该是一个数字吗?将其转换为整数。

您需要转义放置在数据库中的所有数据。如果您仍在使用史前“mysql”扩展程序,则意味着在构建查询时对所有使用mysql_real_escape_string - 而不是之前。

您需要转义回应用户的任何数据htmlspecialchars是你的朋友。

I've previously explained this in more detail,虽然这不是一个重复的问题。

答案 1 :(得分:2)

应检查从表单发送到服务器的所有字段的有效输入。所有字段都可以通过sql或其他注入的方式进行操作。

答案 2 :(得分:2)

流行测验:

给出一个小的HTML表单代码:

<input type="hidden" name="studentID" value="42" />
<input type="radio" name="gender" value="Robert'; DROP TABLE Students" />

和您的服务器端代码:

$studentID = $_POST['studentID'];
$gender = $_POST['gender'];

$sql = "UPDATE Students SET gender='$gender' WHERE studentID=$studentID";
$res = mysql_query($sql);

这段代码有多少种错误?


@Basic,在mininum,这是'大'错误:

  1. 未能确认学生ID是整数。
  2. 未能确认studentID实际上是否有效且存在于数据库中。
  3. 将studentID直接插入查询,可能允许直接SQL注入攻击。
  4. 通过客户端表单对临界值(studentID)进行四舍五入,允许用户破解表单并更改任何学生的性别。
  5. 未能验证性别值,允许任意数据进入数据库(例如,小Bobby表现在属于性别'n / a')
  6. 将性别值直接插入查询字符串,导致直接SQL注入攻击(在这种情况下,Students表会被删除)。
  7. 未能检查mysql_query()的返回值。查询可以在语法上完美,但仍然由于其他原因而失败。完成后永远不要忘记检查查询调用的状态。
  8. 当只有学生的性别问题时,没有那么大的交易。也许有一封关于“罗伯特女士”和“她”最近被拘留的表格信件。

    如果它是一个网上银行网站并且SQL注入只是将您的支票账户余额转移到开曼群岛的一些离岸账户,那就非常重要。

答案 3 :(得分:1)

有很多方法(供用户使用)更改提交的数据,所以 - 是的,您需要将它用于单选按钮。

例如,您可以将单选按钮更改为输入类型文本,并轻松修改该值。

答案 4 :(得分:1)

是的,你需要它。用户可以根据自己的喜好更改表单输入。萤火虫创造了奇迹。

答案 5 :(得分:1)

好吧,你应该对你传递给mysql的所有字符串都这样做,不一定是网络输入; - )

答案 6 :(得分:0)

是。实际上,您还应该检查单选按钮/列表的值,以确保该值是有效值。见in_array()。这是一个示例(为清晰起见,省略了isset检查):

$validValues = array('gold', 'silver', 'bronze');

$value = $_POST['value'];

if (in_array($value, $validValues)) {
    // request is valid
} else {
    // request is invalid
}

你唯一不应该使用mysql_real_escape_string(),那就是你希望整数的值。但你必须小心处理它们。阅读这篇文章:

http://www.webappsec.org/projects/articles/091007.shtml

该文章介绍了您不希望SQL注入的情况,包括如何处理整数。

答案 7 :(得分:0)

一个很好的方法,你可以保护你的$ _POST输入是通过运行array_map()这比手动foreach()快得多。

$formData = array_map('mysql_real_escape_string', $_POST);

您甚至可以通过创建getPost()函数来封装此过程。

function getPost($key) {
    return array_key_exists($key, $_POST) 
        ? mysql_real_escape_string($_POST[$key]) 
        : null);
}

希望这有帮助。