本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Best way to stop SQL Injection in PHP
这是w3schools.org上的示例:
HTML表单:
Firstname:
Lastname:
Age:
插入:PHP:
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo"1 record added";
mysql_close($con)
?>
我读过这里的其他文章,但找不到直接的答案,因为大多数都要复杂得多。
编辑:我研究了停止PHP中的SQL注入的最佳方法,但是我对如何修改这个有点困惑:
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $unsafeValue));
假设我使用了上面的HTML表单并希望将字段"firstname"中的数据插入数据库,它应该是这样的吗?还是应该修改column?:
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $firstname));
那么,你到底有什么问题?
我怎样才能保证这个方法的安全?
提供的示例将post var插入数据库,而不首先分析它们是否有恶意用户输入。在使用类型转换、转义/过滤函数、准备好的语句与数据库交互之前,请先使用它们。
要遵循的一般规则是从不信任用户输入。永远!
签出:停止PHP中的SQL注入的最佳方法
为了回答您的问题,下面介绍如何使用PDO准备的语句处理整个表单。
$stmt = $db->prepare('INSERT INTO Persons (FirstName, LastName, Age) VALUES (:first_name, :last_name, :age)');
$stmt->execute(array(':first_name' => $first_name,':last_name' => $last_name, ':age' => $age));
如果您只想按要求在记录中插入一列,则语法为:
$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');
$stmt->execute(':first_name', $first_name);
不。
这非常容易受到SQL注入攻击。
我建议使用准备好的语句,而不是使用mysql_real_escape_string。
好的,谢谢。有什么关于如何修改它以使其安全的提示吗?
你应该使用准备好的陈述。
使用mysql-real-escape-string。
$magic_quotes_active = get_magic_quotes_gpc();
$real_escape_string_exists = function_exists('mysql_real_escape_string');
function escape_value($sql) {
if ($real_escape_string_exists) {
if($magic_quotes_active) {
$sql = stripslashes($sql);
}
$sql = mysql_real_escape_string($sql);
} else {
if(!$magic_quotes_active) {
$sql = addslashes($sql);
}
}
return $sql;
}
这被认为是将数据插入数据库的一种非常安全的方法。使用返回的$sqlto作为查询!
为什么投反对票?这是由Nova Fabrica的作者实现的!novafabrica.com">
我没有投反对票——但要明确一点,这个函数只能用来转义一个值,而不能转义整个SQL字符串。
邓诺是诺瓦·法布里卡的作者,但他显然不知道
@弹片,大话,他很高兴成为凯文·斯科格伦德,是一名优秀的PHP程序员。你对他的功能有什么问题?
首先,我删除了这个不相关的链接。接下来,这个函数的主要问题是将魔术引号和转义字符串混合在一起。魔力引号是一个站点范围的问题,与SQL无关。它会破坏任何数据,而不仅仅是SQL字符串(例如cookie)。因此,尽管有任何SQL活动,但是必须在引导程序中关闭或去掉魔力引号。虽然mysql_real_escape_string的使用非常有限,但它只能用于转义SQL字符串。看,这是完全不同的事情,不能混为一谈。