PHP安全性、intval和htmlspecialchars 用户:

PHP安全性、intval和htmlspecialchars 用户:,php,mysql,security,Php,Mysql,Security,你能在上面的代码中看到任何威胁吗?我必须在输出的所有内容上使用htmlspecialchars吗?我应该使用is_numeric还是intval来检查get是否为数字 我只是在建一个最小的网站。我只是想知道上面的代码是否容易受到sql注入的攻击,xss?一般来说是首选,但因为它是一个数字,所以可以。所以,是的,从安全角度来看,它看起来还可以 但有一件事是,在许多平台上,整数被限制为32位,因此,如果你想处理大于21亿的数字,那么它将不起作用。好吧,不管怎样,它都不会像你期望的那样起作用 这些类型

你能在上面的代码中看到任何威胁吗?我必须在输出的所有内容上使用htmlspecialchars吗?我应该使用is_numeric还是intval来检查get是否为数字

我只是在建一个最小的网站。我只是想知道上面的代码是否容易受到sql注入的攻击,xss?

一般来说是首选,但因为它是一个数字,所以可以。所以,是的,从安全角度来看,它看起来还可以

但有一件事是,在许多平台上,整数被限制为32位,因此,如果你想处理大于21亿的数字,那么它将不起作用。好吧,不管怎样,它都不会像你期望的那样起作用

这些类型的安全预防措施适用于任何形式的用户输入,包括cookies(许多人忘记了这一点)。

您正在将接收到的id转换为int;所以这里没有可能的SQL注入。
DB查询的其余部分是“硬编码的”,因此也没有问题

如果id是DB中的字符串,则必须使用,但对于整数,
intval
是正确的工具:-)


关于输出,您也在转义数据(并且,在输出HTML时,htmlspecialchars是可以的);所以没有HTML/JS注入


因此,这段代码在我看来还行:-)


顺便说一句,如果你开始开发一个新网站,现在是时候或者永远不要去看(而不是mysql)和/或;-)


它将允许您使用最新版本的MySQL提供的功能性,例如,这是保护您免受SQL注入的好方法

我强烈建议使用PDO和准备好的语句。虽然上面的语句看起来很安全,但一旦执行更复杂的查询,就会出现问题

与其对特定查询是否安全感到困惑,不如了解准备好的语句,这样您就不必担心了。以下是使用PDO重新编写的示例:

<?php

$id = intval($_GET['id']);

 $sql = mysql_query("SELECT username FROM users WHERE id = $id");
 $row = mysql_fetch_assoc($sql);

$user = htmlspecialchars($row['username']);

?>

<h1>User:<?php echo $user ?></h1>

我添加了很多评论;它不像看上去那么多代码。当您使用
bindValue
时,您永远不必担心SQL注入。

未签名的int最多将是+-40亿个。PHP int被签名。PHP中没有未签名的整数。如果它是字符串呢?我必须转义字符串吗?不。当使用
bindValue()
时,不需要转义字符串。像
mysql\u real\u escape\u string
这样的函数对于在PHP拥有现代数据库API之前防止SQL注入非常重要。PDO不再需要它,只要您使用
bindValue
,并且不尝试手动将用户输入连接到$sql字符串中。换句话说,用简单的方法来做。:-)
# Make a database connection
$db = new PDO('mysql:dbname=your_db;host=your_db_server', 'username',
    'password');

# The placeholder (:id) will be replaced with the actual value
$sql = 'SELECT username FROM users WHERE id=:id';

# Prepare the statement
$stmt = $db->prepare($sql);

# Now replace the placeholder (:id) with the actual value. This
# is called "binding" the value. Note that you don't have to
# convert it or escape it when you do it this way.
$stmt->bindValue(':id', $id);

# Run the query
$stmt->execute();

# Get the results
$row = $stmt->fetch();

# Clean up
$stmt->closeCursor();

# Do your stuff
$user = htmlspecialchars($row['username']);