PHP参数化SQL

PHP中写SQL,不使用PDO的话,如何不拼接SQL,从而避免注入攻击?

$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",
mysql_real_escape_string($Username),
mysql_real_escape_string($Password));
mysql_query($query);

or

$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=? AND password=?");
$stmt -> bind_param("ss", $user, $pass);
$stmt -> execute();

直接写sql的方式是一定没办法避免注入攻击的

我一般是在页面引入一个这样的文件

/**

  • 根据服务器配置信息来判断是否需要加反斜线
  • @param mixed $mixed
  • @since 2007/03/04 */ function __addslashes(&$mixed) { if (get_magic_quotes_gpc()) { return; } if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = addslashes($value); } } else { addslashes($mixed); } }

/**

  • 防止字符串中有SQL注入非法字符
  • (晕~又是一年) *
  • @param mixed $mixed
  • @since 2008/03/28 */ function __antiSQLInjection(&$mixed) { if (is_array($mixed)) { array_map('mysql_real_escape_string', $mixed); } else { mysql_real_escape_string($mixed); } }

__addslashes($_POST);
__antiSQLInjection($_POST);

__addslashes($_GET);
__antiSQLInjection($_GET);

http://zh.wikipedia.org/w/index.php?title=%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2&variant=zh-cn#PHP