이 질문은 많은 많은 시간 전에 요청 받았다.
은 PDO를 사용하는 것이 좋습니다,하지만 당신은 mysql_로 * LIB를 사용하는 경우, 다음과 같이 그것을 :
이 매개 변수에 대한 이스케이프
다음 코드 보안 100 % :
$var = mysql_real_escape_string($_POST['var']);
$query = "SELECT * FROM table1 WHERE afield = '$var' "
// You must quote your $vars ^^
// failure to do so defeats the escaping and causes syntax errors.
코드 SQL 주입을 동일하게 수행 할 필요가 없습니다.
안전하지 않은, 이것은 당신이 데이터베이스, 테이블 및 열을 확인할 필요가 작동하지 않습니다
$afield = mysql_real_escape_string('$_POST['var']);
$query = "SELECT * FROM table1 WHERE `$afield` = 1 "
//You can only use escaping for values, never for dynamic SQL.
작동하지 않습니다
이 코드는 동적 열/테이블 이름을 이스케이프 화이트리스트에 대한 이름. 해싱 및
당신은 암호를 소금에 절인 해시를 사용 염장에 대해 동적 SQL
$allowed_fields = array('field1', 'field2');
$afield = $_POST['afield'];
if (in_array($afield, $allowed_fields)) {
$query = "SELECT * FROM table1 WHERE `$afield` = 1";
}
에 대한
100 % 안전.
암호화되지 않은 암호를 데이터베이스에 저장하는 대신 해시 된 암호를 저장하는 것이 좋습니다.
무지개 테이블을 물리 칠려면 해쉬를 다른 세미 무작위 소금으로 소금을 만들어야합니다. 소금은 비밀 일 필요가 없으며 단지 무작위적일 필요가 있습니다.
//To add a user.
INSERT INTO users (name, salt, passhash)
VALUES ('$username', '$salt', SHA2(CONCAT('$salt','$password'),512));
//To check a password:
SELECT u.id FROM users u
WHERE u.name = '$username'
AND passhash = SHA2(CONCAT(salt, '$password'),512);
//To change a password:
UPDATE users u SET passhash = SHA2(CONCAT(s.salt, '$newpassword'),512)
WHERE u.id = (SELECT u2.id FROM (
SELECT u1.id FROM users u1
WHERE u1.name = '$username'
AND passhash = SHA2(CONCAT(u1.salt, '$oldpassword'),512) u2) s
도 참조 : 쿼리의
How to prevent SQL injection with dynamic tablenames?
How does the SQL injection from the "Bobby Tables" XKCD comic work?
How can I prevent SQL injection in PHP?
대신 [PDO] (http://php.net/manual/en/book.pdo.php)를 시도하십시오 –
세 번째 접근 방식에서 배정 난제의 근거는 무엇입니까? o_O – Tomalak
@Tomalak, 그것은 많은 눈의 원칙입니다. 데이터가 할당 될 때마다 확인됩니다 :-) – Johan