是php网站只使用mysql SELECT安全从sql注入攻击

时间:2012-02-24 02:35:42

标签: php mysql sql-injection

我有一个网站使用数据库来存储网站用户的信息。所有mysql数据库调用都是SELECT。我使用$_GET在页面之间传递变量,然后在mysql SELECT调用中使用。我在任何代码中都不使用UPDATEINSERT

我是否需要担心SQL注入攻击? 我是否必须保护数据库免受其他类型的攻击?

我愿意阅读和学习。我只是不知道在这种情况下是否有必要。

我的数据库查询全部采用以下形式:

$leadstory = "-1";
if (isset($_GET['leadstory'])) {
  $leadstory = $_GET['leadstory'];
}

$query_News = "SELECT * FROM news WHERE lead_story = $leadstory";
$News = mysql_query($query_News, $HDAdave) or die(mysql_error());
$row_News = mysql_fetch_assoc($News);
$totalRows_News = mysql_num_rows($News);

前三行是否替换为:

$statement = $db_connection->prepare("SELECT * FROM news WHERE lead_story = ?;';");
$statement->bind_param("s", $leadstory);
$statement->execute();
$row_News = $statement->fetchAll();

$ totalRows_News的替代品是什么?

我是否还必须清理$ leadstory?

感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

Exploits of a Mom (XKCD)

我认为这是“是的”。

SELECT * FROM users WHERE name='hacker' or name='Admin' and '1'='1'

提供的名称为hacker' or name='Admin' and '1'='1

答案 1 :(得分:3)

是的,您必须担心SQL注入攻击。

使用PDOprepared statements来保护您的查询。

$stmt = $pdo->prepare('SELECT * FROM table WHERE id = ?');
$stmt->bindParam(1, $_GET['id']);
$stmt->execute();

$rows = $stmt->fetchAll();

答案 2 :(得分:-1)

简单回答,是的。如果sql语句的任何部分来自客户端的请求或表单提交,则需要清理/转义它。

使用PDO和预备语句,或mysql_real_escape_string()