PHP (int)用于MySQL查询中的变量.安全


PHP (int) for variables in MySQL query. Secure?

我使用以下方法MySQL查询:

$sql = "SELECT * FROM mytable WHERE `myTableId`=" . (int)$myId;

这是一个完全安全的方法,或者有一种方法注入一些sql与此方法的数据库?有更好的选择吗?

可能导致意想不到的后果,例如

$myId = 'blahblahblah';

将导致

... WHERE myTableId=0

在这种情况下可能不是什么大问题,但是如果(假设)您正在做一个权限系统,并且"super-dup -ultra-high-level-user-with-more-power-than-god"的权限级别为0,那么这是一个绕过安全性的好方法。

如果您真的想避免SQL注入,您最好的选择是使用PDO和预处理语句。查看http://www.php.net/pdo和http://www.php.net/manual/en/pdo.prepare.php

Thís应该被完美地保存,没有任何缺点,只要输入可以被强制转换为int。

让它像这样

$sql="select `username` from `users` where id='$newid';";
mysql_query($sql);

$newid是整型值。在用户名之前和之后使用的符号,要得到这个,你必须按esc下面的键。

我可能会用sprintf代替——但我看不出它和你正在做的有多大不同。将整数放在引号中也可能有所帮助。

$sql = sprintf("SELECT * FROM mytable WHERE `myTableId`='%d'", $myId);

应该补充一点,您可能希望处理转换为整数失败的情况。所以不要有表0

如果您只是担心mysql注入,则不需要Int。要防止mysql注入,可以使用mysql_real_escape_string。

如果您的mysql条件只针对int,那么您现在拥有的将阻止所有mysql注入,但如果情况如下:

$username = $_GET["username"];
SELECT * FROM customers WHERE username = '$username'

如果$username值是*''或1*你有麻烦了,或者我应该说你死了

如果$username值是*'';删除1或用户名= *的客户

使用mysql_real_escape_string

$username = mysql_real_escape_string($_GET["username"]);