可能重复:
在PHP中停止SQL注入的最佳方法
这是w3schools.org上的示例:
HTML表单:
<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>
Run Code Online (Sandbox Code Playgroud)
insert.php:
<?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)
?>
Run Code Online (Sandbox Code Playgroud)
我在这里读过其他帖子,但找不到直接的答案,因为大多数都要复杂得多.
编辑:我看了在PHP中停止sql注入的最佳方法,但我对如何修改这个有点困惑:
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $unsafeValue));
Run Code Online (Sandbox Code Playgroud)
假设我使用上面的html表单并希望将字段'firstname'中的数据插入到数据库中,它应该是这样的吗?或者我应该修改column
?:
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $firstname));
Run Code Online (Sandbox Code Playgroud)
sha*_*ruz 16
您提供的示例将post vars插入到数据库中,而不先分析它们是否为恶意用户输入.在使用类型转换,转义/过滤函数,预处理语句等与数据库交互之前,请使用它们.
要遵循的一般规则是永远不要相信用户输入.EVER!
在回答您的问题时,以下是使用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));
Run Code Online (Sandbox Code Playgroud)
如果您只想按照要求在记录中插入一列,则语法为:
$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');
$stmt->execute(':first_name', $first_name);
Run Code Online (Sandbox Code Playgroud)
也就是说HIGHLY容易受到SQL注入式攻击.
mysql_real_escape_string
我建议使用准备好的语句而不是使用.
归档时间: |
|
查看次数: |
25473 次 |
最近记录: |