フォームの検証が必要です。簡単な解決策では、空のフィールドを db に保存できず、SQL インジェクションを防ぐことができません。
簡単な解決策:
$fname = isset($_POST['firstname']) and nameIsValid($_POST['firstname'])
? $_POST['firstname'] : false;
$lname = isset($_POST['lastname']) and nameIsValid($_POST['lastname'])
? $_POST['lastname'] : false;
if (false === $fname or false === $lname) {
// report about not valid form fields
} else {
$dsn = 'mysql:dbname=yourdb;host=yourhost;charset=utf8';
$dbh = new PDO($dsn, 'user', 'pass');
$sql = "UPDATE profile SET first = :fname, last = :lname WHERE id = :id";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':fname' => $value, ':lname' => $lname, ':id' => $id));
}
/**
* Validation names for empty values
*
* @param string $name First name or last name
* @return bool
*/
function nameIsValid($name) {
return '' !== $name;
}
ただし、 XSS-injectionに注意してください。たとえば、誰かがあなたの db Fist 名で保存できます:
<script>alert('Woohoo! You have vulnerability!');</script>
次回、ユーザーの名を印刷すると、全員に脆弱性に関するメッセージが表示されます:)
"asfyua23807*^2#"、"-2*&%$9837239askHF"、または XSS インジェクションなどの名前を許可しない、より厳密な検証規則を実装することを決定できます。この場合、nameIsValid()
関数を変更する必要があります。
安全な解決策:
/**
* Validation names and prevent XSS-injections
*
* @param string $name First name or last name
* @return bool
*/
function nameIsValid($name) {
$pattern = '/^[\.a-z-]+$/i';
return (bool) preg_match($pattern, $name);
}
このロジックは、 Az を含む名前を許可します。- シンボル: J.Jameson、Jackson- Piterson、JOHn、smIthなど。より厳密な検証ルールについては、公式 PHP 正規表現マニュアルを確認してください。