问题:在任何已保存的输入字段上使用strip_tags并在任何显示的输出上运行htmlspecialchars以及使用
PHP PDO预处理语句阻止sql注入时,是否阻止XSS(跨站点脚本)变得简单?
这是一个例子:
// 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'); }
它更简单.只需在用户控制的输入上使用htmlspecialchars()(带引号样式和字符集)即可. strip_tags()仅在您希望在处理/保存数据库之前清理数据时才有用,这通常不会在现实世界中使用. HTML代码在PHP源代码中没有坏处,但是如果你在非消毒的用户控制输入或那种邪恶的东西上使用eval(),PHP代码可能会这样做.
原文链接:/php/138905.html然而,这并不能使你从SQL injections中解脱出来,但这是另一回事.
更新:要从请求中获取干净的用户输入以避免在用户控制的输入中使用magic quotes,您可以使用以下功能:
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");
(你可以为get_number,get_boolean,get_array等做simliar)
要准备SQL查询以避免SQL injections,请执行以下操作:
$sql = sprintf( "SELECT id FROM user WHERE username = '%s' AND password = MD5('%s')",MysqL_real_escape_string($user),MysqL_real_escape_string($password) );
echo htmlspecialchars($data,'UTF-8');