2010-02-18 80 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; 

?> 
相關問題