2017-12-14 5 views
-3

ユーザまたはURLパラメータによって入力されたデータをフィルタリング/保護するときは、ちょっと混乱します。私はそれを入力と出力にフィルタリングする必要があります。または出力のみ?そして、もし私が出力だけでフィルターをかけると、データベースにデータを挿入している間、ユーザーがサーバー上でjavascriptなどを実行できるようになります。そして、それは異なっているべきですか?データベースの前または後のPHP/Mysqlデータのフィルタリング

// Secure the input/output 
function filter_data($data) { 
    $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); 
    $data = strip_tags($data); 
} 

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
$connect = mysqli_connect($servername, $username, $password, $db); // Create connection 

if(!$connect){ 
    echo "Error!!"; // Output error msg if connection fails. 
} 


// Data thats gone through validation, like string lenght, phone number only numbers etc. 
$name = filter_data($_POST['name']); 
$address = filter_data($_POST['address']); 
$tlf = filter_data($_POST['tlf']); 

// Inputting data 
$query = "INSERT INTO `CV` (NAME, ADDRESS, TLF) VALUES ('$name', '$address', '$tlf')"; 
mysqli_query($connect, $query); 
mysqli_close($connect); // Close the connection. 


// Selecting data 
$query = "SELECT * FROM `CV` ORDER BY `ID` DESC LIMIT 1"; 
$result = mysqli_query($connect, $query); 


// Output data 
while ($row = mysqli_fetch_assoc($result)) { 
     $name = filter_data($row["NAME"]); 
     $address = filter_data($row["ADDRESS"]); 
     $tlf = filter_data($row["TLF"]); 
} 

mysqli_free_result($result); // Free the result from memory. 
mysqli_close($connect); // Close the connection. 

echo $name; 
echo $address; 
echo $tlf; 
+0

まず、何がどのような状況で害を及ぼす可能性があるのか​​を特定します。そして、適切な対策を適用してください。データベースは、あなたが挿入する文字のどれかがHTMLで特別な意味を持つかどうかは気にしないので、その場所でhtmlspecialchars/strip_tagsは_wrong_になります。 strip_tagsはもちろん間違っています_everywhere_ - 私たちはここで入力したものにstrip_tagsを適用することは良いアイデアだと思っていたとしても、ここで最も基本的なコードの問題について議論することはできませんでした。 – CBroe

答えて

1

限り、あなたはParameterised Queries (Prepared Statements)を使用しているとして、あなたはあなたが実際に出力したいものを時間の経過とともに変化する可能性があるため、出力にフィルタだけにして(未編集)ソースデータを保持しなければならない、とあなたが入力にこれらの変更を行う場合あなたはオリジナルを失ってしまいます。

私が出力したものだけをフィルタリングすると、データベースにデータを挿入しているときに、ユーザがサーバ上でjavascriptなどを実行できるようになります。

このリスクを完全に無効にするためにデータを保存(入力)する場合は、Parameteried queriesを使用してください。

フィルタ機能はどういう違いがありますか?

フィルタリングしようとしているものに完全に依存します。選択はあなた次第です。 filter_dataはカスタム関数のように見えて、それを見ることはできません.....

関連する問題