2012-05-11 20 views
1

私はこのラインを持っている:SQLインジェクション:このラインは安全ですか?

$sql = "UPDATE votes SET up=up+1 WHERE id='{$p}'"; 

今から私はSQLインジェクションの一つの方法は、ハッカーは、追加の情報を追加することができ、適切ではない「クロージング」SQLクエリによって引き起こされる何を読んで。

up=up+1は私にとって安全ですが、私がこのように設定した場合、私にはそれが "閉鎖"されて動作しません。

ローアップタイプがint(11)の場合は違いがあります。

更新:

$pは、変数を介してユーザの入力を受け付けないので

function sanitize($foo) { 
if(get_magic_quotes_gpc() == true) { 
$foo = stripslashes($foo); 
} 
return mysql_real_escape_string(htmlspecialchars($foo)); 
} 
+1

このステートメントは、このステートメントの前に$ pが常に数字であることを確認する必要があることを除いて、かなり安全です。 –

+2

決して消毒しないでください。エスケープ。サニタイズは、攻撃のあらゆる可能な経路を知っており、特にそのためのフィルタリングに依存します。新しい攻撃経路が発見されると、あなたの機能は役に立たない。エスケープはすべての攻撃を処理します。 –

+1

SQLインジェクション攻撃が懸念される場合は、ストアドプロシージャとビューを使用してデータベースアクセスを制限する必要があります。つまり、特に$ pは関数によってチェックされているので、特定のクエリはかなり安全です。 –

答えて

4

up=up+1が脆弱でない関数で消毒されます。これは単にデータベース内にすでにある値をインクリメントしているだけです。INT

変数$pが適切に濾過し、エスケープされていない場合WHERE id='{$p}'しかし、脆弱である可能性がありますが、上記の追加として、それが機能することにより消毒されています。うまくいけば、関数sanitizeは、適切な型の変数(intまたはstringなど)をチェックし、その適切な境界をチェックするまでです。

いつものように、最も安全な方法は、SQL文字列に直接変数を渡すのではなく、準備済みのステートメントとパラメータ化されたクエリを使用することです。さまざまなRDBMSのためにPHPで利用可能なデータベースAPIのほとんどは、prepared statementをサポートしています。 (ただし、ではなく、mysql_*()関数)。

+0

私はop $ pが 'function sanitize $ foo){ if(get_magic_quotes_gpc()== true) { $ foo = stripslashes($ foo); } 返されるmysql_real_escape_string(htmlspecialchars($ foo)); } ' –

1

$pが適切にエスケープされていないと、安全ではありません。そうでなければ...

$ pを=想像「foo 'を;のDROP TABLE票; SELECT' 1" 次に、あなたのような何かを実行してしまうと思います

を:

UPDATE votes SET up=up+1 WHERE id='foo'; DROP TABLE votes; SELECT '1'; 

非常にきれいではないでしょう...

関連する問題