Is this a secure method to insert form data into a MySQL database?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Best way to stop SQL Injection in PHP
这是w3schools.org上的示例:
HTML表单:
1 2 3 4 5 6 7 8 9 10 11 12 | <html> <body> <form action="insert.php" method="post"> Firstname: <input type="text" name="firstname" /> Lastname: <input type="text" name="lastname" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> </body> </html> |
插入:PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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注入的最佳方法,但是我对如何修改这个有点困惑:
1 2 3 | $preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStatement->execute(array(':column' => $unsafeValue)); |
假设我使用了上面的HTML表单并希望将字段"firstname"中的数据插入数据库,它应该是这样的吗?还是应该修改
1 2 3 | $preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStatement->execute(array(':column' => $firstname)); |
提供的示例将post var插入数据库,而不首先分析它们是否有恶意用户输入。在使用类型转换、转义/过滤函数、准备好的语句与数据库交互之前,请先使用它们。
要遵循的一般规则是从不信任用户输入。永远!
签出:停止PHP中的SQL注入的最佳方法
为了回答您的问题,下面介绍如何使用PDO准备的语句处理整个表单。
1 2 3 | $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)); |
如果您只想按要求在记录中插入一列,则语法为:
1 2 3 | $stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)'); $stmt->execute(':first_name', $first_name); |
不。
这非常容易受到SQL注入攻击。
我建议使用准备好的语句,而不是使用
使用mysql-real-escape-string。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $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; } |
这被认为是将数据插入数据库的一种非常安全的方法。使用返回的