问题:防止XSS(跨站点脚本)strip_tags
在任何已保存的输入字段上使用并htmlspecialchars
在任何显示的输出上运行...并使用PHP PDO预处理语句阻止SQL注入?
这是一个例子:
// INPUT: Input a persons favorite color and save to database // this should prevent SQL injection ( by using prepared statement) // and help prevent XSS (by using strip_tags) $sql = 'INSERT INTO TABLE favorite (person_name, color) VALUES (?,?)'; $sth = $conn->prepare($sql); $sth->execute(array(strip_tags($_POST['person_name']), strip_tags($_POST['color']))); // OUTPUT: Output a persons favorite color from the database // this should prevent XSS (by using htmlspecialchars) when displaying $sql = 'SELECT color FROM favorite WHERE person_name = ?'; $sth = $conn->prepare($sql); $sth->execute(array(strip_tags($_POST['person_name']))); $sth->setFetchMode(PDO::FETCH_BOTH); while($color = $sth->fetch()){ echo htmlspecialchars($color, ENT_QUOTES, 'UTF-8'); }
BalusC.. 8
它更简单.只需htmlspecialchars()
(带引号样式和字符集)用户控制的输入就足够了.的strip_tags()
,如果你已经想处理之前的数据消毒/保存在数据库中,这往往不是在现实世界中使用的是唯一有用的.HTML代码在PHP源代码中没有坏处,但如果您使用eval()
非消毒的用户控制输入或那种邪恶的东西,PHP代码可能会这样做.
然而,这并不能使您免于SQL注入,但这是另一个故事.
更新:要从请求中获取干净的用户输入以避免用户控制输入中的魔术引号,您可以使用以下函数:
function get_string($array, $index, $default = null) { if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) { return get_magic_quotes_gpc() ? stripslashes($value) : $value; } else { return $default; } }
可以用作:
$username = get_string($_POST, "username"); $password = get_string($_POST, "password");
(你可以为做simliar get_number
,get_boolean
,get_array
,等)
要准备SQL查询以避免SQL注入,请执行以下操作:
$sql = sprintf( "SELECT id FROM user WHERE username = '%s' AND password = MD5('%s')", mysql_real_escape_string($user), mysql_real_escape_string($password) );
要显示用户控制的输入以避免XSS,请执行以下操作:
echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
Gumbo.. 5
这取决于您希望使用用户数据的位置和方式.您需要知道要插入数据的上下文以及该上下文的元字符.
如果您只是想让用户在您的网站上放置文本,则htmlspecialchars
足以转义HTML元字符.但是,如果您想要允许某些HTML或想要将用户数据嵌入到现有HTML元素中(例如将URL插入到A
/ IMG
元素中),htmlspecialchars
仅仅因为您不在HTML上下文中而是在URL上下文中.
因此,输入图像URL字段将产生:
但进入javascript:alert("xss")
会成功:
在这里,您应该看看神奇的XSS(跨站点脚本)备忘单,以了解您的用户数据可以注入的上下文.
它更简单.只需htmlspecialchars()
(带引号样式和字符集)用户控制的输入就足够了.的strip_tags()
,如果你已经想处理之前的数据消毒/保存在数据库中,这往往不是在现实世界中使用的是唯一有用的.HTML代码在PHP源代码中没有坏处,但如果您使用eval()
非消毒的用户控制输入或那种邪恶的东西,PHP代码可能会这样做.
然而,这并不能使您免于SQL注入,但这是另一个故事.
更新:要从请求中获取干净的用户输入以避免用户控制输入中的魔术引号,您可以使用以下函数:
function get_string($array, $index, $default = null) { if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) { return get_magic_quotes_gpc() ? stripslashes($value) : $value; } else { return $default; } }
可以用作:
$username = get_string($_POST, "username"); $password = get_string($_POST, "password");
(你可以为做simliar get_number
,get_boolean
,get_array
,等)
要准备SQL查询以避免SQL注入,请执行以下操作:
$sql = sprintf( "SELECT id FROM user WHERE username = '%s' AND password = MD5('%s')", mysql_real_escape_string($user), mysql_real_escape_string($password) );
要显示用户控制的输入以避免XSS,请执行以下操作:
echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
这取决于您希望使用用户数据的位置和方式.您需要知道要插入数据的上下文以及该上下文的元字符.
如果您只是想让用户在您的网站上放置文本,则htmlspecialchars
足以转义HTML元字符.但是,如果您想要允许某些HTML或想要将用户数据嵌入到现有HTML元素中(例如将URL插入到A
/ IMG
元素中),htmlspecialchars
仅仅因为您不在HTML上下文中而是在URL上下文中.
因此,输入图像URL字段将产生:
但进入javascript:alert("xss")
会成功:
在这里,您应该看看神奇的XSS(跨站点脚本)备忘单,以了解您的用户数据可以注入的上下文.