SQL 삽입을 위해 PHP 배열 바인딩
P粉928591383
2023-08-08 15:51:43
<p>SQL 주입을 방지하기 위해 배열 바인딩(첫 번째 배열 바인딩) 시도</p><p>유효한 코드입니다:</p><p><br /> ;</p> ;
<pre class="lang-php Prettyprint-override"><code>if (isset($_POST['checkbox_selected']))
{
$valuesArr = 배열();
foreach ($_POST['checkbox_selected'] as $key => $value) {
//CSVOption 열의 행 번호를 찾기 위해 배열 ID를 검색합니다.
$findrow = array_search_partial($attributeid, $value);
//양식이 제출되면 속성 값이 속성 ID에 할당됩니다.
$속성 = $값;
$csv = $csvcolumn[$findrow];
$valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')";
}
$sql = "INSERT INTO 맵(user_id, Feed_id, attribute_id, csvcolumn) 값 ";
$sql .= implode(',', $valuesArr);
mysqli_query($conn,$sql);
}
<p>배열을 바인딩할 수 없습니다. 시도했습니다:</p>
<pre class="brush:php;toolbar:false;">$sql = "INSERT INTO 맵(user_id, Feed_id, attribute_id, csvcolumn) VALUES (?, ?, ? ,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('iiii', implode(',', $valuesArr));
$stmt->execute();
에코 내파(',', $valuesArr)
//('1', '1', '13', '9') //SQL에 삽입된 배열입니다.
//(user_id, Feed_id, attribute_id, csvcolumn) //첫 번째 문에 할당된 값은 다음과 같습니다</pre>
<p><br /></p>
두 가지 문제가 있습니다.
올바른 바인드 구문을 사용하고 있지 않습니다.
하나의 준비된 문에 여러 행을 삽입하려고 합니다
으아악단 하나의 작은 이점은 하나의 쿼리에 여러 VALUES()를 래핑하려고 하면 암시적 트랜잭션으로 래핑된다는 것입니다. 그러나 이 접근법의 다른 측면은 불리합니다. 바인딩/실행 루프를 래핑하는 트랜잭션을 명시적으로 열면 동일한 이점[오류 롤백, IO 일괄 처리]을 얻는 동시에 준비된 문의 이점[단일 단순 쿼리 구문 분석, 매개 변수화 등]도 활용할 수 있습니다.