2010-02-18 75 views

回答

2

检查你从它得到的值。

发送一些文字,应该逃避,如Ed O'Neil(应该回来为Ed O''NeilEd O\'Neil

+0

这会好吗? $ post = $ _GET ['post']; \t \t 如果(is_numeric($交)) \t { \t \t $交= mysql_real_escape_string($交); \t} \t别的 \t { \t \t模具( “淘气NAUGHTY”); \t} \t \t mysql_select_db(“*******”,$ ******); \t \t $ content = mysql_query(“SELECT * FROM tbl _ ***** WHERE Id ='”。$ post。“'”); – 2010-02-18 14:28:51

+0

在我看来,如果is_numeric($ post)为true,$ post不需要转义,因为它已经是一个数字了。不过,仔细检查一下也不会受伤。 – Powerlord 2010-02-18 14:34:13

+0

如果我期望一个数值,我通常只使用“SELECT foo FROM bar WHERE baz =”。 (INT)$ foo的;如果该值不是数字,则返回0,从而导致(通常取决于查询)空结果集,并且其他数字将被除去所有非数字字符(请参阅手册中的整型转换行为)。对于插入/更新,必须进行验证,因为0可能不总是正确。优点是:比转义短得多,并使其他人阅读代码时明白其为数字。关于速度:不确定那里,但我认为它可能比逃跑更快。 – dbemerlin 2010-02-18 15:11:21

1

创建一个单元测试,将它应该逃避所有字符,并检查其输出。

但是: 为什么不简单地在PDO中使用参数化查询? 像:

$dbh = new PDO([...]); 
$sth = $dbh->prepare("SELECT foo FROM bar WHERE baz=:baz"); 
$sth->execute(array(":baz" => $mybaz)); 

这是最安全的方式,并感谢PDO它几乎和Perl一样容易。

1

要扩大什么'河。 Bemrose'提供,这里有一些示例代码可以做到这一点。一定要用你自己的替换mysql凭据。

<?php 
// Connect 
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') 
    OR die(mysql_error()); 

$user = "Ed O'Neil"; 
$password = "SQL_INJECTION ';'alter table xyz';"; 

// Query 
$query_safe= sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      mysql_real_escape_string($user), 
      mysql_real_escape_string($password)); 

// Query 
$query_not_safe= sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      $user, 
      $password); 

echo $query_safe."\n"; 
echo $query_not_safe; 

?> 
相关问题