重複の可能性:
PHP で SQL インジェクションを防ぐ方法は?
SQL インジェクションからの保護についていくつか質問したいと思います。私がこれまで読んできたものから、次の 3 つのことに出くわします。
- ストリップスラッシュ
- これは magic_quotes_gpc と組み合わせて使用されます
- mysql_real_escape_string (または、新しい php の mysqli だと思いますか?)
問題は、これらの両方を使用する必要があるか、または real_escape_string で十分かということです。
たとえば、登録ページに関連する次のコード行があります (sqli ヘルパーを使用すると、データベースに関するすべてを見つけることができるため、脆弱であることがわかっています:(上記のいずれもまだ実装していないため):
if(isset($_POST['submit'])){
//cleanup the variables
$username = ($_POST['username']);
$password = ($_POST['password']);
$email = ($_POST['email']);
$username = sanitise($username);
$password = sanitise($password);
$email = sanitise($email);
//quick/simple validation
if(empty($username)){ $action['result'] = 'error'; array_push($text,'Please type in a username'); }
if(empty($password)){ $action['result'] = 'error'; array_push($text,'Please type in a password'); }
if($action['result'] != 'error'){
$password = md5($password);
//add to the database
$add = mysql_query("INSERT INTO Users VALUES(NULL,'$username','$password','$email',0, 'First', 'Last', 'Phone Number Here', '...', 'Something about me...')");
if($add){
//get the new user id
$userid = mysql_insert_id();
//create a random key
$key = $username . $email . date('mY');
$key = md5($key);
//add confirm row
$confirm = mysql_query("INSERT INTO Confirm VALUES(NULL,'$userid','$key','$email')");
if($confirm){
//include the swift class
include_once 'swift/swift_required.php';
//put info into an array to send to the function
$info = array(
'username' => $username,
'email' => $email,
'key' => $key);
//send the email
if(send_email($info)){
//email sent
$action['result'] = 'success';
array_push($text,'Thanks for signing up. Please check your e-mail for confirmation.');
}else{
$action['result'] = 'error';
array_push($text,'Could not send confirmation e-mail');
}
}else{
$action['result'] = 'error';
array_push($text,'Confirm row was not added to the database. Reason: ' . mysql_error());
}
}else{
$action['result'] = 'error';
array_push($text,'User could not be added to the database. Reason: ' . mysql_error());
}
}
$action['text'] = $text;
}
?>
私のサニタイズ機能が役立つと思いました-オンラインで取得しましたが、少し役に立たないようです. あるいは、クロス サイト スクリプティングの防止に役立つだけかもしれません。ここにあります:
function cleanInput($input) {
$search = array(
'@<script[^>]*?>
.*?</script>@si', // Strip out javascript
'@<[\/\!]*?[^<>]*?>@si', // Strip out HTML tags
'@<style[^>]*?>.*?
</style>
@siU', // Strip style tags properly
'@<![\s\S]*?--[ \t\n\r]*>@' // Strip multi-line comments
);
$output = preg_replace($search, '', $input);
return $output;
}
function sanitise($input) {
if (is_array($input)) {
foreach($input as $var=>$val) {
$output[$var] = sanitise($val);
}
}
else {
if (get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
$input = cleanInput($input);
$output = $input;
}
return $output;
}
その機能が役に立たないことを示唆しますか?
もしそうなら、元のコードのビットを保護するにはどうすればよいですか? すなわち:
$username = ($_POST['username']);
$password = ($_POST['password']);
$email = ($_POST['email']);