通常,您会从表单中收集数据并将其插入数据库。
我知道mysql_real_escape_string()
用于消除威胁,但我想提供一种机制,它需要$ _POST并对其进行处理,以确保数据库的使用安全。
实现这一目标的理想和优雅方式是什么?简单地翻过post数组足以使数组安全吗?
答案 0 :(得分:3)
有时你知道某些东西必须是一个字符串,有时你知道它必须是一个整数。有时您知道它必须是一个电子邮件地址,有时您知道它必须是一个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();
?>
请注意,卡路里是一个int,而color是一个字符串。这是处理事情的更好方法。
这与filter_var
一起可以确保事情安全。
http://www.php.net/manual/en/filter.filters.sanitize.php和http://www.php.net/manual/en/filter.filters.validate.php描述了可用的不同过滤器。
答案 1 :(得分:2)
使用mysqli_real_escape_string和array_map
$_POST = array_map('mysqli_real_escape_string', $_POST);
如果你想对所有的查询字符串变量做同样的事情:
$_GET = array_map('mysqli_real_escape_string', $_GET);
答案 2 :(得分:-1)
我使用这2个功能:
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”不是递归的,你可以做得更好。 :)