php - 在php中输入卫生

标签 php mysql sql-injection

我知道 sql 注入(inject)已经在 stackoverflow 上讨论过很多次了。

使用这种方法有什么缺点

foreach($_POST as &$value)
    $value = mysql_real_escape_string($value);

只有两行,使用起来似乎很方便,但我认为这不是一个非常常用的方法。

请不要将讨论变成准备好的陈述和 PDO,即使它可能应该被视为最佳实践。

最佳答案

使用此代码的主要缺点是您要修改 POST 数组中的数据。这可能会影响稍后对 POST 数组的操作(例如输出到屏幕)。这也可能导致混淆,如果您正在与其他程序员一起工作,他们可以合理地期望 POST 数组保持不变。由于前面的原因,它也可能使代码维护更加困难。处理代码的任何人都需要知道您修改了 POST 数组。

我的建议是,如果您打算使用 mysql_real_escape_string 而不是参数化查询,请确保将其与 sprintf 和正确的类型说明符结合使用,如下所示:

$query = sprintf("INSERT INTO purchases (amount, num_items, prod_descrip) 
                    VALUES (%f, %d, '%s')",
                    mysql_real_escape_string($_POST['amount'])
                    mysql_real_escape_string($_POST['num_items'])
                    mysql_real_escape_string($_POST['prod_descrip']));

请注意,%f 适用于 float ,%d 适用于整数,%s 适用于字符串值。另请注意,我直接在查询字符串中使用 $_POST 数据,没有进行任何类型的验证,我在实践中不会这样做(只是为了简单起见)。

关于php - 在php中输入卫生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137795/

相关文章:

php - CakePhp 渲染空白 View

php - 如何忽略 PHP 中准备好的 mysqli 查询中的参数?

MySQL 数据库优化 - 我有一个包含大量重复项的消息表

asp.net - 在 MVC 中控制 SQL 注入(inject)

postgresql - 在 PostgreSQL 中使用 LIKE '%a%' 同时针对 SQL 注入(inject)清理数据

C# 程序集注入(inject)检查

javascript - 使用 php 提交表单

php - 您的系统缺少扩展名 gd - laravel composer Update

mysql - 如何将整个 MySQL 数据库字符集和排序规则转换为 UTF-8?

MYSQL:仅更新非空字段的最充分方法?