2013-03-27 3 views
0

누구든지 도움을 줄 수있다. 내부 보안 메시징 서비스를 위해 PHP에 전달 된 값에 mysql_real_escape_string을 사용하여 보안을 강화하려고 시도하고 있지만 값이 데이터베이스에 삽입되지 않아 어딘가에서 구문을 잘못 가져야합니다. 나는 튜토리얼, 도움 등을 둘러 보았지만 올바르게하기 위해 애를 썼다.mysql_real_escape_string으로 고생하다

내가 사용하는 코드는 다음과 같습니다. 이스케이프되지 않은 값 ($ email, $ from, $ time)은 올바르게 입력되었지만 다른 값은 그냥 공백으로 입력됩니다.

<?php 
session_start(); 
$conn = mysqli_connect('localhost', 'username', 'password', 'dbname'); 

$email=$_SESSION['email']; 
$to = $_POST ['touser']; 
$toemail = $_POST['touseremail']; 
$from = $_SESSION['name']; 
$message = $_POST['message']; 
$subject = $_POST['subject']; 
$time = time(); 

$query ="INSERT INTO messages 
(to_user, to_email, subject, message, from_user, from_email, daterecord) 
VALUES (
'" . mysql_real_escape_string($conn, $to) . "', 
'" . mysql_real_escape_string($conn, $toemail) . "', 
'" . mysql_real_escape_string($conn, $subject) . "', 
'" . mysql_real_escape_string($conn, $message) . "', 
'$from', '$email', '$time')"; 
$send = $conn -> query($query); 

echo "Message sent!"; 

?> 
+5

보안 강화 = mysql_real_escape_string을 사용하지 않고 [* prepared statements *] (http://j.mp/T9hLWi)를 사용하십시오. – Kermit

+1

이 함수는 더 이상 사용되지 않습니다. 사용하지 마십시오. – meagar

+4

[MySQL] (http://www.php.net/manual/en/book.mysql.php) ≠ [MySQLi] (http://www.php.net/manual/en/book.mysqli.php) – Gumbo

답변

0

이 발생하는 실제 문제는 당신이 mysql 확장과 mysqli 확장 사이에 혼합하고 있다는 점이다.

mysqli_connect()을 사용하는 경우 사용하는 모든 DB 기능은 mysqli_이어야합니다.

실제로 원하는 기능이 mysqli_real_escape_string 일 때 mysql_real_escape_string을 사용하고 있습니다.

i은 매우 중요합니다.

그러나 실제로 설명한 문제를 넘어 설 수있게하려면 이스케이프 된 쿼리에서 벗어나 매개 변수가있는 쿼리를 사용하는 것이 좋습니다.

SELECT fieldname from talbe WHERE arg = ? AND arg2 = ? 

다음 mysqli_bind_param()를 사용하여 변수들 ?의 대체 :

매개 변수화 쿼리는 다음과 같이 쿼리를 지정할 수있는 기술이다.

이 기술은 이스케이프 문자열을 사용하는 것보다 훨씬 좋은 기술로 간주됩니다.

희망이 있습니다.

1

요즘 문자열을 탈출하기위한 선호하는 방법이 있음을 알아 두셔야합니다.
수정하여 더 잘 작동합니다!

관련 문제