因此,通常您会从表单中收集数据并将其插入数据库。
我知道这mysql_real_escape_string()
是用来消除威胁的,但我想提供一种机制,它接受 $_POST 并对其进行处理,使其对数据库使用安全。
实现这一目标的理想而优雅的方式是什么?简单地浏览后数组是否足以使数组安全?
因此,通常您会从表单中收集数据并将其插入数据库。
我知道这mysql_real_escape_string()
是用来消除威胁的,但我想提供一种机制,它接受 $_POST 并对其进行处理,使其对数据库使用安全。
实现这一目标的理想而优雅的方式是什么?简单地浏览后数组是否足以使数组安全?
有时你知道某些东西必须是字符串,有时你知道它必须是整数。有时您知道它必须是电子邮件地址,有时您知道它必须是 4 个字符长的字符串。
mysql 扩展当然已被弃用,并且已经有一段时间了。PHP 文档说:
不建议将此扩展用于编写新代码。相反,应该使用 mysqli 或 PDO_MySQL 扩展。在选择 MySQL API 时,另请参阅 MySQL API 概述以获得更多帮助。
PDO 是在 PHP 中使用 MYSQL 的“正确”方式。如果由于某种原因不行,请使用 mysqli。但是,只需使用 PDO。
从文档:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>
请注意,卡路里是一个整数,颜色是一个字符串。这是处理事情的更好方法。
这结合起来filter_var
可以确保事情是安全的。
http://www.php.net/manual/en/filter.filters.sanitize.php和http://www.php.net/manual/en/filter.filters.validate.php描述了可用的不同过滤器。
使用 mysqli_real_escape_string 和 array_map
$_POST = array_map('mysqli_real_escape_string', $_POST);
如果你想对所有查询字符串变量做同样的事情:
$_GET = array_map('mysqli_real_escape_string', $_GET);
我使用这两个功能:
function getMySQLString($string) {
global $link;
/* Si esta activaldo el magic quotes, saco los caracteres de escape */
if (get_magic_quotes_gpc()) {
$string = stripslashes($string);
}
/* Armo el string. */
return mysqli_real_escape_string($link, $string);
}
function toSecureArray($array) {
$result = Array();
/* Recorro todas las llaves del campo */
$keys = array_keys($array);
foreach ($keys as $key_id => $value) {
if (!is_array($array[$value]))
$result[$value] = getMySQLString($array[$value]);
}
return $result;
}
“toSecureArray”不是递归的,你可以让它变得更好。:)