当前位置:  开发笔记 > 编程语言 > 正文

阻止XSS和SQL注入就像这样容易

如何解决《阻止XSS和SQL注入就像这样容易》经验,为你挑选了2个好方法。

问题:防止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(跨站点脚本)备忘单,以了解您的用户数据可以注入的上下文.



1> BalusC..:

它更简单.只需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');



2> Gumbo..:

这取决于您希望使用用户数据的位置和方式.您需要知道要插入数据的上下文以及该上下文的元字符.

如果您只是想让用户在您的网站上放置文本,则htmlspecialchars足以转义HTML元字符.但是,如果您想要允许某些HTML或想要将用户数据嵌入到现有HTML元素中(例如将URL插入到A/ IMG元素中),htmlspecialchars仅仅因为您不在HTML上下文中而是在URL上下文中.

因此,输入图像URL字段将产生:


但进入javascript:alert("xss")会成功:


在这里,您应该看看神奇的XSS(跨站点脚本)备忘单,以了解您的用户数据可以注入的上下文.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有