## SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。还有一种是通过system()或exec()命令注入的,它具有相同的SQL注入机制,但只针对shell命令。 ```php $username = $_POST['username']; $query = "select * from auth where username = '".$username."'"; echo $query; $db = new mysqli('localhost', 'demo', '‘demo', 'demodemo'); $result = $db->query($query); if ($result && $result->num_rows) { echo "<br />Logged in successfully"; } else { echo "<br />Login failed"; } ``` 上面的代码,在第一行没有过滤或转义用户输入的值(`$_POST['username']`)。因此查询可能会失败,甚至会损坏数据库,这要看$username是否包含变换你的SQL语句到别的东西上。 **防止SQL注入** * 1),使用mysql_real_escape_string()过滤数据 * 2),手动检查每一数据是否为正确的数据类型 * 3),使用预处理语句并绑定变量 * 4),使用准备好的预处理语句 * 5),分离数据和SQL逻辑 * 6),预处理语句将自动过滤(如:转义) * 7),把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题 ```php $query = 'select name, district from city where countrycode=?'; if ($stmt = $db->prepare($query) ) { $countrycode = 'hk'; $stmt->bind_param("s", $countrycode); $stmt->execute(); $stmt->bind_result($name, $district); while ( $stmt ($stmt->fetch() ){ echo $name.', '.$district; echo '<br />'; } $stmt->close(); } ```