SQL 쿼리에 사용자 입력을 수정하지 않고 삽입하면 응용 프로그램이 다음 예제와 같이 SQL injection에 취약해집니다.
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
사용자가 'value'; DROP TABLE;과 같은 것을 입력할 수 있기 때문에 다음과 같은 쿼리가 됩니다.
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
이런 일이 일어나지 않도록 어떻게 할 수 있을까요?
이를 위해서는 기본적으로 두 가지 옵션이 있습니다.
<! - 언어: > 랑 php -;
= $. $ 스트마트 pdo-> 예습이요 (& # 39 에서 일부 * # 39 명, 여기서 name = :name&;).
$ (어레이입니다 (& # 39, # 39, name& 실행하십시오 stmt->. = >. $ name));
포리치 ($ 스트마트 달러 정도로 행) { 뭔가 $ 로 행일 // }
<! - 언어: > 랑 php -;
= $. $ 스트마트 dbConnection-> 예습이요 (& # 39, & # 39 명, 일부 * 여기서 name = "에서). $ stmt->, bind_param (& # 39, s& # 39, $ name), # 39, & # 39, s& // type = > 가변적입니다 지정합니다. # 39, & # 39 string&.
$ stmt-> autoexec. ();;
$ result = $ stmt-> get_result ();; 반면 ($ 행일 = $ result->, fetch_assoc () { 뭔가 $ 로 행일 // }
참고로 '원산지 보호' 를 사용할 때 실제 MySQL 데이터베이스 액세스하려면 응벌을 문이 사용되지 않고 기본적으로 . 당신은 이 문제를 해결하려면 비활성화하려면 응벌을 에뮬레이션 명령문입니다. 예를 들어, 원산지 보호 연결을 만드는 사용할 수 있다.
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
위의 예에서 오류 모드 isn& , t # 39, 반드시 필요한 것이 추가할 필요가 있다고 권고했다. 이렇게 스크립트입니다 멈추지 않을 때 함께 '치명적 오류' 뭔가 잘못된. 또한 기회를 잡을 수 있는 '개발자' 투사 'n' 모든 오류 (s) 의 '페도렉세페시옹 있다.
그러나 첫 번째 '는 필수 지정하십시오. 스테트리부트 원산지 보호 및 활용' 선 () 에 에뮬레이션된 비활성화하려면 응벌을 명령문입니다 실제 응벌을 명령문입니다. 따라서 반드시 문, PHP, mysql 서버에 의해 분석되었다 aren& 값을 t # 39 로 보내기 전에 (확증하노라 가능한 공격자가 악성 SQL 투입할 수 있는 기회는 없다).
이 옵션은 구성자를 it& 문자세트 '를 설정할 수 있지만,' s # 39, & # 39, 중요한 점은 older& # 39. php 버전 (전에 5.3.6) 자동으로 무시됨 이 문자세트 매개변수입니다 에서 DSN.
'준비' 를 통해 전달했는지 SQL 문을 해석되어 컴파일됨 데이터베이스 서버. 지정하여 매개 변수 (즉 '?' 또는 'like' 라는 매개변수입니다 이름 위의 예에서) 네가 원하는 위치에 대한 데이터베이스 엔진은 필터링하려면. 이 때 보라그들은 전화하시기 실행하십시오 준비한 성명에서 ',' 가 결합된 매개 변수 값을 지정할 수 있습니다.
여기서 중요한 건 에로남이네 &prs. 값은 함께 컴파일됨 기술서임을 아닌 SQL 구체화하십시오. SQL 삽입 SQL 로 보낼 때 자신이 만든 작품 등 악성 문장열 스크립트입니다 데이터베이스입니까. 그래서 실제 SQL 보내는 별도로 매개변수입니다 전날에약혼자에게 제한값 기간말 up with t # 39, 당신이 didn& 위험이 있는 것이 특징이다.
그냥 보낼 것이라고 매개 변수를 사용할 때 준비한 성명에서 취급할 문장열 (단, 데이터베이스 엔진은 숫자로 물론 일부 최적화 할 수 있어 너무 매개변수입니다 끝날 수도 있다). 위의 예에서 변수 $ name ',' & # 39 Sarah& map_layer 경우 '# 39;; 그 결과 제공하십시오 문자열을 검색할 수 있는 '에서 삭제 됩니다, & # 39' " Sarah& # 39;;; Employees" 삭제할 수 없습니다. ', 그리고 다니엘을 와 빈 테이블이.
또 다른 장점은 여러 번 같은 경우 응벌을 사용하여 명령문입니다 에로남이네 실행하십시오 기술서임을 같은 세션에서 또 한 번 이벤트여야만 해석되고 컴파일됨 확증하노라 좀 속도 향상.
아, 그리고 이후 묻는 질문에 "어떻게 할 수 있습니다, 예를 들어 삽입하십시오 here& # 39 의 대한 (사용 원산지 보호):
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array('column' => $unsafeValue));
계속 사용할 수 있지만, 구조 자체에 대한 응벌을 명령문입니다 쿼리하지 매개변수입니다 쿼리하지 동적임 就不可能拥有 매개 변수화 쿼리하지 및 특정 기능을 매개 변수화 수 없습니다.
이 경우 가장 먼저 할 일이 화이트리스트 거르개 제한한 것은 특정 시나리오용으로 사용 가능한 값.
// Value whitelist
// $dir can only be 'DESC', otherwise it will be 'ASC'
if (empty($dir) || $dir !== 'DESC') {
$dir = 'ASC';
}
사용 중단 경고: 이 답변'의 샘플 코드(질문'의 샘플 코드처럼)는 PHP 5.5.0에서 더 이상 사용되지 않고 PHP 7.0.0에서 완전히 제거된 PHP'의 'MySQL' 확장을 사용한다.
보안 경고: 이 답변은 보안 모범 사례와 맞지 않습니다. SQL 주입을 방지하는 데는 이스케이프가 적합하지 않습니다, 대신 excape 문을 사용합니다. 아래에 요약된 전략을 사용하십시오. 또한 'mysql_real_escape_string()'은 PHP 7에서 제거되었습니다.
최신 버전의 PHP를 사용하는 경우 아래에 요약된 'mysql_real_escape_string' 옵션을 더 이상 사용할 수 없습니다(그러나 'mysqli:::escape_string'은 현대의 등가임). 오늘날 'mysql_real_escape_string' 옵션은 이전 버전의 PHP에서만 사용할 수 있다.
'unsafe_variable'의 특수 문자를 이스케이프하거나 매개 변수화된 쿼리를 사용하는 두 가지 옵션이 있습니다. 둘 다 SQL 주입으로부터 당신을 보호할 것이다. 매개 변수화된 쿼리가 더 나은 방법으로 간주되지만, 사용하기 전에 PHP에서 새로운 MySQL 확장으로 변경해야 합니다.
우리는 충격이 낮은 문자열이 먼저 탈출하는 것을 커버할 것입니다.
//Connect
$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);
mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
//Disconnect
또한 'mysql_real_escape_string' 함수의 세부 정보를 참조하십시오.
파라미터화된 쿼리를 사용하려면 MySQL 함수 대신 MySQLi를 사용해야 합니다. 당신의 예시를 다시 작성하기 위해서는 다음과 같은 것이 필요합니다.
<?php
$mysqli = new mysqli("server", "username", "password", "database_name");
// TODO - Check that connection was successful.
$unsafe_variable = $_POST["user-input"];
$stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");
// TODO check that $stmt creation succeeded
// "s" means the database expects a string
$stmt->bind_param("s", $unsafe_variable);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
여기서 읽고 싶은 주요 기능은 'mysqli::prepare'입니다.
또한 다른 사람들이 제안한 바와 같이 PDO와 같은 추상화 단계를 밟는 것이 유용하거나 더 쉬워질 수 있습니다.
문의하신 사례는 상당히 간단한 사례이며, 더 복잡한 경우에는 더 복잡한 접근 방식이 필요할 수 있습니다. 특히:
여기에 모든 대답에 닫히지만 부분만 문제. 사실, 그 중 4 쿼리하지 에셋을 동적으로 추가할 수 있는 여러 가지 부품을. -
그리고 그 중 2 개만 응벌을 명령문입니다 빽이라는.
하지만 가끔 동적이거나, 운영자 또는 추가 식별자입니다 쿼리하지 lionbridge 수 있도록 해야 더 잘 알려져 있다. 따라서 다른 보호 기술을 할 것입니다.
일반적으로 이러한 보호 화이트리스팅 외곽진입 기반으로 하고 있다.
이 경우 모든 동적 매개변수입니다 코딩된 한다는 것을 스크립트에서 및 사탄들 설정되었습니다. 예를 들어, 동적임 실행하십시오 오더할:
$orders = array("name", "price", "qty"); // Field names
$key = array_search($_GET['sort'], $orders)); // See if we have such a name
$orderby = $orders[$key]; // If not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM `table` ORDER BY $orderby"; // Value is safe
그러나 다른 방법이 안전한 식별자입니다 - 탈출이라니요. As long as you 식별자입니다 이스케이프입니다 박트릭스 인사이드라면 저들이요 배로 늘려 말을 할 수 있습니다
한 단계 더 선명한 사용하는 것이 진정한 빌릴 수 있고, 일부 자리표시자 (a 가상본 표현하기 위해 실제값 질의 (query)) 을 임의로 자리표시자 prepared statements 와 다른 유형의 - 식별자입니다 자리표시자.
따라서 긴 얘기를 할 수 있는 파선-짧은: a # 39 의 it& 자리표시자 아닌 준비한 성명에서 비호환성의 은제 탄환 고려될 수 있다.
그래서 권장안을 표현한 것으로, 일반적으로 수 있습니다.
그래도 문제가 여러_키워드 SQL 구문 (예 '와', '설명' 등), 그러나 이 경우 슬픔으로창백해지고 목록 외곽진입 유일한 것 같다.
아직은 관한 일반협정 (best practice 는 관한 몇 가지 잘못된 사례를 sql 인젝션 보호 well. 너무 깊이 뿌리를 둔 게 그 중 일부는 여전히 많은 것으로 마음을 php 특징이다. 예를 들어, 페이지 여기있을 매우 많다. (단, 보이지 않는 가장 방문자가) - 80 개 이상의 모든 답변을 통해 제거된 폐기됩니다 커뮤니티 잘못되어 품질 또는 프로모션한 나쁜거라 구식 사례. 그러나 일부 # 39 더 나쁜 것이 아니라, 번영, 삭제된 aren& 대답이 없다.
예를 들어, 좁히어 (1) 있다 (2) 그래도말야 (3) 많은 (4) 답변 (5), 두 번째로 업보테드 오토메이티드 시사하는 등 너회가 수작업식 구체화하십시오 탈출이라니요 - 오래된 외곽진입 이미 검증된 스크램블된 아니다.
또는 조금 더 나은 방법이 바로 대답할 제안됩니다 또 다른 방법은 구체화하십시오 서식, 심지어 궁극적인 파나시아냐 정보기술 (it) 을 자랑하고 있다. 물론 이 방법은 보다 없는 동안 것은 그 모든 포맷, 그러나 그것은 일반 문자열이어야. 계속 반복된다. 이 같은 것일 뿐, 다른 모든 포맷, it& 문장열 적용할 수 있는 수동 측정 비 의무, 인간의 실수로 발생하기 옵션임 # 39 에 기본적으로 어떤 종류의.
내 생각에 아주 오래된 미신 때문에, 당국은 이를 지원하는 등 이 모든 1 등 [OWASP] [8] 또는 [PHP 수작업식] [9], 평등, escaping" 사이에 있는 있는모든 " 선포한다. sql 에서 및 보호 주사를 놓아.
Owasp 및 사용자 입력에 대한 전적인 백업이었습니다 때문에 더욱 악화시키고 있다고 탈출이라니요 어떤 말도 안되는소리: 분사 보호 등 측면에서 단어들은요 없어야 합니다. 잠재적으로 위험한 가변입니다 관계없이 모든 소스! 즉, 모든 변수 또는 제대로 넣을 수 있다 - a 로 포맷되었습니다 qeury - 상관 없이 소스를 다시. # 39 의 it& 대상 중요한 역할을 하는. 개발자 분리하십시오 에서 시작하는 순간 양 염소 (사고, 특정 표시할지를 가변입니다 " safe". 자신이 방관하겠나) 은 자신의 / 그녀의 첫 번째 단계로서 생명이다. 물론 할 수 있는 말을 인용, 매우 비슷하게 진입점이 제안됩니다 불크 탈출이라니요 선수단 매직 더 이상 사용되지 않으며, 이미 처량하 기능-전에는 재거됨.
, 는 측정, 그래서 있는모든 " 달리, escaping" 응벌을 명령문입니다 랑하니 보호하시나 있는 에서 SQL 인젝션 (해당하는 경우).
[8]: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet # Defense_Option_4:_Escaping_All_User_Supplied_Input [9]: http://php.net/manual/en/function.mysql-real-escape-string.php # refsect1-function.mysql-real-escape-string-description
I'd는 PDO(PHP Data Objects)를 사용하여 매개 변수화된 SQL 쿼리를 실행할 것을 권장합니다.
이것은 SQL 주입으로부터 보호할 뿐만 아니라 쿼리 속도를 높입니다.
mysql_ysql_ysqltod 및 'pgsql' 함수가 아닌 PDO를 사용하여 데이터베이스 공급자를 전환해야 하는 드문 경우이긴 하지만 애플리케이션을 데이터베이스에서 조금 더 추상화할 수 있습니다.
알 수 있듯이, 사람들이 사용하는 제안하세요 응벌을 명령문입니다 많아야. 하지만 it& # 39 의 경우 한 번만 , 질의입니다 틀리지 csetup 프로세스 당 성능이 약간 응벌을 일은 없을 것이다.
그는 이 문제를 해결할 방법이 매우 정교한 평면가공 근데 그 - 운행에서어떠한 인용 부호를 사용하는 해커 방지하기 위해 사용합니다. 내가 함께 이를 활용한 에뮬레이션된 응벌을 명령문입니다. SQL 인젝션 공격을 막기 위해 가능한 모든 종류의 i use it.
그러므로, 예를 들어, 질의:
SELECT password FROM users WHERE name = 'root'
될 것이다.
SELECT password FROM users WHERE name = 0x726f6f74
또는
SELECT password FROM users WHERE name = UNHEX('726f6f74')
Hex 가 완벽한 이스케이프입니다. 무리라구 했다.
그래서 마지막으로 의견을 분명히 하려는 일부 분야의 있었다. 이러한 두 가지 접근 방식은 매우 유사한 있지만 이들은 몇 가지 면에서 조금 다릅니다.
참고로 이 hex 표시됨과 SQL 인젝션 공격을 자주 사용되는 방법은 바로 '을 (를)' 와 마찬가지로 문장열 이스케이프된 mysql_real_escape_string 정수 creditbank. 있다. 그럼 견적 사용을 피할 수 있다.
예를 들어, 그냥 뭔가 다음과 같습니다.
"SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])
>. 선택합니다. 여기서 id = -1 연합 (eu) 에서 모두 선택 table_name information_schema.tables
이젠 그냥 푸십시오 테이블 구조:
>, 선택합니다. 여기서 id = - 1 에서 선택할 수 있는 모든 column_name information_schema.column 0x61727469636c65 table_name = 연합
다음 데이터를 스맥랜드의 수준들과 있는모든 선택하면 됩니다. # 39 멋지다, isn& t it?
만일 한 사이트가 구축되면 hex it 기반 부호화 주사약, 아니 분사 약간만이라도 때문에 가능한 것이라고 쿼리하지 다음과 같습니다. '를 선택합니다. 여기서 id = 운헤스 (& # 39, 2d312075.3635& # 39;) '
>. 보안 경고 : 이 대답 없는 맞춰 보안 모범 사례. [탈출이라니요 가 되는 것을 막기 위해 SQL 인젝션] (https://paragonie.com/blog/2015/05/preventing-sql-injection-in-php-applications-easy-and-definitive-guide) 을 사용하여 prepared statements 한다. 현재 자신의 전략을 사용하여 아래 아웃라인된 위험. (또한, '에서 제거한 mysql_real_escape_string ()' 는 php 7.)
>. 중요 >. >. Sql 인젝션 막기 위한 가장 좋은 방법은 탈출이라니요 응벌을 명령문입니다 대신 사용할 수 있다 [이 수락됨 오토메이티드] (https://stackoverflow.com/a/60496/2224584) 보여준다. >. >. [루이지스크라] 등 몇 가지 라이브러리보다는 (https://github.com/auraphp/Aura.Sql) 및 [이시드브] (https://github.com/paragonie/easydb) 개발자가 사용할 수 있는 준비된 명령문입니다 간편해집니다. 왜 더 잘 준비된 문이 대한 자세한 내용은 [중지 SQL 인젝션] (https://paragonie.com/blog/2015/05/preventing-sql-injection-in-php-applications-easy-and-definitive-guide) 인 [mysql_real_escape_string () '이' 우회] (https://stackoverflow.com/a/12118602/2224584) 및 [최근 고정식입니다 유니코드 SQL 인젝션 취약점을 WordPress] (https://kraft.im/2015/05/how-emoji-saved-your-sites-hide/).
분사 예방 - mysql_real_escape_string ()
PHP 는 이러한 공격을 막기 위해 특별히 만든 함수를. All you need to do 는 함수 mysql_real_escape_string ',' 한 모금 마실래 사용합니다.
mysql 에서 사용할 수 있는 '는' mysql_real_escape_string 문자열으로 진행 과정은 모두 포함된 SQL 인젝션 같은 문자열 쿼리하고 반품하십시오 시도_횟수 안전하게 이스케이프된. 기본적으로 문제가 있는 따옴표 (& # 39;) 그 대신 사용됩니다 사용자가 수신기마다 mysql 안전하다구요 \& 이스케이프된 쿼트에 문제지고 대체하십시오 입력할 수 있는 # 39;.
Mysql 접속되어야 //
$name_bad = "' OR 1'";
$name_bad = mysql_real_escape_string($name_bad);
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />";
$name_evil = "'; DELETE FROM customers WHERE 1 or username = '";
$name_evil = mysql_real_escape_string($name_evil);
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
echo "Escaped Evil Injection: <br />" . $query_evil;
더 자세한 내용을 확인할 수 있습니다 MySQL - SQL 인젝션 예방 .
다음과 같은 기본적인 작업을 수행할 수 있습니다.
$safe_variable = mysqli_real_escape_string($_POST["user-input"], $dbConnection);
mysqli_query($dbConnection, "INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
이것이 모든 문제를 해결하지는 못하지만, 매우 좋은 디딤돌이다. 변수의 존재 여부, 형식(숫자, 글자 등) 확인과 같은 명백한 항목은 생략했습니다.
>. 보안 경고 : 이 대답 없는 맞춰 보안 모범 사례. [탈출이라니요 가 되는 것을 막기 위해 SQL 인젝션] (https://paragonie.com/blog/2015/05/preventing-sql-injection-in-php-applications-easy-and-definitive-guide) 을 사용하여 prepared statements 한다. 현재 자신의 전략을 사용하여 아래 아웃라인된 위험. (또한, '에서 제거한 mysql_real_escape_string ()' 는 php 7.)
패라메트릭화 쿼리하고 입력 검증 방식으로 돼요. Sql 인젝션 경우에도 발생할 수 있는 여러 가지 시나리오를 mysql_real_escape_string () '에서' 사용되어 왔다.
이러한 예제를 SQL 인젝션 노출되기 쉽습니다.
$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");
또는
$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");
출처: 예상치 못한 SQL 인젝션 (탈출이라니요 충분하지 않을 때)
제 생각에는, 일반적으로 SQL 인젝션 막을 수 있는 가장 좋은 방법은 PHP 응용 프로그램 (또는 모든 웹 애플리케이션에서 중요한) 는 application& 대한 생각 # 39 의 아키텍처입니다. Sql 인젝션 방지할 수 있는 유일한 방법인 경우 특별한 기능을 사용할 수 있는 방법 또는 높여줍니까 너희에게베풀어진 것이 올바른 일을 할 때마다 데이터베이스에 틀렸다니까 잘못하고 있어. # 39 에 불과 몇 시간 전까지 이쪽요, it& 제대로 기억나지 않는 어떤 시점에서 코드에 쿼리하지 포맷합니다.
Mvc 패턴을 적용한 같은 프레임워크입니다 CakePHP 또는 코드이그나이터 가 옳은 길을 갈 것이다. 데이터베이스 보안 등 그동안 해결되며 이러한 일반적인 작업을 생성 쿼리합니다 집중식으로 구현됩니까 프레임워크와도. 그들은 도움말에서는 웹 응용 프로그램에 대해 좀 더 합리적인 방법으로 구성할 수 있습니다) 에 대한 보다 안전하게 건설 및 저장 객체에는 랑하니 무리는너희들이 로드중 단일 sql 질의입니다.
내가 좀 저장 프로시저 (MySQL 5.0 이후 그동안 저장 프로시저 지원부에서는) 에서 보안 관점 - 이점은 -
이 단점이 있다.
Sql 주사를 놓아 방지 및 기타 여러 가지 방법으로 SQL hacks. (구글 검색) 이 인터넷에서 쉽게 찾을 수 있습니다. 물론 그 중 하나는 바로 优秀 solutions. 원산지 보호 제안하겠습니다 좀 좋은 링크 (cdc) 에서 sql 인젝션.
그리고 일부 같은 다른 방지 및 SQL 인젝션 MySQL 과 PHP .
I would like to let you know. 왜 우리는 방지를 위한 시도하시겠습니까 SQL 인젝션 수신기마다 파선-짧은 예:
로그인 인증 쿼리하지 일치:
$query="select * from users where email='".$_POST['email']."' and password='".$_POST['password']."' ";
이제 누군가 (해커인가) 은
$_POST['email']= [email protected]' OR '1=1
및 암호란이 없다.
이 시스템에 재장착합니다 에는 최대 쿼리하지 적립율은 분석되었다.
$query="select * from users where email='[email protected]' OR '1=1';
다른 부분에서는 삭제됩니다. 그래서 어떤 일이 벌어질까? 권한이 없는 사용자가 (해커) 그의 / 그녀의 암호란이 관리자로 로그인하도록 않고도 수 있을 것으로 보인다. 이제 아무것도 할 수 있는 사람은 자신이 할 수 있는 관리자 / 이메일 확인, SQL 인젝션 막을 경우, 아주 위험한 it&. # 39 아니다.
Php 와 MySQL 데이터베이스 서버 또는 다른 누군가 사용하기를 원한다고 생각한다.
원산지 보호 -
>. - 아니 자리표시자 - 지금은 SQL 인젝션! , # 39 의 나쁜거라 It&
$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values ($name, $addr, $city)");
>. - 이름 없는 자리표시자
$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values (?, ?, ?);
>. - Release. 자리표시자
$request = $pdoConnection->("INSERT INTO parents (name, addr, city) value (:name, :addr, :city)");
미스크리 -
$request = $mysqliConnection->prepare('
SELECT * FROM trainers
WHERE name = ?
AND email = ?
AND last_login > ?');
$query->bind_param('first_param', 'second_param', $mail, time() - 3600);
$query->execute();
이 전투를 부드럽게를 원산지 보호 승. 12 개 지원 포함) 다른 데이터베이스 드라이버 및 release. 매개변수입니다 무시하시겠습니까 수 있습니다 작은 성능 분실 및 apiu 곧 적응할 수 있다. 한 보안 개발자가 안전하다고 볼 때, 두 명은 deltamove 활용한다 방식으로 사용할 수 있어야 하고
반면, 원산지 보호 및 미스크리 모두 매우 빠르다 미스크리 향상합니다 있다. 2.5% 의 속도를 벤치마크 하찮게 비 준비 ~ 6.5%, 그리고 ~ 제표를 응벌을 수준들과.
그리고 제발 테스트 # 39 의 더 나은 방법은 it& 쿼리하지 데이터베이스에 대한 모든 것을 injection. -
스케쳐내 캐시하지 활용할 수 있도록 같은 엔진, [레디스] [1] 또는 메맥체트, 아마 달mp 선택할 수 있다. 미스크리 순결케 사용한다. 확인할 수 있습니다. 달mp PHP, MySQL 데이터베이스 추상화 계층을 사용하여
[1]: http://en.wikipedia.org/wiki/Redis_% 28data_store% 29
사용하는 방법을 잘 모르는 사람들을 위해 원산지 보호 (오는 'mysql_' 기능), I made a 아주, 아주 단순해졌습니다 원산지 보호 래퍼 즉 하나의 파일. 이 얼마나 쉽게 할 수 있는 모든 일반적인 표시하십시오 셨으며 애플리케이션을 작동할 수 있어야 합니다. Mysql, PostgreSQL, SQLite 와 함께 사용할 수 있습니다.
기본적으로, 그것을 읽은 [읽을 때 수작업식] (http://php.net/pdo) 를 사용할 수 있도록 원산지 보호 기능을 간편하게 전환할 수 있는 방법을 실제로 값을 읽어들입니다 저장소에만 형식으로 사용자가 원하는 것.
>. I want a single column) >. >. = $ 카운트입니다 db 열 (& # 39, select count () 에서 '사용자'); >. >. I want 어레이에서는 (키 = >. 값) 결과 (즉 만들기 위해 셀레스트로스) >. >. = $ 쌍을 db 페어 (& # 39 를 선택한 sername '에서' id ',' 사용자 '); >. >. I want 단일 행일 결과: >. >. $ user = db 행일 (& # 39, 일부 에서 '사용자' 어디서 ',' & # 39, 어레이입니다? id = ($ user_id)); >. >. I want 배열입니다 결과 >. >. = $ banned_users db 페치할 (& # 39, 일부 * 에서 '사용자' & # 39, 여기서 '금지', 어레이입니다 (true) = ").
Php 를 이 함수 () '에서' mysql_escape_string 좋은 예방 빠르게 얻을 수 있습니다.
예를 들면 다음과 같습니다.
SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'
mysql_escape_string 이스케이프합니다 문자열으로 mysql_query 사용하기 위해 '-'
자세한 예방, 마지막에 추가할 수 있습니다.
wHERE 1=1 or LIMIT 1
마지막으로 다음을 얻을 수 있습니다.
SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
Sql 의 특수 문자를 위한 몇 가지 지침을 탈출이라니요 명령문입니다.
수동으로 탈출이라니요 특수 문자를 문자열으로 mysqli_real_escape_string 기능을 사용할 수 있습니다. 이 기능은 제대로 작동하지 않는다면 올바른 글자셋 설정되었습니다 와 mysqli_set_charset.
예:
$mysqli = new mysqli('host', 'user', 'password', 'database');
$mysqli->set_charset('charset');
$string = $mysqli->real_escape_string($string);
$mysqli->query("INSERT INTO table (column) VALUES ('$string')");
의 값을 사용하여 자동 탈출이라니요 지침하고 명령문입니다 mysqli_prepare 및 mysqli_stmt_bind_param 여기서 유형에 해당하는 바인딩하지 com/go/4e6b330a_kr 제공되어야 합니다 적절한 변환:
예:
$stmt = $mysqli->prepare("INSERT INTO table (column1, column2) VALUES (?,?)");
$stmt->bind_param("is", $integer, $string);
$stmt->execute();
아무리 응벌을 명령문입니다 또는 mysqli_real_escape_string 사용하는 경우, 당신은 항상 입력 데이터를 you& # 39, re 작업 유형을 알고 있어야 합니다.
그래서 준비한 성명에서 유형을 사용하는 경우, 함수 mysqli_stmt_bind_param 변수를 지정해야 합니다.
사용 및 mysqli_real_escape_string 캐비닛용입니다 이름으로, 특수 문자, 그렇게 하지 않는다』 고 탈출이라니요 문자열으로 정수 금고에도요 이 기능은 SQL 문을 부수는 목적을 위해, 그리고 문자열과 데이터베이스입니까 손상을 일으킬 수 있다는. 유용한 기능을 제대로 사용할 경우, 특히 mysqli_real_escape_string 가 결합하면, 스프링스프.
예:
$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5
$integer = '99999999999999999999';
$query = sprintf("SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string($string), $integer);
echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647
이 문제를 해결할 수 있는 적절한 권한을 부여하는 데이터베이스입니까 간단한 대안이 될 수 있다. 예를 들면 다음과 같습니다. mysql 데이터베이스를 입력하고 사용하는 경우 데이터베이스에 털미널 또는 UI 를 통해 제공 및 그냥 다음의 명령:
GRANT SELECT, INSERT, DELETE ON database TO username@'localhost' IDENTIFIED BY 'password';
이 지역에 있는 사용자가 지정한 query& 주얻진 제한하게 되므로 # 39 에 그쳤다. 그래서 데이터 삭제 권한을 분리하십시오 PHP 호출이네요 발사된 쿼리하지 삭제될 수 없다는 것이다 두 번째 일을 할 수 있도록 해야 할 것은 권한을 플러시하려면 MySQL 갱신율 사용 권한 및 업데이트.
FLUSH PRIVILEGES;
자세한 내용은 플러시합니다.
현재 사용자의 권한으로 볼 수 있습니다 다음 불지옥의 질의입니다.
select * from mysql.user where User='username';
허가합니다 에 대한 자세한 정보.